当前位置: 首页 > 知识库问答 >
问题:

方法调用无效的新整数(int)构造函数;使用整数。改为valueOf(int)

冯嘉荣
2023-03-14

我的目标是优化我的应用程序代码。我的代码如下所示:

int a = 10;
Map<String , Integer> myMap = new TreeMap<>();

myMap.put("first" , new Integer(a)); //[FindBugs] Method com.abc.xyz.Test.main(String[]) invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead 

当我在Netbeans中使用Findbugs进行静态分析时,它显示了一个类似于“方法调用无效的新整数(int)构造函数;使用Integer.valueOf(int)”的警告/错误。

我知道新整数(int)和整数之间的区别。valueOf(int)。

一个创建一个附加对象,另一个不创建。一个不缓存,另一个缓存。

所以我这样修改了我的代码...

m.put("first" , Integer.valueOf(a)); // Unnecessary boxing to Integer

但同样,这也给出了“不必要的整型装箱”的警告(由编辑器而不是findbugs)。

所以,我又把它改成这样。。。。

m.put("first" , a); //No warning at all...

这最终没有给出任何警告。

我的问题是:

1.)此链接表明内部(通过编译器)m.put("first", a);正在m.put转换("first", Integer.valueOf(a));

(在这个例子中,有一个列表ArrayList,这里我们有Map TreeMap…仅供参考)。那么为什么编辑会给出警告呢?我该怎么办?优化的方式是什么?

2.)如果不是Map,而是HashTable之类的数据结构,那么???

3.)为什么编辑器给Integer添加了不必要的装箱。

4.)为什么m.put(“第一”,a)有效?因为我传递的是原语变量和map的put()only accept Object。那是因为自动拳击吗?

共有2个答案

白腾
2023-03-14

4.)为什么m.put(第一,a)工作?因为我传递的是原始变量,而map的put()只接受Object。

自动装箱。

int会自动转换为整数,反之亦然(在这种情况下可能会出现NullPointerException)

3.)为什么编辑器给Integer添加了不必要的装箱。

因为你不需要写这段代码。编译器会帮你做的。

它通常更具可读性

2.)如果代替Map,如果有任何类似HashTable的数据结构,那么大小写是相同的???

是的,在JDK集合中,仅适用于对象。这意味着必须对基元类型进行装箱。它有一个小的运行时成本和巨大的内存开销。整数比整数占用的内存大约多300%。

你逃不了。避免装箱开销的唯一方法是使用专门的集合,如GNU trove,它为每个基元类型提供一个类。只有在计划将数百万个基本元素存储到集合中时才有用。

最后,永远不要写新的整数(x)。我nteger.value(x)做同样的事情,但它维护一个内部缓存,以避免为一些常用的值创建新的实例。

傅博容
2023-03-14

1.)此链接表明内部(通过编译器)m.put("first", a);正在m.put转换("first", Integer.valueOf(a));

(在这个例子中,有一个列表ArrayList,这里我们有Map TreeMap…仅供参考)。那么为什么编辑会给出警告呢?我该怎么办?优化的方式是什么?

是的,编译器知道m.put(“first”,a)只接受对象,因此应用自动装箱。在性能方面,使用自动装箱或写入Integer。valueOf(a)不会有任何区别。

另一方面,newinteger(a)并不比Integer慢。(a)的值。不同之处在于,对于较小的绝对值(默认值为-128到127)Integer。valueOf(a)将使用缓存,即不会一直创建新对象。对于所有其他值,它将调用新整数(a)

例子:

Integer.valueOf(1)==Integer.valueOf(1)将产生true
Integer.valueOf(1000)==Integer.valueOf(1000)将产生false
new intger(1)==new intger(1)将产生false,因为此处不使用缓存

2.)如果不是Map,而是HashTable之类的数据结构,那么???

你为什么要问这个?有HashTable,但是因为它是同步的,所以它意味着比HashMap更多的开销,所以除非你需要同步,否则如果你需要排序,请坚持使用HashMapTreeMap

3.)为什么编辑器给整数不必要的拳击。

这可能只是因为可读性(aInteger.valueOf(a)短)。

4.)为什么m.put(“第一”,a)有效?因为我传递的是原语变量和map的put()only accept Object。那是因为自动拳击吗?

见1

 类似资料:
  • 问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是

  • 我正在用Android编写一些Junit测试,如果我这样做: 我得到一个不明确的方法调用错误。 方法调用不明确:AssertEquals(int,int)和AssertEquals(Object,Object)都匹配 然而,如果我这样做: 它起作用了。我觉得第二个函数应该做完全相同的事情。 这是怎么回事?

  • 问题内容: 我在应用中使用Retrofit 2.0。一切都很好,但是当我开始不带参数的请求时,GSON返回: 这是我的API接口: 和模型类: 和代码片段: 我试图为GetPhones.class制作无参数的构造函数,但它没有任何改变。 问题答案: 接口()和模型类()的名称相同。 我认为您正在此行中使用接口: 但这应该是您的模型类。检查导入部分是否有此名称,或重命名模型类以确保您没有将其混合。

  • 在以下示例中,我尝试将引用方法与表达式一起使用: 输出 但是我在方法中得到的只是一个包含空元素的数组,表达式难道不应该创建一个具有指定大小的数组,并为每个元素调用类的构造,就像在方法中使用表达式时发生的那样吗?

  • 本文向大家介绍c++ 构造函数中调用虚函数的实现方法,包括了c++ 构造函数中调用虚函数的实现方法的使用技巧和注意事项,需要的朋友参考一下 我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数。这种调用都是对象已经构建完成的情况。那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: 输出: 0 1 2 也就是说,在构造函数中调用虚函数,调用的是正在构造的类中的虚函

  • 问题内容: 不久前,我遇到了比我更好的竞争性答案,我的答案是使用全新的方法代替lambda。 我查看了有关方法引用的Oracle规范,并定义了4种类型: 引用静态方法 引用特定对象的实例方法 引用特定类型的任意对象的实例方法 引用构造函数 我很难将这一分类。我还没有找到关于SO的任何问题或文档中说明的任何相关问题。如何将其翻译为匿名课程? 我的怀疑是: …我不知道这怎么可能。乍一看,我想表达的是: