在计算机语言中,==才代表传统意义上的相等,=确是一种赋值的语句,经常使用==来进行判断前后两者是否是相等,equals两者的区别也是一种常见的话题。
废话不闲聊,之间上代码:
String str1 = "123";
String str2 = "123";
System.out.println(str1==str2); //true 常量池里面的所以地址也是一样的
System.out.println(str1.equals(str2)); //true
String str3 = new String("132");
String str4 = new String("132");
System.out.println(str3==str4); //false......比较的是地址
System.out.println(str3.equals(str4)); //true
String str5 = "66";
String str6 = new String("66");
System.out.println(str5==str6); //false
str6 = str6.intern();//intern()函数将字符串的内容放到常量池中
System.out.println(str5==str6); //true
----------------------------------------------------分割线---------------------------------------------------------------
Integer i1 = new Integer(123);
Integer i2 = new Integer(123);
System.out.println(i1==i2); //false 比较的是地址
System.out.println(i1.equals(i2)); //true
-----------------------------------------------------分割线--------------------------------------------------------------
//为什么这个就是true??????
Integer i3 = 100;
Integer i4 = 100;
System.out.println(i3==i4);//true
System.out.println(i3.equals(i4));//true
//为什么下面这个就true?????
Integer i5 = 129;
Integer i6 = 129;
System.out.println(i5==i6);// false 存储于
System.out.println(i5.equals(i6));// true
------------------------------------------------------------------------------------------------------------------------
总结下:
1、自认为== 与equals并没有关系,==比较的是两个被比较的地址,而equals的比较对象具体还得看调用者的实现方法。
2、对于String类型的一点总结,String如果直接赋值,就会将变量的值存放在常量池中,在常量池中存在的如果下次,还有相同的
field,就会指向这个”常量值“,所以==返回true
3、new 对象是从新在一个堆内存开辟空间,所以对于两个虽然,传递参数是一样的实例而言,存放的地址还是不一样的,== 检验的是地址,所以返回的自然就是false
4、对于Integer如果是new一个对象的话,地址是不同的自然就不用说了,原理和String一样
5、对于常量的赋值,如果赋值的范围在-128~127之间,那么就会返回 true,之外返回false。对于这种原因是因为Integer类内部对value值为-128到127范围[-128,127]的实例缓存了下来。这样就解释了上面的问号!!!!