今天在QQ群上跟人家交流,错误得把List接口说成了ArrayList的父类,当时脸都红了,不行,一定要跪着回去复习Java,所以把Java的书拿出来,把集合框架的认真仔细的看了一遍,在EverNote上写了一篇笔记,所以搬到博客上来跟大家分享一下.以下就是了.
Java集合框架支持以下两种类型的容器:
- 一种是为了存储一个元素的集合,简称为集合(collection)
- 另一种是为了存储键值对,成为图(map)
- 另外:Java集合框架内的所有实例类都实现了Clonable和Serializable接口,所以他们实例都是可复制和可序列化的.
集合:(一下所有的集合的通用特性都被定义在接口中,而他的是实现是在具体类中提供的)
Java有三种主要类型的集合:规则集(Set)、线性表(List)、队列(Queue)。
- Set的实例是为了存储一组不可以重复的元素。
- List的实例是为了存储一个由元素构成的有序集合。
- Queue的实例是为了存储用于先进先出的方式处理的对象。
集合下的各种实现类:
HashSet类implements了set接口,是Set的子类。
几个方法:
几个方法:
- contains()方法:是否存在这个元素
- size方法:得到元素的个数。
- add方法:添加元素。
- remove方法:删除一个元素。
- get方法:没有这个方法,因为没有下标。
- clear方法:清空Set集合
- isEmpty方法:判断集合是否为空。
- iterator方法:得到这个集合的迭代器,用于遍历整个集合。Iterator iterator = set.iterator();
- hasnext方法
- next方法
LinkedHashSet类用一个链表实现来扩展HashSet类,它支持对规则集内的元素进行
排序(按照他们插入的顺序)
注意:如果不需要维护元素被插入的顺序,就应该使用HashSet,他会比LinkedHashSet更为高效。
TreeSet
类实现了SortedSet的具体类NavigableSet类,只要对象是可以被比较的,就可以将他们添加到一个TreeSet中。
几个方法:
- first()方法:返回TreeSet中的第一个元素.
- last()方法:返回TreeSet中的最后一个元素.
- headSet(Object obj)方法:返回treeSet中obj对象前面的所有的元素.
- tailSet(Object obj)方法:返回treeSet中obj对象和他之后的所有元素.
List接口扩展了Collection接口,来定义一个
允许重复的有序集合.
几个方法:
- add(index, element)方法:用于指定下标处插入一个元素.
- addAll(index, collection)方法:在指定下标中插入一个集合.
- remove(index)方法:删除指定下标的元素.
- indexOf(element)方法:用于获取指定元素在线性表中第一次出现的下标.
- lastIndexOf(element)方法:用于获取指定元素在线性表中最后一次出现的下标.
- subList(fromIndex, toIndex)方法:用于获取一个子线性表.
- listIterator()/listIterator(startIndex)方法用于获取迭代器对象.
- add(element)方法:将指定元素插入到线性表中.
List的两种实现方式:
- 数组线性表类ArrayList: 用数组来存储元素,这个数组是动态创建的.如果空间不够的话,就创建一个更大的数组,把原来的数组复制进去.
- 链表类LinkedList: 在一个链表中存储元素.
Collections类中包含的操作线性表和集合的静态方法:(注意这里的Collections是一个类,要和collection接口严格区分)
几个方法:
- sort(list : List)方法:对指定的list列表进行排序
- sort(list : List, c : Comparator)方法:使用comparator对指定的列表进行排序.
- binarySearch(list : List, key : Object): int方法:使用二分查找来查找key
- binarySearch(list : List, key : Object, c Comparator): int方法:使用比较器和二分查找来查找key
- renverse(list : List)方法:对列表进行逆序.
- reverseOrder(list : List) : Comparator方法:返回逆序的比较器.
- shuffle(list : List)方法:随机打乱
性能比较:
set比list更加高效. 具体: HashSet
> LinkedHashSet
> TreeSet
> ArrayList
> LinkedList.
向量类Vector和Stack
Vector类实现了List接口,除了包含用于访问和修改向量的同步方法外,Vector类和ArrayList是一样的.同步方法是用来防止两个或多个线程同时访问摸个向量的时候引起数据损坏.
stack类是作为Vector类的扩展来实现的
几个方法:
- Stack()方法:创建一个空的栈.
- empty() : boolean 方法:如果栈为空的话,返回true.
- peek() : E 方法:返回栈顶元素.
- pop() : E 方法:返回并删除栈顶元素.
- push(o : E) : E 方法:在栈顶增加一个新的元素.
- search(o : Object) : int 方法:返回栈中指定元素的位置
队列和优先队列
Queue接口用附加的插入 提取 和检验操作 来扩展java.util.Collection.
几个方法:
- offer(element : E) : boolean 方法:相对类中插入一个元素.
- poll() : E 方法:获取并删除队列头, 如果队列为空则返回null
- remove() : E方法:获取并删除队列头, 如果队列为空则抛出异常
- peek() : E 方法: 获取但不删除队列头, 如果队列为空则返回null
- element() : E 方法: 获取但不删除队列头, 如果队列为空则抛出异常
双端队列Deque和LinkedList
LinkedList实现了Deque接口,Deque又扩展了Queue接口,因此可以使用LinkedList来创建一个队列.
Deque支持在两端插入和删除元素.deque是双端队列(double end queue)的简称,发音为deck.
几个方法:
- addFirst():
- removeFirst():
- addLast():
- removeLast():
- getFirst():
- getLast():
PriorityQueue实现了一个优先队列,默认情况下使用Comparable以元素的自然顺序进行排序,拥有最小数值的严肃被赋予最高优先级,因此最先从队列中删除.
图:用来存储键值对,键值可以使任意的类型,键不能重复,每个键对应一个值
图的类型有三种: 散列图(HashMap) 链式散列图 (LInkedHashMap) 树形图(TreeMap).
Map接口提供了查询 更新 获取集合的值和集合的键值的方法,如下:
- clear() : void 方法:删除图中的所有条目.
- containKey(key : Object) : boolean 方法:如果图包含了指定键值对应的条目则返回true.
- containsValue(value : Object) : boolean 方法:如果图将一个或多个键值映射到特定值则返回true
- entrySet() : Set<Map.Entry<K, V>> 方法: 返回一个包含途中条目的规则集
- get(key : Object) : V 方法: 返回图中指定条目对应的值.
- isEmpty() : boolean 方法:如果图中不包含任何条目则返回true
- keySet() : Set<K> 方法:返回包含图中键值的一个规则集
- put(key : K, value : V) : V 方法:将一个映射放入图中.
- putAll(m : Map<? extends K, ? extends V>) : void 方法:将所有来自m的条目添加到图中
- remove(key : Object) : V 方法:删除指定键值对应的条目
- size() : int 方法:返回条目的数目
- values() : Collection<V> 方法:返回包含图中值得集合
要点:
- Entry是Map接口中的一个内部接口
- sortedMap接口扩展了Map接口.他还有附加的方法firstKey()和lasstKey()来返回最低值键和最高值键,heapMap(toKey)方法返回键值小于toKey的那部分图,而tailMap(fromKey)返回键值大于或等于fromKey的那部分图.
- 对于定位一个值,插入一个映射以及删除一个映射而言,hashMap是高效的.
- LinkedHashMap类用链表实现来扩展HashMap类,它支持图中的条目的排序.HashMap是不支持排序的.但是在LInkedHashMap中,元素既可以按照插入的顺序进行排序,也可以按照他们被最后一次访问是的顺序,从最早到最晚排序.
- TreeMap在遍历排好序的键值时是很高效的.