Collection是描述所有序列容器的共性的根接口,java.util.AbstractCollection类提供了Collection的默认实现。,Collection继承了迭代器Iterator,通过面向Collection接口设计程序可以有效地将方法内容与底层容器的特定实现解耦。
java的类库中提供了四种基本的容器类,分别为 List 、Set 、Queue、Map,这些容器类都可以自动调整自己的尺寸,这一点与数组有区别。各个容器类的特点简述如下:
List,按照插入的顺序保存元素,主要的实现类为ArrayList和LinkedList,前者以数组方式实现,后者以列表方式实现,因此前者支持按下标访问列表中的元素,随机访问速度快,但是更新操作较慢,后者更新操作快,随机访问速度慢。
Set,不允许存在重复对象。实现包括HashSet,TreeSet,LinkedHashSet。HashSet无序保存对象,使用散列函数,可以最快的的获取元素;TreeSet将元素保存在红黑树中,对容器中的对象按照升序保存,使用TreeSet元素必须实现Comparable接口;LinkedHashSet按照被添加的顺序保存对象,同事为了查询速度的原因,也是用了散列;接口SortedSet中的元素可以保证处于排序状态,因此有一些特别的功能,如first,last等,具体请查看API,TreeSet实现了SortedSet接口。
散列的Set实现(HashSet,LinkedHashSet)会先计算存入元素的hashCode,再对具有相同hashCode的元素进行比较,调用equals方法,如果相同则不允许添加。TreeSet则通过调用compare方法比较元素,返回0则判断为相同,不允许添加,不会调用hashCode和equals方法。
Map,存储了一组成对的“键值对”对象,允许你使用键来查找值。实现包括HashMap,TreeMap(实现了SortedMap接口,确保键处于排序状态,使用红黑树实现),LinkedHashMap,WeakHashMap,ConcurrentHashMap(线程安全的),IdentityHashMap(使用==带起equals()对“键”进行比较),各种实现的特点与Set类似。键不允许重复,Map可以返回它的键的Set,或者他键值对的Set。在构造LinkedListMap时可以设定其基于访问的最近最少使用(LRU)算法,于是没有被访问过的元素就会出现在队列前面,对于需要定期清理元素以节省空间的程序来说,此功能使得程序很容易实现。
Queue,先进先出容器,只允许在容器一端插入对象,另一端取出对象。LinkedList实现了Queue的接口(通过实现Deque接口,而Deque接口继承了Queue接口),因此LinkedList可以用作Queue的一种实现,向上转型成为Queue。实现包括PriorityQueue优先级队列。该队列下一个弹出的是具有最高优先级的元素。Deque是双向列表,可在两端操作集合。
元素“==”的判断。
Collection接口中包含contains方法,用于判断该容器中是否包含特定的对象,该方法(还有其他方法,例如List的indexOf()方法的执行)的执行需要用到对象的equals方法,这是根类Object的一部分,因此在使用集合类时,需要重写对象类型的equals方法。当使用散列容器时,需要重写equals和hashCode方法(hashCode方法也是Object的一部分,默认实现是使用对象的地址计算散列码)。
迭代器Iterator:当需要对集合中的所有对象进行遍历时,使用迭代器可以实现该功能,而且程序不需要关心给定的集合底层的结构,构建更通用化的代码。但是,对于迭代器也有一些限制,例如java的Iterator只能单向移动。
Collection的iterator方法返回一个Iterator对象,使用next()获取下一个元素,使用hasNext()检查序列中是否还有元素,使用remove()将迭代器新近返回的元素删除(remove移除由next产生的最后一个元素,这意味着调用remove之前必须先调用next,而且remove是一个所谓的可选方法,不是所有的Iterator都必须实现remove,但是标准类库都实现了remove),remove是对原始序列的操作。
ListIterator,是一个更加强大的Iterator子类,用于各种List类的访问,ListIterator可以双向移动,可以使用set方法替换它访问过的最后一个元素,可以通过调用List.ListIterator方法产生一个指向List开始出的ListIterator。
Stack,栈,指“先进先出(LIFO)”的容器,操作包括入栈(push)出栈(pop)查看栈顶元素(peek)。java.util.Stack中没有任何公共的Stack接口,所以需要自己实现,可以使用LinkedList实现。
未获支持的操作 UnsupportedOperationException。最常见的未获支持的操作,都来源于背后由固定尺寸的数据结构支持的容器,例如用Arrays.asList()将数组转化为List时。因为Arrays.asList()生成的数组List是基于一个固定大小的数组,因此仅支持那些不会改变数组大小的操作,任何会引起对底层数据结构的尺寸进行修改的方法都会产生一个UnsupportedOperationException(该异常由AbstractList的方法抛出)。
设定Collection或Map为不可修改
可通过Collections.unmodifiableList()构建不可修改的集合,转换完成后,任何会改变容器内容的操作都会引起UnsupportedOperationException。
Collection或Map的同步控制
可通过Collections.synchronizedList()构建同步,直接将新生成的容器传递给恰当的“同步方法”
快速报错
Java的一种保护机制,能够防止多个进程同时修改同一个容器的内容。如果在迭代遍历某个容器的过程中,另一个进程介入其中,并且插入、删除、或修改此容器的某个对象,那么就会出现问题:也许迭代过程已经处理过容器中的该元素了,也许还没处理,也许在调用size()之后容器的尺寸收缩了。。。java的快速报错机制会探查容器上的任何除了你的进程所进行的操作以外的所有变化,一旦发现其他进程修改了容器,就会立即抛出ConcurrentModificationException异常。
持有引用java.lang.ref.Reference: 如果想继续使用某个对象的引用,希望以后还能够访问到该对象,但也希望能够允许垃圾回收器释放它,就应该使用Reference对象。这样,你可以继续使用该对象,而在内存消耗殆尽的时候又允许释放该对象。