打字猴:1.70044419e+09
1700444190
1700444191 c.add(“A”);
1700444192
1700444193 c.add(“B”);
1700444194
1700444195 //构造一个包含c列表的字符串列表
1700444196
1700444197 List<String>c1=new ArrayList<String>(c);
1700444198
1700444199 //subList生成与c相同的列表
1700444200
1700444201 List<String>c2=c.subList(0,c.size());
1700444202
1700444203 //c2增加一个元素
1700444204
1700444205 c2.add(“C”);
1700444206
1700444207 System.out.println(“c==c1?”+c.equals(c1));
1700444208
1700444209 System.out.println(“c==c2?”+c.equals(c2));
1700444210
1700444211 }
1700444212
1700444213 c1是通过ArrayList的构造函数创建的,c2是通过列表的subList方法创建的,然后c2又增加了一个元素C,现在的问题是输出的结果是什么呢?列表c与c1、c2之间是什么关系呢?
1700444214
1700444215 别忙着回答这个问题,我们先来回想一下String类的subString方法,看看它是如何工作的,代码如下:
1700444216
1700444217 public static void main(String[]args){
1700444218
1700444219 String str=“AB”;
1700444220
1700444221 String str1=new String(str);
1700444222
1700444223 String str2=str.substring(0)+“C”;
1700444224
1700444225 System.out.println(“str==str1?”+str1.equals(str1));
1700444226
1700444227 System.out.println(“str==str2?”+str.equals(str2));
1700444228
1700444229 }
1700444230
1700444231 很明显,str与str1是相等的(虽然不是同一个对象,但用equals方法判断是相等的),但它们与str2不相等,这毋庸置疑,因为str2在对象池中重新生成了一个新的对象,其表面值是ABC,那当然与str和str1不相等了。
1700444232
1700444233 说完了subString的小插曲,现在回到List是否相等的判断上来。subList与subString的输出结果是一样的吗?让事实说话,运行结果如下:
1700444234
1700444235 c==c1?false
1700444236
1700444237 c==c2?true
1700444238
1700444239 很遗憾,与String类刚好相反,同样是一个sub类型的操作,为什么会相反呢?仅仅回答“为什么”似不足以平复我们的惊讶,下面就从最底层的源代码来进行分析。
[ 上一页 ]  [ :1.70044419e+09 ]  [ 下一页 ]