subList生成的列表和原列表的对比

原创
2017/03/18 08:12
阅读数 156

在List类里面有一个方法是subList方法可以生成原表的视图,那么这个视图和原表有什么关系呢?下面我们就来试试。

subList生成的列表和原列表的对比

首先我们定义一个包含两个字符串的列表list1,并加两个元素到list1,再构造一个包含list1的列表list2,然后列表list3是通过subList方法从list1中截取所有的元素产生的列表,然后我们对list3进行添加一个元素的操作,然后看一下list1和list2以及list1和list3究竟是不是相等的(可以看下另外一篇ArrayList和Vector的相等判断,只要都是List类下的子类,那么元素相等就相等),然后再打印下各个list的值。大家猜猜结果会是什么呢?

subList生成的列表和原列表的对比

结果是list1和list3是相等的,list1里面的元素也被修改了。那么这是为什么呢?我们来看下subList的源码。

subList生成的列表和原列表的对比

subList方法是有AbstractList实现的,会根据是不是可以随机存取来提供不同的subList实现方式,不过RandomAccessSubList也是SubList的子类,所有的操作都是通过SubList类实现的(除了自身的SubList方法外,大家可以看下RandomAccessSubList类,这里就不贴出来了),现在我们来看下SubList的源码(直接看add方法以及构造函数)。

subList生成的列表和原列表的对比

subList生成的列表和原列表的对比

构造函数前面还定义了两个private属性:

private AbstractList<E> l;

private int offset;

调用subList方法的时候,返回的SubList类也是AbstractList的子类,里面的所有方法(这里只贴出了add方法,还有remove,set,get方法)都是对原始列表的操作(构造函数里里面将传进来的list1给l,add方法中再对l进行操作),也就是说通过subList方法生成的列表只是原表的一个视图而已。所以两表的元素还是会保持一致的。所以大家在操作subList产生的表的时候要注意是会对原表产生影响的。附上API中subList的方法说明:

subList生成的列表和原列表的对比

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部