`
夏夜弥光
  • 浏览: 5728 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

2017.08.21

 
阅读更多
我们通常用subString来进行字符串的切割,同样的,对list、map、set都有相应的方法来进行切割。对应subList、subMap、subSet。但是这样会有一些瑕疵
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
List<Integer> list2 = new ArrayList<Integer>(list1);
List<Integer> list3 = list1.subList(0, list1.size());
list3.add(3);

System.out.println(list2.equals(list1));
System.out.println(list3.equals(list1));

}
1、subList得到的list只是原来list的一个视图。操作的还是原来的list。所以上述结果为false
true

2、public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list3 = list1.subList(0, 2);
list3.add(4);
for (Integer i : list1) {
System.out.println(i);
}
}
subList得到的视图操作是在新视图后后面继续操作,所以上述代码返回的是
1
2
4
3


3、public static void main(String[] args) {
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list3 = list1.subList(0, 2);
list1.add(4);
for (Integer i : list1) {
System.out.println(i);
}
}
用subList得到新视图后不能对员List进行操作,否则会抛ConcurrentModificationException异常。
解决方案:
  用CopyOnWriteArrayList代替ArrayList
 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics