今天逛论坛的时候发现了这个以前学习过的问题,但是以前没有花时间总结,只是记了一点普通的知识,现在就别实验边总结。
public static void main(String[] args) { int a = 10; int b = 10; System.out.println(a == b); Integer c = new Integer(100); Integer d = new Integer(100); System.out.println(c == d); System.out.println(c.equals(d)); }
结果: true
false
true
==比较基本数据类型,如果两个值相同,则结果为true
对于c和d,这两个引用类型的变量,指向的是两个不同的对象(两个变量的地址不同,只是两个变量的值是相等的),因为对象不同,所以用==比较的时候是false
equals()方法用于比较对象的值
当程序执行,int b = 10的时候,首先会到缓冲池中寻找相同值的对象,因为缓冲池中已经a的值是10,所以b创建的时候,会引用a引用的对象10,所以a == b会输出true.
运行new操作符的时候,告诉程序“我只要新的,不要旧的”,所以一个新的对象就会被创建,虽然值相同,但是地址不同,就像一个叫阿三的人在海里游泳,一个叫阿三的人在岸边晒太阳,所以这两个人不是同一个人
API里的类大部分都重写了equals方法,没有重写的一般是自己写的类,
如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,
因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。
注意:比较数组的内容是否相等的时候,应该使用Arrays类中的equals()
public static void main(String[] args) { char[] C1 = {'a','b','c'}; char[] C2 = {'a','b','c'}; boolean isEqual; isEqual = C1.equals(C2); System.out.println(isEqual); isEqual = Arrays.equals(C1,C2); System.out.println(isEqual); } }
运行结果:false true
下面再来看一个例子:
public static void main(String[] args) { char[] C1 = {'a','b','c'}; char[] C2 = {'a','b','c'}; int[] C3 = {1,2,3,4,5}; boolean[] C4 = {false,false,false}; System.out.println(C3); System.out.println(C4); System.out.println(aryC1); System.out.println(aryC1+"____"+aryC2); }
运行结果[I@de6ced
[Z@c17164
abc
[C@1fb8ee3____[C@61de33
String.valueOf、StringBuffer.append以及System.out.print中都对char[]数组单独处理,即进行了重载,使之可以输出内容(或者对内容操作处理),而不是地址。
但是字符串拼接操作没有对char[]数组单独处理,所以它处理的是数组char[]的地址。
转载于:https://blog.51cto.com/lovelydd/980488