概念:
为了保证数量不确定的数据,以及保存具有映射关系的数据,Java提供集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类;集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象;而集合里只能保存对象(对象的引用变量);
集合类主要由两个接口派生:Collection和Map,
;
Collection和Iterator接口:
Collection接口是List、Set和Queue接口的父接口;
方法摘要 | ||
---|---|---|
boolean | add(E e) 确保此 collection 包含指定的元素(可选操作)。 | |
boolean | addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 | |
void | clear() 移除此 collection 中的所有元素(可选操作)。 | |
boolean | contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 | |
boolean | containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。 | |
boolean | equals(Object o) 比较此 collection 与指定对象是否相等。 | |
int | hashCode() 返回此 collection 的哈希码值。 | |
boolean | isEmpty() 如果此 collection 不包含元素,则返回 true。 | |
Iterator<E> | iterator() 返回在此 collection 的元素上进行迭代的迭代器。 | |
boolean | remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 | |
boolean | removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 | |
boolean | retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 | |
int | size() 返回此 collection 中的元素数。 | |
Object[] | toArray() 返回包含此 collection 中所有元素的数组。 | |
| toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
Iterator接口:
主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器;
public void test(){
MyList list=new MyListImpl();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
Iterator iterator=list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
也可以用foreach循环遍历集合元素;
Set接口:
Set是一种集合元素无序、不可重复的集合,Set根据equals方法判断两个对象是否相同
HashSet类:
HashSet按哈希算法来存储集合中的元素,具有很好的存取和查找性能,底层数据结构是哈希表;
- 不能保证元素的排列顺序,顺序有可能发生变化;
- 不是同步的;
- 集合元素值可以是null;
- 依赖hashCode()和equals()来保证元素唯一性;
LinkedHashSet类:
也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使元素是以插入的顺序来保存的;
TreeSet类:
TreeSet是SortedSet接口的唯一实现,TreeSet可以保证集合元素处于排序状态(不是根据元素的插入顺序进行排序,而是根据元素实际值来进行排序),TreeSet采用红黑树的数据结构对元素进行排序,TreeSet支持两种排序:自然排序和定制排序;
自然排序:
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将其按升序排列;如果将一个对象添加进TreeSet时,该对象的类必须实现Comparable接口,否则程序将会抛出异常;
定制排序(比较器):
TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列;如果需要实现定制排序,例如以降序排列,则可以使用Comparator接口的帮助,该接口包含了int compare(T o1,T o2)方法;
List接口:
List是一种集合元素有序、可重复的集合
ArrayList类:
底层是数组,查询快,增删慢,线程不安全(非同步),效率高;
Vector类:
底层是数组,查询快,增删慢,线程安全(同步),效率低;
LinkedList类:
LinkedList实现了List接口也实现了Deque接口,即它可以当做双向队列使用,也可以当作栈使用,底层是链表,查询慢,增删块,线程不安全,效率高;
Map接口:
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复。如果把Map里的所有key放在一起,它们就组成了一个Set集合;
Map接口定义的方法:
方法摘要 | |
---|---|
void | clear() 从此映射中移除所有映射关系(可选操作)。 |
boolean | containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。 |
boolean | containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> | entrySet() 返回此映射中包含的映射关系的 Set 视图。 |
boolean | equals(Object o) 比较指定的对象与此映射是否相等。 |
V | get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null 。 |
int | hashCode() 返回此映射的哈希码值。 |
boolean | isEmpty() 如果此映射未包含键-值映射关系,则返回 true。 |
Set<K> | keySet() 返回此映射中包含的键的 Set 视图。 |
V | put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 |
void | putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。 |
V | remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 |
int | size() 返回此映射中的键-值映射关系数。 |
Collection<V> | values() 返回此映射中包含的值的 Collection 视图。 |
Map中包括一个内部类:Entry,该类封装了一个key—value对:
方法摘要 | |
---|---|
boolean | equals(Object o) 比较指定对象与此项的相等性。 |
K | getKey() 返回与此项对应的键。 |
V | getValue() 返回与此项对应的值。 |
int | hashCode() 返回此映射项的哈希码值。 |
V | setValue(V value) 用指定的值替换与此项对应的值(可选操作)。 |
HashMap类和Hashtable类:
- HashMap和Hashtable都是Map接口的典型实现类;
- Hashtable继承自Dictionary类,HashMap继承自AbstractMap抽象类;
- 在HashMap中,null可以作为键且只能有一个,可以有一个或多个key所对应的值为null,Hashtable中不允许键值为null;
- Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的,因此Hashtable比HashMap慢;
- 两者哈希值的使用不同,Hashtable直接使用对象的hashcode,而HashMap需要重新计算hash值,而且用于代替求模;
- Hashtable中hash数组默认大小是11,增加的方式是old*2+1,HashMap中hash数组的默认大小是16,增加为old*2;
- 当使用自定义类作为HashMap,Hashtable的key时,要使重写该类的equals(Object obj)和hashCode方法的判断标准一致;
SortedMap接口和TreeMap实现类:
与TreeSet类似,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有key-value对处于有序状态;
TreeMap的两种排序方式:
- 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有key应该是同一个类的对象,否则会抛出ClassCastException异常;
- 比较器排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序,采用定制排序时不要求Map的key实现Comparable接口;
Collections工具类:
Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法;
排序操作:
- static void reverse(List list):反转指定List集合中的元素;
- static void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序;
- static void sort(List list,Comparator c):根据指定Comparator 产生的顺序对List集合的元素进行排序;
- static void swap(List list,int i,int j):将指定List集合中i处元素和j处元素进行交换;
- static void rotate(List list,int distance):根据指定的距离轮换指定列表中的元素;
查找、替换操作:
- static int binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List集合中的索引,List中的元素需有序;
- static Object max(Collection coll):根据元素的自然顺序,返回给定集合中的最大元素;
- static Object min(Collection coll):根据元素的自然顺序,返回给定集合中的最小元素;
- static bollean replaceAll(List list,Object oldVal,Object newVal):使用一个新值替换旧值;
同步控制:
Collections类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程问题;
Collection collection=Collections.synchronizedCollection(new ArrayList<>());