`
arcticfox9902
  • 浏览: 107196 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Java Collection源码学习 —— List

阅读更多

        Java集合类的顶层是Collection<E>接口,它声明了size()、isEmpty()、contains(Object)、iterator()、toArray()、toArray(T[])、add(E)、remove(Object)、containsAll(Collection<?>)、addAll(Collection<? extends E>)、removeAll(Collection<?>)、retainAll(Collection<?>)、clear()、equals(Object)、hashCode()这些常见的方法。其中iterator()方法返回类型为Iterator<E>,它只声明了三个方法:hasNext()、next()、remove()。

 

        抽象类AbstractCollection<E>实现了接口Collection<E>。在这个类中定义了Collection<E>接口中声明的除size()、iterator()、equals(Object)、hashCode()之外的方法,但是add(E)方法并未支持,会抛出UnsupportedOperationException。此外还重写了toString()方法,返回形如“[item1, item2, item3, item4, item5]”的字符串。

 

        接口List<E>继承自Collection<E>接口,除了父接口中声明的方法,它声明了:addAll(int, Collection<? extends E>)、get(int)、set(int, E)、add(int, E)、remove(int)、indexOf(Object)、lastIndexOf(Object)、listIterator()listIterator(int)、subList(int, int)。listIterator()方法和listIterator(int)返回类型为Iterator<E>的子接口ListIterator<E>,除了父接口声明的方法,它还声明了hasPreviours()、previous()、nextIndex()、previousIndex()、set(E)、add(E)方法。

 

        抽象类AbstractList<E>是大部分列表类的父类,继承AbstractCollection<E>类,实现了List<E>接口。主要定义了indexOf(Object)、lastIndexOf(Object)、clear()、addAll(int, Collection<? extends E>)、iterator()、listIterator()、listIterator(int)、subList(int, int)、equals(Object)、hashCode()方法。其中,indexOf(Object)方法用ListIterator的next()从前往后遍历,lastIndexOf(Object)方法用ListIterator的previous()从后往前遍历。hashCode()方法中,hashCode初始值为1,遍历列表中的元素,hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()),根据这个公司计算列表的hashCode。

        subList(int, int)返回的是原始List的一个视图,并非新的List,因此如果对subList返回的列表进行add、remove、set等操作,会对原始List产生影响如果原始列表未被标记为RandomAccess,该视图的类型为SubList<E>,是AbstractList<E>的子类,SubList包含了原始列表的引用、子列表的起始位置、子列表的长度,重写了set()、get(int)、add(int, E)、remove(int)等方法,以保证对数据的修改是在正确的index位置,但是它是在原始列表上进行操作的;如果原始列表被标记为RandomAccess(实现RandomAccess接口),该视图的类型为RandomAccessSubList<E>,它是SubList<E>的子类,区别在于它的subList(int, int)方法返回值的实际类型为RandomAccessSubList<E>,而SubList<E>的subList(int, int)方法返回值的实际类型为SubList<E>。

        AbstractList<E>有两个私有的内部类:Itr和ListItr。Itr实现了Iterator<E>接口,有两个变量:cursor和lastRet,cursor类似于游标,用于指示迭代器当前的位置,初始值是0,lastRet记录上次获取的数据的位置,初始值是-1。next()方法返回当前元素,并将lastRet指向当前元素的位置,cursor加1;remove()方法删除lastRet指向的元素,并将cursor减1,lastRet设为初始值-1;hasNext()方法返回cursor != size()。ListItr是Itr的子类,实现了Iterator<E>接口,它只有一个带参数的构造函数ListItr(int),将cursor设为该参数的值;定义了hasPreviours()、previous()、nextIndex()、previousIndex()、set(E)、add(E)方法。hasPrevious()方法返回cursor != 0;previous()方法将cursor减1,返回新的cursor指向的元素,并将lastRet指向新的cursor;nextIndex()方法返回cursor;previousIndex()方法返回cursor减1;set(E)方法将lastRet指向的元素设置为参数中的元素;add(E)方法在当前位置插入参数中的元素,将lastRet设为初始值-1,cursor加1。

 

(未完待续)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics