1:Collection 子接口 1:List
-
鉴于 Java 中数组用来存储数据的局限性,我们通常使用
java.util.List
替代数组 -
List 集合类中
元素有序
、且可重复
,集合中的每个元素都有其对应的顺序索引
1.1 List 接口主要实现类:ArrayList
-
ArrayList 是 List 接口的
主要实现类
-
本质上,ArrayList 是对象引用的一个” 变长” 数组
-
Arrays.asList (…) 方法返回的 List 集合,既不是 ArrayList 实例,也不是 Vector 实例。 Arrays.asList (…) 返回值是一个固定长度的 List 集合
2:Collection 子接口 2:Set
2.1HashSet
-
HashSet 具有以下
特点
:- 不能保证元素的排列顺序
- HashSet 不是线程安全的
- 集合元素可以是 null
-
HashSet 集合
判断两个元素相等的标准
:两个对象通过hashCode()
方法得到的哈希值相等,并且两个对象的equals()
方法返回值为 true。 -
对于存放在 Set 容器中的对象,对应的类一定要重写 hashCode () 和 equals (Object obj) 方法,以实现对象相等规则。即:“相等的对象必须具有相等的散列码”。
-
HashSet 集合中元素的无序性,不等同于随机性。这里的无序性与元素的添加位置有关。具体来说:我们在添加每一个元素到数组中时,具体的存储位置是由元素的 hashCode () 调用后返回的 hash 值决定的。导致在数组中每个元素不是依次紧密存放的,表现出一定的无序性。
2.2:LinkedHashSet
-
LinkedHashSet 是 HashSet 的子类,不允许集合元素重复。
-
LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用
双向链表
维护元素的次序,这使得元素看起来是以添加顺序
保存的。 -
LinkedHashSet
插入性能略低
于 HashSet,但在迭代访问
Set 里的全部元素时有很好的性能。
2.3:TreeSet
- TreeSet 是 SortedSet 接口的实现类,TreeSet 可以按照添加的元素的指定的属性的大小顺序进行遍历。
- TreeSet 底层使用
红黑树
结构存储数据 - reeSet 特点:不允许重复、实现排序(自然排序或定制排序)
- TreeSet 两种排序方法:
自然排序
和定制排序
。默认情况下,TreeSet 采用自然排序。自然排序
:TreeSet 会调用集合元素的 compareTo (Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序 (默认情况) 排列。- 如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。
- 实现 Comparable 的类必须实现 compareTo (Object obj) 方法,两个对象即通过 compareTo (Object obj) 方法的返回值来比较大小。
定制排序
:如果元素所属的类没有实现 Comparable 接口,或不希望按照升序 (默认情况) 的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过 Comparator 接口来实现。需要重写 compare (T o1,T o2) 方法。- 利用 int compare (T o1,T o2) 方法,比较 o1 和 o2 的大小:如果方法返回正整数,则表示 o1 大于 o2;如果返回 0,表示相等;返回负整数,表示 o1 小于 o2。
- 要实现定制排序,需要将实现 Comparator 接口的实例作为形参传递给 TreeSet 的构造器。
- 因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是
同一个类的对象
。 - 对于 TreeSet 集合而言,它判断
两个对象是否相等的唯一标准
是:两个对象通过compareTo(Object obj) 或compare(Object o1,Object o2)
方法比较返回值。返回值为 0,则认为两个对象相等。
3:Map 接口
-
Map 与 Collection 并列存在。用于保存具有
映射关系
的数据:key-valueCollection
集合称为单列集合,元素是孤立存在的(理解为单身)。Map
集合称为双列集合,元素是成对存在的 (理解为夫妻)。
-
Map 中的 key 和 value 都可以是任何引用类型的数据。但常用 String 类作为 Map 的 “键”。
-
Map 接口的常用实现类:
HashMap
、LinkedHashMap
、TreeMap
和 ``Properties。其中,HashMap是 Map 接口使用
频率最高 ` 的实现类。 -
3.1:Map 的主要实现类:HashMap
- HashMap 是 Map 接口
使用频率最高
的实现类。 - HashMap 是线程不安全的。允许添加 null 键和 null 值。
- 存储数据采用的哈希表结构,底层使用
一维数组
+单向链表
+红黑树
进行 key-value 数据的存储。与 HashSet 一样,元素的存取顺序不能保证一致。 - HashMap
判断两个key相等的标准
是:两个 key 的 hashCode 值相等,通过 equals () 方法返回 true。 - HashMap
判断两个value相等的标准
是:两个 value 通过 equals () 方法返回 true。
3.2 Map 实现类之二:LinkedHashMap
- LinkedHashMap 是 HashMap 的子类
- 存储数据采用的哈希表结构 + 链表结构,在 HashMap 存储结构的基础上,使用了一对
双向链表
来记录添加元素的先后顺序
,可以保证遍历元素时,与添加的顺序一致。 - 通过哈希表结构可以保证键的唯一、不重复,需要键所在类重写 hashCode () 方法、equals () 方法。
3.3 Map 实现类之三:TreeMap
- TreeMap 存储 key-value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 key-value 对处于
有序状态
。 - TreeSet 底层使用
红黑树
结构存储数据 - TreeMap 的 Key 的排序:
自然排序
:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException定制排序
:创建 TreeMap 时,构造器传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
- TreeMap 判断
两个key相等的标准
:两个 key 通过 compareTo () 方法或者 compare () 方法返回 0。