我的目标是优化我的应用程序代码。我的代码如下所示:
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。那是因为自动拳击吗?
4.)为什么m.put(第一,a)工作?因为我传递的是原始变量,而map的put()只接受Object。
自动装箱。
int会自动转换为整数,反之亦然(在这种情况下可能会出现NullPointerException)
3.)为什么编辑器给Integer添加了不必要的装箱。
因为你不需要写这段代码。编译器会帮你做的。
它通常更具可读性
2.)如果代替Map,如果有任何类似HashTable的数据结构,那么大小写是相同的???
是的,在JDK集合中,仅适用于对象。这意味着必须对基元类型进行装箱。它有一个小的运行时成本和巨大的内存开销。整数比整数占用的内存大约多300%。
你逃不了。避免装箱开销的唯一方法是使用专门的集合,如GNU trove,它为每个基元类型提供一个类。只有在计划将数百万个基本元素存储到集合中时才有用。
最后,永远不要写新的整数(x)。我nteger.value(x)做同样的事情,但它维护一个内部缓存,以避免为一些常用的值创建新的实例。
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)
将产生trueInteger.valueOf(1000)==Integer.valueOf(1000)
将产生falsenew intger(1)==new intger(1)
将产生false,因为此处不使用缓存
2.)如果不是Map,而是HashTable之类的数据结构,那么???
你为什么要问这个?有HashTable
,但是因为它是同步的,所以它意味着比HashMap
更多的开销,所以除非你需要同步,否则如果你需要排序,请坚持使用HashMap
或TreeMap
。
3.)为什么编辑器给整数不必要的拳击。
这可能只是因为可读性(a
比Integer.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的任何问题或文档中说明的任何相关问题。如何将其翻译为匿名课程? 我的怀疑是: …我不知道这怎么可能。乍一看,我想表达的是: