java的容器类
java的容器类可以自动调节大小,用来保存对象,主要分为:
1. Collection:独立元素的序列,所有的Collection都可以使用for-each语法。
2. Map:存储键值对。
- for-each语法:
java SE5引入的更高效的用于数组和容器的for语法,不必创建int变量去对由访问项构成的序列进行计数,for-each将自动产生每一项。
任何返回一个数组的方法都可以使用for-each,并且还可以用于任何Iterable对象。
Collection
1. List:将元素维护在特定的序列中。
* ArrayList:底层结构是数组,随机访问的速度比较快,但是元素的插入和删除涉及到数组元素的移动,速度会比较慢
* LinkedList:底层结构是链表,随机访问的速度因为需要遍历链表,所以比较慢,而元素的插入和删除,只需要修改指针,因此速度比较快。可以作为栈、队列、双端队列使用。
* 几个特殊的方法:
1)subList():返回列表中的一个子列表,在子列表上的修改会反映到初始列表中,反之亦然。
2)retainAll():交集操作,所产生的操作依赖equals()方法。
2. 迭代器:也是一种设计模式,将遍历序列的操作与序列底层的结构分离。
迭代器是一个轻量级对象,它的工作是遍历并选择容器中的对象。
java中的迭代器只能单向移动。
1)基本操作:
* iterator()方法可要求容器返回一个Iterator对象,该对象即将指向序列中的第一个元素
* hasNext():检查序列中是否还有元素
* next():获得序列中的下一个元素
* remove():将迭代器新返回的元素删除
2)ListIterator:Itarator的子类,它可以实现迭代器的双向移动,还可以指向当前位置的前一个(prevousInex())和后一个元素(nextIndex())的索引,并可以用set方法替换它访问过的最后一个元素。还可以通过调用listIterator(n)方法来创建一个一开始就指向索引为n的元素处的listItreator。
3. set:不保存重复的元素,set是基于对象的值来确定归属性的,加入set的对象必须定义equals()方法来确保对象的唯一性。
* HashSet:快速查找,使用了散列函数,内部结构是HashMap。
* TreeSet::红黑树结构,升序排序。存入TreeSet的元素必须实现Comparable接口。comparator()返回当前set使用的Comparator,或者返回null表示以自然顺序排序。
* LinkedHashSet:继承HashSet,但是以链表来维护插入顺序。
4. PriorityQueue:优先级队列
普通队列的对列规则是下一个弹出元素是等待时间最长的元素,而优先级队列声明的是下一个弹出元素是最需要的元素。元素在插入的时候会在队列中进行排序,java的优先级队列默认是最小堆。
5.Map:
* HashMap:底层结构是数组加链表加红黑树组成的,通过”散列码“进行元素查找,其元素插入和查找的开销是固定的
* LinkedHashMap:类似于HashMap,但是它用链表维护内部次序。
* TreeMap:基于红黑树的实现,排序结构,也是唯一带有subMap()方法的Map,它可以返回一个子树。
* WeakHashMap:弱键映射,允许释放映射所指向的对象。如果映射之外没有引用指向某个键,则该键会被垃圾收集器回收。
* ConcurrentHashMap:线程安全的Map,不涉及同步加锁。
* IdentityHashMap:用”==“代替equals()方法进行比较的散列映射。
注意:hashcode()方法与equals()方法的重写,因为默认是通过对象的地址来比较的。
不可修改的设定,创建只读的容器。
快速报错机制:java的机制,用来防止多个进程同时修改同一个容器,ConcurrentModificationException异常抛出。其中,concurrentMap、CopyOnWriteArrayList和CopyOnWriteArraySet都使用了可以避免该异常的技术。