java.util.List 中有一个 subList() 方法使用小结
List<E> subList(int fromIndex, int toIndex);
它返回原来list的从[fromIndex, toIndex)之间这一部分的视图,之所以说是视图,是因为实际上,返回的list是靠原来的list支持的。
所以,你对原来的list和返回的list做的“非结构性修改”,都会影响到彼此对方。
所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。
如果发生结构性修改的是返回的子list,那么原来的list的大小也会发生变化;
而如果发生结构性修改的是原来的list(不包括由于返回的子list导致的改变),那么返回的子list语义上将会是undefined。在AbstractList(ArrayList的父类)中,undefined的具体表现形式是抛出一个ConcurrentModificationException。
因此,如果你在调用了sublist返回了子list之后,如果修改了原list的大小,那么之前产生的子list将会失效,变得不可使用。
下面是示例代码:
List<String> pList = new ArrayList<String>(); for (int i = 0; i < 5; i++) { pList.add(String.valueOf(i)); } for (String s : pList) { System.out.print(s + " "); } System.out.println(); List<String> sList = pList.subList(1, 4); for (String s : sList) { System.out.print(s + " ");// output: 1, 2 } System.out.println(); for (String s : pList) { System.out.print(s + " "); } System.out.println(); // 非结构性修改子表,反映pList sList.set(1, "new 1"); for (String s : pList) { System.out.print(s + " ");// output: 0, new 1, 2, 3, 4 } System.out.println(); System.out.println(); // 子表结构修改,反映pList sList.add(String.valueOf(2.5)); for (String s : pList) { System.out.print(s + " ");// output:0, new 1, 2, 2.5, 3, 4 } System.out.println(); // // 非结构性修改pList,反映子列表 pList.set(2, "new 2"); for (String s : sList) { System.out.print(s + " ");// output: new 1, new 2 } System.out.println(); //移除 pList.subList(1, 3).clear(); for (String s : pList) { System.out.print(s + " "); } System.out.println(); // for(String s : sList){ // System.out.print(s +" ");//output: new 1, new 2 // } // 结构修改pList,分表undefined(throw exception) // pList.add("undefine"); // for(String s : sList){ // System.out.print(s +" "); // } // sList.get(0);
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了