java集合 可以分为两种体系,Collection体系和Map体系。
Collection为单例集合的顶层接口,它表示一组对象,这些对象也成为Collection的元素。需要注意的是,JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如Set和List)的实现。
其中List是元素有序(指的是存储时,与存放顺序保持一致)、可重复的集合。Set是元素无序、不可重复的集合。
Map是一个双列集合,保存具有映射关系“key-value对”的集合。Map中的key和value是一一对应的,且key不允许重复 ,但是value允许重复。
Collection可以分为list集合和set集合。
1 list集合
list集合是一种有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素。
与set集合不同的是,列表通常允许重复的元素。
list集合的特点:①有序:存储和取出的元素顺序 一致 ②可重复:存储的元素可以重复。
list集合主要可以分为Arraylist,Linkedlist和Vector。
Arraylist底层数据结构是数组,具有查询快,增删慢的特点。
Linkedlist底层数据结构是链表,具有查询慢,增删快的特点。
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
Vector 是同步访问的。
Vector 包含了许多传统的方法,这些方法不属于集合框架。
Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。
在介绍set集合之前,需要了解何为哈希值。
哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。
Object类中的 public int hashCode()方法可以返回对象的哈希码值。
哈希值特点 :同一个对象多次调用hashCode()方法返回的哈希值是相同的。
默认情况下,不同对象的哈希值是不同的,而重写hashCode()方法,可以实现不同对象的哈希值相同。
2 set集合
set集合是元素无序,不可重复的集合。
set集合分为HashSet,LinkedHashSet和TreeSet集合。
2.1 HashSet集合
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。
HashSet不能保证元素的排列顺序,且它不是线程安全的,集合元素可以是null。
HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现相等的对象具有相等的散列码(hashcode)。
值得注意的是,重写equals方法的时候一般都需要同时重写hashCode方法。通常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。
2.2 LinkedHashSet集合
LinkedHashSet 是 HashSet 的子类
LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
LinkedHashSet 不允许集合元素重复。
2.3 TreeSet集合
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
TreeSet底层使用红黑树结构存储数据。
TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
自然排序:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列。
如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj) 方法的返回值来比较大小。
定制排序:
TreeSet的自然排序要求元素所属的类实现Comparable接口,如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。
利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。
此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。
使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。
3 Map集合
Map是一个双列集合,保存具有映射关系“key-value对”的集合。Map中的key和value是一一对应的,且key不允许重复 ,但是value允许重复。
Map集合的常用实现类有HashMap,LinkedHashMap和 Hashtable。
3.1 HashMap集合
HashMap是Map接口使用频率最高的实现类。
它是无序的集合,存储元素和取出元素的顺序可能不一致。
HashMap底层是哈希表,查询速度非常快(jdk1.8之前是数组+单向链表,1.8之后是数组+单向链表/红黑树 ,链表长度超过8时,换成红黑树)。
HashMap存储自定义类型键值,Map集合保证key是唯一的:作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一。
3.2 LinkedHashMap集合
LinkedHashMap是一个有序 的集合 ,它的存储元素和取出元素的顺序是一致的 。
LinkedHashMap底层是哈希表+链表(记录元素顺序)。它相对于HashMap的改进之处就是:元素存储有序了。
3.3 Hashtable
和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射。
Hashtable 的函数都是同步的,这意味着它是线程安全的,但是速度慢。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。
4 Collections工具类
Collections 是一个操作 Set、List 和 Map 等集合的工具类。
Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。
Collections类的常用方法:
reverse(List):反转 List 中元素的顺序;
shuffle(List):对 List 集合元素进行随机排序;
sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序;
sort(List,Comparator):根据指定的 Comparator比较器 产生的顺序对 List 集合元素进行排序;
swap(List,i,j):将指定 list 集合中的 i 处元素和 j 处元素进行交换。