Java到底是不是同一个对象?
Posted 盖丽男
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java到底是不是同一个对象?相关的知识,希望对你有一定的参考价值。
自己一直没有完全搞明白java的传值,传引用,传对象的区别,有时候觉得自己搞懂了,一碰到具体例子,又懵了,所以今天来敲代码看一下。
第一版:
public static void main(String[] args) {
List<Integer> userListA=new ArrayList<>();
userListA.add(1);
List<Integer> userListB=new ArrayList<>();
userListB=userListA;
System.out.println(userListA == userListB);
}
来看下结果:
true
所以这种直接=的情况,两个list其实指向的是堆内的同一个对象。
第二版:
public static void main(String[] args) {
List<Integer> userListA=new ArrayList<>();
userListA.add(1);
List<Integer> userListB=new ArrayList<>();
userListB.add(1);
System.out.println(userListA == userListB);
}
答案是:
false
当分别赋值,此时两个list指向不同。
这里有个有趣的地方,此时如果我们不比较list,而是比较list中的第一个对象,你会发现,返回结果也是true。
当我们继续将放到list中的值增大,一直到128,如下:
public static void main(String[] args) {
List<Integer> userListA=new ArrayList<>();
userListA.add(128);
List<Integer> userListB=new ArrayList<>();
userListB.add(128);
System.out.println(userListA.get(0) == userListB.get(0));
}
此时结果就会变为 false,这种情况,是因为常量池的存在。
Byte, Short, Integer, Long, Character, Boolean, Float, Double, 除Float和Double以外, 其它六种都有常量池,,只在大于等于-128并且小于等于127时使用常量池
第三版:
此时我们不往list中放数字,放个对象试试:
public static void main(String[] args) {
User user=new User();
user.setAge(1);
user.setName("蝈蝈");
List<User> userListA=new ArrayList<>();
userListA.add(user);
List<User> userListB=null;
userListB=userListA;
System.out.println(userListA == userListB);
}
结果当然是:
true
第四版:
看看这个:
public static void main(String[] args) {
User user=new User();
user.setAge(1);
user.setName("蝈蝈");
List<User> userListA=new ArrayList<>();
userListA.add(user);
List<User> userListB=new ArrayList<>();
userListB.add(user);
System.out.println(userListA == userListB);
System.out.println(userListA.get(0)==userListB.get(0));
}
结果为:
false
true
第五版:
到现在为止还是挺清晰的,那么addAll的情况如何呢?
public static void main(String[] args) {
User user=new User();
user.setAge(1);
user.setName("蝈蝈");
List<User> userListA=new ArrayList<>();
userListA.add(user);
List<User> userListB=new ArrayList<>();
userListB.addAll(userListA);
System.out.println(userListA == userListB);
System.out.println(userListA.get(0)==userListB.get(0));
}
结果:
false
true
以上是关于Java到底是不是同一个对象?的主要内容,如果未能解决你的问题,请参考以下文章