实践是检验真理的唯一标准
计算机科学某种程度上是一种实践性的学问,空谈是不产生价值的,只有深入场景、解决真实问题、创造客户价值的时候才是真正有价值的。
关于java中的”==”和equals 大家都知道
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址(String,Date,Integer等一般都重写了);
这段代码大家可以看一下,以下代码都是基于java写的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public static void main(String[] args) { Integer a = 100 ; Integer b = 100 ; System.out.println( "1 a==b " + (a == b)); System.out.println( "2 a==b " + (a.equals(b))); Integer a1 = 321 ; Integer b1 = 321 ; System.out.println( "3 a1==b1 " + (a1 == b1)); System.out.println( "4 a1==b1 " + (a1.equals(b1))); } |
大家思考一下输出结果是什么,结果为什么会是这样?Integer a = 100;这种写法本身包含了一个什么玄机?
好了公布一下答案:
1 2 3 4 | 1 a==b true 2 a==b true 3 a1==b1 false 4 a1==b1 true |
是不是和您认为的有出入呢?为什么第一个是true,而第三个是false呢?根据本人目前的了解java还不能获取对象的内存地址(不借助第三方工具),有的同学说用hashcode,首先hashcode只是对象的一个标识和地址是无关的 其次equals被重写了,hashcode这个时候也是一样的。
看着很诡异是不是,我们借助工具可以看到反编译后的代码是这个样子的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public static void main(String[] args) { Integer a = Integer.valueOf( 100 ); Integer b = Integer.valueOf( 100 ); System.out.println( "1 a==b\t" + (a == b)); System.out.println( "2 a==b\t" + a.equals(b)); Integer a1 = Integer.valueOf( 321 ); Integer b1 = Integer.valueOf( 321 ); System.out.println( "3 a1==b1\t" + (a1 == b1)); System.out.println( "4 a1==b1\t" + a1.equals(b1)); } |
哦,这个地方java帮我们自动做了一个类型转换从int,通过Integer.valueOf转换成了Integer,但是这又怎么样呢?确实这个地方看不出什么蹊跷,我们看一下Integer的代码:
1 2 3 4 5 6 7 | public static Integer valueOf( int paramInt) { if ((paramInt >= - 128 ) && (paramInt <= IntegerCache.high)) { return IntegerCache.cache[(paramInt + 128 )]; } return new Integer(paramInt); } |
我去,它居然搞了一个从-128到127之间的一个缓存,难怪通过Integer.valueOf 转换的在这个范围内的对象==返回true呢。
都看到这里了,思考一个小问题如果是这样,结果会是什么呢?当然也有同学会说这个东西我一开始就知道答案,嗯,没错,这个要么说明您很犀利,要么说明您踩过这个坑,哈哈。
1 2 3 4 5 6 | Integer a2 = new Integer( 100 ); Integer b2 = new Integer( 100 ); System.out.println( "1 a2==b2 " + (a2 == b2)); System.out.println( "2 a2==b2 " + (a.equals(b2))); |
1 |
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步