博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中List.subList()方法的使用
阅读量:7048 次
发布时间:2019-06-28

本文共 3226 字,大约阅读时间需要 10 分钟。

hot3.png

sublist返回的东西,官方解释:Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex bulabula。一个View,视图,想到了数据库视图。

做个实验:

public static void main(String[] args) {		List list = new ArrayList<>();		list.add(1);		list.add(2);		list.add(3);		list.add(4);		List sub = list.subList(0, 2);// 1,2		sub.add(5);		sub.add(6);		System.out.println("sub:" + sub);		System.out.println("list:" + list);}sub:[1, 2, 5, 6]list:[1, 2, 5, 6, 3, 4]

不仅是sublist,原来的list也增加了。

System.out.println(sub.getClass());class java.util.ArrayList$SubList

有趣,返回的不是ArrayList,而是里面的子类,源码:

public List
subList(int fromIndex, int toIndex) { subListRangeCheck(fromIndex, toIndex, size); return new SubList(this, 0, fromIndex, toIndex);}private class SubList extends AbstractList
implements RandomAccess { private final AbstractList
parent; private final int parentOffset; private final int offset; int size; SubList(AbstractList
parent, int offset, int fromIndex, int toIndex) { this.parent = parent; this.parentOffset = fromIndex; this.offset = offset + fromIndex; this.size = toIndex - fromIndex; this.modCount = ArrayList.this.modCount; } public E get(int index) { rangeCheck(index); checkForComodification(); return ArrayList.this.elementData(offset + index); // 查询也是查的父列表 } public void add(int index, E e) { rangeCheckForAdd(index); checkForComodification(); parent.add(parentOffset + index, e); //父列表也【插入】了 this.modCount = parent.modCount; this.size++; }}

于是可以这样这样移除我不想要的数据:

public static void main(String[] args) {		List list = new ArrayList<>();		list.add(1);		list.add(2);		list.add(3);		list.add(4);		list.subList(3, list.size()).clear();		System.out.println("list:" + list);}list:[1, 2, 3]

我突然想这样试一下:

public static void main(String[] args) {		List list = new ArrayList<>();		list.add(1);		list.add(2);		list.add(3);		list.add(4);		List sub = list.subList(0, 2);// 1,2		sub.add(5);		sub.add(6);		sub.clear();		list.add(7);		list.add(8);		System.out.println("sub:" + sub);		System.out.println("list:" + list);}Exception in thread "main" java.util.ConcurrentModificationException	at java.util.ArrayList$SubList.checkForComodification(Unknown Source)	at java.util.ArrayList$SubList.listIterator(Unknown Source)	at java.util.AbstractList.listIterator(Unknown Source)	at java.util.ArrayList$SubList.iterator(Unknown Source)	at java.util.AbstractCollection.toString(Unknown Source)	at java.lang.String.valueOf(Unknown Source)	at java.lang.StringBuilder.append(Unknown Source)	at code.MapTest.main(MapTest.java:20)

果然报错了。。。

直接结论:

前面子类的源码get方法有这么一句: checkForComodification();

private void checkForComodification() {        if (ArrayList.this.modCount != this.modCount)            throw new ConcurrentModificationException();}

modCount和父List不一样就报错,这个变量表示当前链表【变化】了几次。

有人解释的很好很详细,Mark:

https://www.zhihu.com/question/24086463

http://www.cnblogs.com/dolphin0520/p/3933551.html

转载于:https://my.oschina.net/liujiest/blog/733137

你可能感兴趣的文章
yaml官方介绍
查看>>
three.js模型
查看>>
网络流24题 餐巾计划问题
查看>>
基于 Android NDK 的学习之旅-----序言
查看>>
InnoDB recovery过程解析
查看>>
鼓浪屿
查看>>
alloc_skb申请函数分析
查看>>
WPF PRISM开发入门二(Unity依赖注入容器使用)
查看>>
使用 data-* 属性来嵌入自定义数据:
查看>>
炒股的常见技术指标
查看>>
工控随笔_07_西门子_WinCC利用命令行实现操作log日志
查看>>
解决MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents ........
查看>>
HUST 1017 Exact cover
查看>>
SessionStateStoreProviderBase.GetItemExclusive Method
查看>>
Excel Wrapper
查看>>
Thread和Service应用场合的区别
查看>>
poj 2632 模拟题
查看>>
递归--木棍问题
查看>>
企业门户(Portal)项目实施方略与开发指南
查看>>
基于百度定位SDK的定位服务的实现
查看>>