Java 集合(七)

集合基础

概述

  • 集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发送改变。

  • ArrayList<E>:

    • 可调整大小的数组实现
    • <E>:是一种特殊的数据类型,泛型
  • 集合打印输出的结果不是对象,而是集合元素,格式为:[元素 1,元素 2,...]

ArrayList 的构造方法和添加方法

方法名 说明
public ArrayList() 创建一个空的集合对象
public boolean add(E e) 将指定的元素追加到此集合的末尾
public void add(int index,E element) 在此集合中的指定位置插入指定的元素,需注意集合索引越界问题

ArrayList 集合常用方法

方法名 说明
public boolean remove(Object o) 删除指定的元素,返回删除是否成功
public E remove(int index) 删除指定索引处的元素,返回被删除的元素
public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
public E get(int index) 返回指定索引处的元素
public int size() 返回集合中的元素的个数

集合类体系结构

集合类体系结构.png

Collection

概述

  • 是单列集合的顶层接口,它表示一组对象,这些对象也称为 Collection 的元素

  • JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如 SetList)实现

  • 创建 Collection 集合的对象的方式

    • 多态的方式
    • 具体的实现类 ArrayList

Collection 集合的遍历

  • Iterator:迭代器,集合的专用遍历方式
    • Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的 iterator() 方法得到
    • 迭代器是通过集合的 iterator() 方法得到的,所以它是依赖于集合而存在的
  • Iterator 中常用的方法
    • E next():返沪迭代中的下一个元素
    • boolean hasNext():如果迭代具有更多元素,则返回 true

List

