打字猴:1.70044431e+09
1700444310
1700444311 }
1700444312
1700444313 通过阅读这段代码,我们就非常清楚subList方法的实现原理了:它返回的SubList类也是AbstractList的子类,其所有的方法如get、set、add、remove等都是在原始列表上的操作,它自身并没有生成一个数组或是链表,也就是子列表只是原列表的一个视图(View),所有的修改动作都反映在了原列表上。
1700444314
1700444315 我们例子中的c2增加了一个元素C,不过增加的元素C到了c列表上,两个变量的元素仍保持完全一致,相等也就很自然了。
1700444316
1700444317 解释完相等的问题,再回过头来看看为什么变量c与c1不相等。很简单,因为通过ArrayList构造函数创建的List对象c1实际上是新列表,它是通过数组的copyOf动作生成的,所生成的列表c1与原列表c之间没有任何关系(虽然是浅拷贝,但元素类型是String,也就是说元素是深拷贝的),然后c又增加了元素,因为c1与c之间已经没有一毛钱的关系了,那自然是不相等了。
1700444318
1700444319 注意 subList产生的列表只是一个视图,所有的修改动作直接作用于原列表。
1700444320
1700444321
1700444322
1700444323
1700444324 编写高质量代码:改善Java程序的151个建议 [:1700438142]
1700444325 编写高质量代码:改善Java程序的151个建议 建议71:推荐使用subList处理局部列表
1700444326
1700444327 我们来看这样一个简单的需求:一个列表有100个元素,现在要删除索引位置为20~30的元素。这很简单,一个遍历很快就可以完成,代码如下:
1700444328
1700444329 public static void main(String[]args){
1700444330
1700444331 //初始化一个固定长度,不可变列表
1700444332
1700444333 List<Integer>initData=Collections.nCopies(100,0);
1700444334
1700444335 //转换为可变列表
1700444336
1700444337 List<Integer>list=new ArrayList<Integer>(initData);
1700444338
1700444339 //遍历,删除符合条件的元素
1700444340
1700444341 for(int i=0,size=list.size();i<size;i++){
1700444342
1700444343 if(i>=20&&i<30){
1700444344
1700444345 list.remove(i);
1700444346
1700444347 }
1700444348
1700444349 }
1700444350
1700444351 }
1700444352
1700444353 或者
1700444354
1700444355 for(int i=20;i<30;i++){
1700444356
1700444357 if(i<list.size()){
1700444358
1700444359 list.remove(i);
[ 上一页 ]  [ :1.70044431e+09 ]  [ 下一页 ]