目录
Java集合可以分为Collection和Map两种体系
5.1 Collection接口
Collection接口:单列数据,定义了存取一组对象的方法的集合
üList:元素有序、可重复的集合 (ArrayList、Vector、LinkedList)
üSet:元素无序、不可重复的集合 (TreeSet、HashSet、LinkedHashSet(有序集合))
Map接口:双列数据,保存具有映射关系“key-value对”的集合
Collection接口方法(API)
1、添加
Ø add(Object obj)
Ø addAll(Collection coll)
2、获取有效元素的个数
Ø int size()
3、清空集合
Ø void clear()
4、是否是空集合
Ø boolean isEmpty()
5、是否包含某个元素
Ø boolean contains(Object obj):是通过元素的equals方法来判断是否是同一个对象
Ø boolean containsAll(Collection c):也是调用元素equa方法来比
6、删除
Ø boolean remove(Object obj) :通过元素的equals方法判断是否是要删除的那个元素。只会删除找到的第一个元素
Ø boolean removeAll(Collection coll):取当前集合的差集
7、取两个集合的交集
Ø boolean retainAll(Collection c):把交集的结果存在当前集合中,不影响c
8、集合是否相等
Ø boolean equals(Object obj)
9、转成对象数组
Ø Object[] toArray()
10、获取集合对象的哈希值
Ø hashCode()
11、遍历
Ø iterator():返回迭代器对象,用于集合遍历
5.2 Iterator迭代器接口(遍历集合元素)
Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元 素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“公 交车上的售票员”、“火车上的乘务员”、“空姐”。
Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所 有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了 Iterator接口的对象。
Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。
集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合 的第一个元素之前。
5.3 List接口(Collection子接口之一)
概述:
- List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
- List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
- JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector
List的实现类之一:ArrayList
- ArrayList 是 List 接口的典型实现类、主要实现类
- l本质上,ArrayList是对象引用的一个”变长”数组
- 返回值是一个固定长度的List集合。
List的实现类之二:LinkedList
- 对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。
- 新增方法:
Ø void addFirst(Object obj)
Ø void addLast(Object obj)
Ø Object getFirst()
Ø Object getLast()
Ø Object removeFirst()
Ø Object removeLast()
- 双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量:
Ø prev变量记录前一个元素的位置;
Ø next变量记录下一个元素的位置;
List的实现类之二:LinkedList
- Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。
- 在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。
- 新增方法:
- void addElement(Object obj) Ø
- void insertElementAt(Object obj,int index)
- void setElementAt(Object obj,int index)
- void removeElement(Object obj) Ø
- void removeAllElements()
5.4 Set接口(Collection子接口之二)
Set接口是Collection的子接口,set接口没有提供额外的方法
Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。
Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法。
Set实现类之一:HashSet
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。
HashSet 具有以下特点:
Ø不能保证元素的排列顺序
ØHashSet 不是线程安全的
Ø集合元素可以是 null
HashSet 集合判断两个元素相等的标准:两个对象通hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj),以实现对象相等规则。即:“相等的对象必须具有相等的散列码”。
重写hashCode()方法的基本原则:
- 在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值。
- 当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应该相等。
- 对象中用作equals()方法比较 Filed,都应该用来计算hashCode值。
重写equals()方法的基本原则:
当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候,总是 要改写hashCode(),根据一个类的equals方法(改写后),两个截然不 同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode()方法, 它们仅仅是两个对象。
- 因此,违反了“相等的对象必须具有相等的散列码”。
- 结论:复写equals方法的时候一般都需要同时复写hashCode方法。通 常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。
Set实现类之二:LinkedHashSet
LinkedHashSet 是 HashSet 的子类
LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置, 但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
LinkedHashSet 不允许集合元素重复
Set实现类之三:TreeSet
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
TreeSet底层使用红黑树结构存储数据
TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。