今天发现一个特别奇怪的问题,比较两个ArrayList<Integer>中的数值是否相等,结果发现总是测试不通过。代码如下:
ArrayList<Integer> list = new ArrayList<>();
list.add(127);
list.add(127);
list.add(128);
list.add(128);
System.out.println(list.get(0) == list.get(1)); //true
System.out.println(list.get(2) == list.get(3)); //false
System.out.println(list.get(0).equals(list.get(1))); //true
System.out.println(list.get(2).equals(list.get(3))); //true
int a = list.get(2);
int b = list.get(3);
System.out.println(a == b); //true
解析:
- 如果用“==”判断两个引用数据类型,则是判断他们的地址是否相同。
- 用equals()方法来判断则要看类中是否重新实现了equals()方法。如果没有重新实现,则和“==”一样判断地址是否一样;如果重新实现了equals()方法,可以判断两个引用类型的数据内容是否一样。
- ArrayList中的get()方法对于-128 – 127之间的int型数据(包括-128和127)会自动装箱为数值类型。所以get方法返回的Integer对象如果数值在[-128,127]之间可以使用"==“来比较,而超过这个范围的数值需要使用equals()方法来比较。
- java有自动装箱和拆箱,也可以用显式的拆箱操作来比较,如最后的代码那样。
网友评论