概述

  • 有序集合(也成为序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素并搜索列表中的元素。

  • Set 集合不同,列表通常允许重复的元素。

  • List 集合特点

    • 有序:存储和取出的元素顺序一致
    • 可重复:存储的元素可以重复

List 集合特有方法

方法名 说明
voidadd(int index,E element) 在此集合中的指定位置插入指定的元素
Eremove(int index) 删除指定索引处的元素,返回被删除的元素
Eset(int index,E element) 修改指定索引处的元素,返回被修改的元素
Eget(int index) 返回指定索引处的元素

并发修改异常

  • ConcurrentModificationException
  • 产生原因:迭代器遍历的过程中,通过调用集合对象的方法修改了集合中元素的长度,造成了迭代器获取元素中判断 预期修改次数实际修改次数 不一致。(迭代器只有在生成时获取了集合的长度,后面不再发生改变)
  • 解决方案:用 for 循环遍历,然后用集合对象调用相应的方法操作即可。

ListIterator

  • ListIterator:列表迭代器

  • 通过 List 集合的 listIterator() 方法得到,它是 List 集合特有的迭代器。

  • 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置。

  • ListIterator 中常用的方法:

    方法名 说明
    Enext() 继承自 Iterator 的实现类,返回迭代中的下一个元素
    booleanhasNext() 继承自 Iterator 的实现类,如果迭代中具有更多元素,则返回 true
    Eprevious() 返回列表中的上一个元素
    booleanhasPrevious() 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回 true
    voidadd(E e) 将指定的元素插入列表,同时更新迭代器中存储的集合的长度

增强 for 循环

  • 增强 for:简化数组和 Collection 集合的遍历

    • 实现 Iterable 接口的类允许其对象成为增强型 for 语句的目标
    • 它是 JDK5 之后出现的,其内部原理是一个 Iterator 迭代器
  • 格式:

    for(元素数据类型 变量名 : 数组或者Collection集合){
        //在此处使用变量即可,该变量就是元素
    }
    

LinkedList 集合的特有功能

方法名 说明
public voidaddFirst(E e) 在该列表开头插入指定的元素
public voidaddLast(E e) 将指定的元素追加到此列表的末尾
public EgetFirst() 返回此列表中的第一个元素
public EgetLast() 返回此列表中的最后一个元素
public EremoveFirst() 从此列表中删除并返回第一个元素
public EremoveLast() 从此列表中删除并返回最后一个元素

Set

概述

  • Set 集合特点
    • 不包含重复元素的集合
    • 没有带索引的方法,所以不能使用普通 for 循环遍历

哈希值

  • 哈希值:是 JDK 根据对象的地址或者字符串或者数字算出来的 int 类型的数值

  • Object 类中有一个方法可以获取对象的哈希值

    • public int hashCode():返回对象的哈希值
  • 对象的哈希值特点

    • 同一个对象多次调用 hashCode() 方法返回的哈希值是相同的
    • 默认情况下,不同对象的哈希值是不同的,而重写 hashCode() 方法,可以实现让不同对象的哈希值相同

HashSet 集合

  • HashSet 集合特点

    • 底层数据结构是哈希表
    • 对集合的迭代顺序不作任何保证,相对于不保证存储和取出的元素顺序一致
    • 没有带索引的方法,不能使用普通 for 循环遍历
    • 由于是 Set 集合,所以不包含重复元素的集合
  • HashSet 添加一个元素(调用 add() 方法)的过程:

    哈希表存储流程.png

  • HashSet 集合存储元素:

    • 要保证元素的唯一性,需要重写 hashCode() equals()

哈希表数据结构

  • JDK8 之前,底层采用数组 + 链表实现,可以说是一个元素为链表的数组

  • JDK8 之后,在长度比较长的时候,底层实现了优化。

  • 哈希表存储结构图如下:

    哈希表存储结构.png

LinkedHashSet 集合

  • LinkedHashSet 集合特点
    • 哈希表链表实现是 Set 接口,具有可预测的迭代顺序
    • 由链表保证元素有序,也就是说元素的存储和取出的顺序是一致的
    • 由哈希表保证元素唯一,也就是说没有重复的元素

TreeSet 集合

  • TreeSet 集合特点

    • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法

      • TreeSet():根据其元素的自然顺序进行排序
      • TreeSet(Comparator comparator):根据指定的比较器进行排序
    • 没有带索引的方法,所以不能使用普通 for 循环遍历

    • 由于是 Set 集合,所以不包含重复元素的集合

自然排序 Comparable

  • TreeSet 集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
  • 自然排序,就是让元素所属的类实现 Comparable<E> 接口,重写 compareTo(T o) 方法
  • 重写方法时,需要注意排序规则必须按照要求的主要条件和次要条件来写

比较器排序 Comparator

  • TreeSet 集合存储自定义对象,无参构造方法使用的是比较器排序对元素进行排序的
  • 比较器排序,就是让集合构造方法接收 Comparator<E> 的实现类对象(可使用匿名内部类方法),重写 compare(T o1,T o2) 方法

泛型

概述

  • 泛型:是 JDK5 中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型

  • 泛型的本质参数化类型,也就是说所操作的数据类型被指定为一个参数

  • 参数化类型是指将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型,这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口

  • 泛型的定义格式

    <类型>:指定一种类型的格式,这里的类型可以看成是形参
    <类型1,类型2,...>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型可以看成是形参
    将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
    
  • 泛型的好处

    • 把运行时期的问题提前到了编译期间
    • 避免了强制类型转换

泛型类

  • 泛型类的定义格式

    修饰符 class 类名<类型>{}
    范例:public class Generic<T>{}
    	此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
    

泛型方法

  • 泛型方法的定义格式

    修饰符 <类型> 返回值类型 方法名(类型 变量名){}
    范例:public <T> void show(T t){}
    

泛型接口

  • 泛型接口的定义格式

    修饰符 interface 接口名<类型>{}
    范例:public interface Generic<T>{}
    

类型通配符

  • 类型通配符<?>

  • List<?>:表示元素类型未知的 List,它的元素可以匹配任何类型

  • 这种带通配符的 List 仅表示它是各种泛型 List 的父类,并不能把元素添加到其中

  • 当只需要它代表某一泛型的父类,可以使用类型通配符的上限

    • 类型通配符上限<? extends 类型>
    • List <? extends Number>:它表示的类型是 Number 或者其子类型
  • 当只需要它代表某一泛型的子类,可以使用类型通配符的下限

    • 类型通配符下限<? super 类型>
    • List <? super Number>:它表示的类型是 Number 或者其父类型

可变参数

  • 可变参数又称参数个数可变,用作方法的形参出现,则方法参数个数就是可变的

  • 可变参数的格式

    修饰符 返回值类型 方法名(数据类型... 变量名){}
    范例:public static int sum(int... a){}
    
  • 注意事项:

    • 可变参数的变量其实是一个数组
    • 如果一个方法有多个参数,包含可变参数,可变参数要放在后面

可变参数的使用

  • Arrays 工具类中有一个静态方法:

    public static <T> List <T> asList(T... a):返回由指定数组支持的固定大小的列表
    
  • List 接口中有一个静态方法:

    public static <E> List <E> of(E... elements):返回包含任意数量元素的不可变列表
    
  • Set 接口中有一个静态方法:

    public static <E> Set <E> of(E... elements):返回一个包含任意数量元素的不可变集合
    

Map

概述

  • Map 集合接口的格式:

    Interface Map<K,V>  K:键的类型;V:值的类型
    
  • 键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值

Map 集合的基本功能

方法名 说明
Vput(K key,V value) 添加元素,当出现重复 key 时,上一个 value 会被覆盖
Vremove(Object key) 根据键删除键值对元素
voidclear() 移除所有的键值对元素
booleancontainsKey(Object key) 判断集合是否包含指定的
booleancontainsValue(Object value) 判断集合是否包含指定的
booleanisEmpty() 判断集合是否为空
intsize() 集合的长度,也就是集合中键值对的个数

Map 集合的获取功能

方法名 说明
Vget(Object key) 根据获取
Set<K> keySet() 获取所有键的集合
Collection<V> values() 获取所有值的集合
Set<Map.Entry<K,V> >entrySet() 获取所有键值对对象的集合

Map 集合的遍历

  • 方式一:

    • 获取所有键的集合,用 keySet() 方法实现
    • 遍历键的集合,获取到每一个键,用增强 for 实现
    • 根据键去找值,用 get(Object key) 方法实现
  • 方式二:

    • 获取所有键值对对象的集合,用 entrySet() 方法实现
    • 遍历键值对对象的集合,得到每一个键值对对象,用增强 for 实现,得到每一个 Map.Entry(Map 对象)
    • 根据键值对对象获取
      • getKey() 得到键
      • getValue() 得到值

Collections

概述

  • Collections 是针对集合操作的工具类

Collections 类的常用方法

方法名 说明
public static <T extends Comparable<? super T>> voidsort(List<T> list) 将指定的列表按升序排序
public static voidreverse(List<?> list) 反转指定列表中元素的顺序
public static void shuffle(List<?> list) 使用默认的随机源随机排列指定的列表
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 集合
    14 引用 • 8 回帖
  • Map
    9 引用 • 12 回帖
  • 泛型
    7 引用 • 7 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...