关于java中==操作和.equals()函数的有趣讨论
2016-04-03 22:54
274 查看
首先,==和.equals()函数的区别,简单说来,就是==比较的是两个变量是否引用的同一个变量,而.equals()比较的是两个变量值是否相同,也就是变量的”内容“。即,如果两个变量值相同,但是他们引用的是两个不同地址的变量,那么前者返回false,而后者返回true。
有趣的是如下两段程序
<pre name="code" class="html"> Integer i1,i2;
i1 = 1;
i2 = 1;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
对于第一段,输出为true,true,而对于第二段,输出为false,true。
之所以会有这样的区别,原因在于,在执行程序的过程中,程序会创建变量的缓冲池,当i2用“i2=1”语句赋值时,程序会在缓冲池中先找寻相同的对象,此时由于i1也使用“i1=1”赋值,使得程序找到了相同的对象,于是使用该对象创建了i2,于是i1,i2不仅具有相同的值,他们也是同一个对象的引用。
而对于第二段程序,i2采用new赋值,这就告诉程序,我要创建一个新的对象,用这个新的对象来创建i2。此时,尽管i1,i2具有相同的值,但是他们却不是相同对象的引用,于是导致输出是false,true。
有趣的是如下两段程序
<pre name="code" class="html"> Integer i1,i2;
i1 = 1;
i2 = 1;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
Integer i1,i2; i1 = 1; i2 = new Integer(1); System.out.println(i1==i2); System.out.println(i1.equals(i2));
对于第一段,输出为true,true,而对于第二段,输出为false,true。
之所以会有这样的区别,原因在于,在执行程序的过程中,程序会创建变量的缓冲池,当i2用“i2=1”语句赋值时,程序会在缓冲池中先找寻相同的对象,此时由于i1也使用“i1=1”赋值,使得程序找到了相同的对象,于是使用该对象创建了i2,于是i1,i2不仅具有相同的值,他们也是同一个对象的引用。
而对于第二段程序,i2采用new赋值,这就告诉程序,我要创建一个新的对象,用这个新的对象来创建i2。此时,尽管i1,i2具有相同的值,但是他们却不是相同对象的引用,于是导致输出是false,true。
相关文章推荐
- Jvm以及Jvm性能参数优化
- Java并发:await/wait 与sleep、yield间的区别
- servlet api简介(一)
- Spring源码分析篇01——Resource
- java classLoader体系结构使用详解
- java虚拟机自动内存管理机制
- 20145204《Java程序设计》第5周学习总结
- 20145321 《Java程序设计》第5周学习总结
- Java并发机制之Volatile关键字
- 20145225《Java程序设计》 第5周学习总结
- Step by Step into Spring (AOP)
- jdk8——Stream API
- 【jdk1.8】PriorityQueue源码分析
- 20145109 《Java程序设计》第五周学习总结
- java多线程调用 单例类中一个的方法
- 20145201 《Java程序设计》第五周学习总结
- 20145227 《Java程序设计》第5周学习总结
- 20145235 《Java程序设计》第5周学习总结
- Java的Integer缓存
- JavaEE中向数据库写入数据乱码的问题