Integer i2=100 与 Integer i3=100 的比较以及String实例的联想
来源:互联网 发布:itunes软件许可协议 编辑:程序博客网 时间:2024/05/16 09:20
先来看一段代码
public class IntegerDemo01 {public static void main(String[] args) { Integer i2 =100; Integer i3 =100; System.out.println(i2==i3); Integer i4 =1000; Integer i5 =1000; System.out.println(i3==i4); }}
以上输出是true 还是false呢?
其中第一个是true ,第二个是false。初学者就会对这个答案产生疑问。为啥会出现这个情况呢?
先通过反编译 查看一下到底编译器是怎么处理这行代码的?
import java.io.PrintStream;public class IntegerDemo01 { public IntegerDemo01() { } public static void main(String args[]) { Integer i2 = Integer.valueOf(100); Integer i3 = Integer.valueOf(100); System.out.println(i2 == i3); Integer i4 = Integer.valueOf(1000); Integer i5 = Integer.valueOf(1000); System.out.println(i3 == i4); }}
从上面代码可以得知,编译器引用变量的定义和初始化中使用到了Integer.valueOf()方法,这个valueOf()是干嘛用的呢?
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) //如果数值在-128~127之间的 return IntegerCache.cache[i + (-IntegerCache.low)]; //返回 return new Integer(i); }
来看这段代码的描述
* Returns an {@code Integer} instance representing the specified
{@code int} value.,
返回了这个Integer的含有指定的值的实例
* as this method is likely to yield significantly better space and time performance by
* 显着更好的空间和时间性能
* caching frequently requested values.
- 这个方法返回了一个带有值的实例,
- 然后返回了一个从-128~127的值的缓存数组,用于缓存在这个范围内所有创建的实例对象。
- 如果之前有存在就直接拿来用,不存在的话就新建new 一个Integer对象。
有人会联想到String类型,因为String的实例有时候也是这么赋值的。那么编译器在背后有没有进行转化呢?看一下代码?
String str = "abc"; String str2 ="abc"; System.out.println(str==str2); String str3 = new String("abc"); String str4 = new String("abc"); System.out.print(str3==str4);
如上的结果第一个是true ,第二个是false。第一个是在常量池中去查找是否有没有这个abc这个值,有的话,直接进行引用。没有的话,再在常量池中创建。所以第一个的引用变量他们的地址都相同的,因此为true。
第二个用到了new,这个单词告诉了编译器 直接在堆内存中给我开辟了一个空间,不管之前是否有存在。因此,尽管值也一样,但是它们引用的地址是不一样的。因此为false。
再来看一下编译器是否有将String的实例构建进行某些转换?
String str = "abc"; String str2 = "abc"; System.out.println(str == str2); String str3 = new String("abc"); String str4 = new String("abc"); System.out.print(str3 == str4);
发现没有任何操作,没有偷着我们干了什么事。
建议,如果要判断包装类的对象是否相等,最好用equals()方法.
以上大体想法来源于知乎专栏 -java那些事
- Integer i2=100 与 Integer i3=100 的比较以及String实例的联想
- Integer与int的==比较
- 解析String与Integer的==
- Integer与Integer间的比较
- Integer的 == 比较
- String 和integer的用==比较细节
- Integer与int的比较
- Integer与int的比较
- Integer与int的比较
- Integer与int的比较
- Integer与int的比较
- Integer与int的比较
- Integer与int的比较
- integer与int的比较
- Integer与int的比较
- Integer与int的比较
- Int与Integer的比较
- Integer与int的比较
- Android5.0 6.0 7.0新特性
- 总结:详细讲解MapReduce过程(整理补充)
- Java GC垃圾回收机制
- Tomcat在Linux上的安装与配置
- 汪国新监督员参加最高人民法院特约监督员工作座谈会
- Integer i2=100 与 Integer i3=100 的比较以及String实例的联想
- linux内核中2410_gpio_cfgpin函数分析
- 8.2学长讲解(数论入门)
- caffe中的layers
- 设计模式--如何学习设计模式
- 【自考】第一遍快速阅读C++程序设计
- 再谈快速排序
- 清华大学操作系统实验准备--挖坑
- linux中如何使用find命令查找文件