在List类里面有一个方法是subList方法可以生成原表的视图,那么这个视图和原表有什么关系呢?下面我们就来试试。
首先我们定义一个包含两个字符串的列表list1,并加两个元素到list1,再构造一个包含list1的列表list2,然后列表list3是通过subList方法从list1中截取所有的元素产生的列表,然后我们对list3进行添加一个元素的操作,然后看一下list1和list2以及list1和list3究竟是不是相等的(可以看下另外一篇ArrayList和Vector的相等判断,只要都是List类下的子类,那么元素相等就相等),然后再打印下各个list的值。大家猜猜结果会是什么呢?
结果是list1和list3是相等的,list1里面的元素也被修改了。那么这是为什么呢?我们来看下subList的源码。
subList方法是有AbstractList实现的,会根据是不是可以随机存取来提供不同的subList实现方式,不过RandomAccessSubList也是SubList的子类,所有的操作都是通过SubList类实现的(除了自身的SubList方法外,大家可以看下RandomAccessSubList类,这里就不贴出来了),现在我们来看下SubList的源码(直接看add方法以及构造函数)。
构造函数前面还定义了两个private属性:
private AbstractList<E> l;
private int offset;
调用subList方法的时候,返回的SubList类也是AbstractList的子类,里面的所有方法(这里只贴出了add方法,还有remove,set,get方法)都是对原始列表的操作(构造函数里里面将传进来的list1给l,add方法中再对l进行操作),也就是说通过subList方法生成的列表只是原表的一个视图而已。所以两表的元素还是会保持一致的。所以大家在操作subList产生的表的时候要注意是会对原表产生影响的。附上API中subList的方法说明: