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。
(未完待续)
相关推荐
8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.java...
Java集合Collection、List、Set、Map使用详解
java Collection类整理
Collection学习笔记Collection集合概述Collection集合常用方法Collection集合的遍历(迭代器)集合的使用样例 Collection集合概述 是单例集合的顶层接口 它提供了更具体的子接口的实现,如set和list. Collection集合...
java泛型集合 java集合 集合 java Collection 排序 集合排序
Java集合Collection、List、Set、Map使用详解
java 集合类学习笔记 arraylist hashmap linkedList hashset
Java Garbage Collection Study java 垃圾回收学习
接下来我们来说说Collection的另一个子接口Set。和List一样,Set也可以用来存放多个元素。我们主要来学习Set的三个实现类。 HashSet TreeSet LinkedHashSet 同样,它们之间的相同点有: 都是Set的实现类 存入的元素...
Java集合排序及java集合类详解(Collection、List、Map、Set).doc
本书介绍了collect的前世今生,是初学者的一本较好的教程。
Java.util.Collection类的学习.pdf
java Collection&Map
无论是Java初学者还是从事Java开发的经验者,Java Core源码都是必学的,尤其要对集合框架collection、Java并发控制、Java I/O等的源码实现深入学习,有很多优秀思想,同时也是大企业面试中最常出考点的地方。
java集合框架之Collection部分,包括List与Set的常用类,示例多,且皆有详细注释。
Collection集合简单测试 //添加元素c.add("孙悟空"); //删除指定元素c.remove(6);
Collections 源码 java Java-Collection- 对Java的Collection框架源码阅读