打字猴:1.70044436e+09
1700444360
1700444361 }
1700444362
1700444363 }
1700444364
1700444365 相信首先出现在大家脑海中的实现就是此算法了,遍历一遍,符合条件的就删除,简单而又实用。不过,还有没有其他方式呢?有没有“one-lining”一行代码就解决问题的方式呢?
1700444366
1700444367 有,直接使用ArrayList的removeRange方法不就可以了吗?等等,好像不可能呀,虽然JDK上有此方法,但是它有protected关键字修饰着,不能直接使用,那怎么办?看看如下代码。
1700444368
1700444369 public static void main(String[]args){
1700444370
1700444371 //初始化一个固定长度,不可变列表
1700444372
1700444373 List<Integer>initData=Collections.nCopies(100,0);
1700444374
1700444375 //转换为可变列表
1700444376
1700444377 ArrayList<Integer>list=new ArrayList<Integer>(initData);
1700444378
1700444379 //删除指定范围的元素
1700444380
1700444381 list.subList(20,30).clear();
1700444382
1700444383 }
1700444384
1700444385 上一个建议讲解了subList方法的具体实现方式,所有的操作都是在原始列表上进行的,那我们就用subList先取出一个子列表,然后清空。因为subList返回的List是原始列表的一个视图,删除这个视图中的所有元素,最终就会反映到原始字符串上,那么一行代码即解决问题了。
1700444386
1700444387
1700444388
1700444389
1700444390 编写高质量代码:改善Java程序的151个建议 [:1700438143]
1700444391 编写高质量代码:改善Java程序的151个建议 建议72:生成子列表后不要再操作原列表
1700444392
1700444393 前面说了,subList生成的子列表是原列表的一个视图,那在subList执行完后,如果修改了原列表的内容会怎样呢?视图是否会改变呢?如果是数据库视图,表数据变更了,视图当然会变了,至于subList生成的视图是否会改变,还是从源码上来看吧,代码如下:
1700444394
1700444395 public static void main(String[]args){
1700444396
1700444397 List<String>list=new ArrayList<String>();
1700444398
1700444399 list.add(“A”);
1700444400
1700444401 list.add(“B”);
1700444402
1700444403 list.add(“C”);
1700444404
1700444405 List<String>subList=list.subList(0,2);
1700444406
1700444407 //原字符串增加一个元素
1700444408
1700444409 list.add(“D”);
[ 上一页 ]  [ :1.70044436e+09 ]  [ 下一页 ]