第四章 Java集合框架

目录

 

Java集合可以分为Collection和Map两种体系

5.1 Collection接口

5.2 Iterator迭代器接口(遍历集合元素)

5.3 List接口(Collection子接口之一)


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子接口之一)

概述

  1. List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
  2. List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
  3. JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector

List的实现类之一:ArrayList

  1. ArrayList 是 List 接口的典型实现类、主要实现类
  2. l本质上,ArrayList是对象引用的一个变长数组
  3. 返回值是一个固定长度的List集合。

List的实现类之二:LinkedList

  1. 对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。
  1. 新增方法: 

Ø void addFirst(Object obj)

Ø void addLast(Object obj)

Ø Object getFirst()

Ø Object getLast()

Ø Object removeFirst()

Ø Object removeLast()

  1. 双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量:

Ø prev变量记录前一个元素的位置;

Ø next变量记录下一个元素的位置;

List的实现类之二:LinkedList

  1. Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的
  2. 在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。
  3. 新增方法:
  • 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()方法的基本原则:

  1. 在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值。
  2. 当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应该相等。
  3. 对象中用作equals()方法比较 Filed,都应该用来计算hashCode值。

重写equals()方法的基本原则:

当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候,总是 要改写hashCode(),根据一个类的equals方法(改写后),两个截然不 同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode()方法, 它们仅仅是两个对象。 

  1. 因此,违反了“相等的对象必须具有相等的散列码”。
  2. 结论:复写equals方法的时候一般都需要同时复写hashCode方法。通 常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。 

Set实现类之二:LinkedHashSet

LinkedHashSet HashSet 的子类

LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置, 但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。

LinkedHashSet插入性能略低于 HashSet但在迭代访问 Set 里的全部元素时有很好的性能。

LinkedHashSet 不允许集合元素重复

Set实现类之三:TreeSet

TreeSet SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。

TreeSet底层使用红黑树结构存储数据

TreeSet 两种排序方法:自然排序定制排序。默认情况下,TreeSet 采用自然排序。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值