集合

  • 单列集合:Collection
    • List:可重复
      • ArrayList
      • LinkedList
    • Set:不可重复
      • HashSet
      • TreeSet
  • 双列集合:Map
    • HashMap

Collection

JDK不提供接口实现,提供子接口Set和List实现

add(E e):添加元素

remove(Object o):移除元素

clear:清空元素 contains(Object o):判断集合中是否存在指定元素

isEmpty():判断集合是否为空 size():集合长度,也就是集合中元素的个数

遍历

Iterator:迭代器,集合的专用遍历方式

  • Iterator iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
  • 迭代器依赖于集合而存在的

Iterator常用方法:

  • E next():返回迭代中的下一个元素
  • boolean hasNext():如果迭代具有更多元素,返回true

List(有序可重复)

add(int index,E element):在集合指定位置插入指定元素

remove(int index):删除指定索引处的元素,返回被删除的元素

set(int index,E element):修改指定索引处的元素,返回被修改的元素

get(int index):返回指定索引处的元素

并发修改异常

并发修改异常:

  • ConcurrentModificationException

产生原因:

  • 迭代器遍历过程中,通过集合对象修改了集合中元素的长度,造成迭代器获取元素中判断预期修改值和实际修改值不一致

解决方案

  • 用for循环遍历,然后用集合对象做对应的操作即可
ListIterator 列表迭代器

ListIterator允许程序员沿任一方向遍历列表,在迭代期间修改列表,并获取当前位置

ListIterator常用方法:

  • E previous():返回迭代中的上一个元素
  • boolean hasPrevious():如果迭代相反方向具有更多元素,返回true
  • add(E e):将指定的元素插入列表
增强for循环

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

格式:

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

内部本质是一个Iterator迭代器

List集合子类
  • ArrayList:底层数据结构是数组,查询快,增删慢
  • LinkedList:底层数据结构是链表,查询慢,增删快
    • addFirst|addLast():在列表开头或结尾增加元素
    • getFirst|getLast():返回第一个或最后一个元素
    • removeFirst|removeLast():删除并返回第一个或最后一个元素

Set(不重复)没有索引,不能for遍历

Set<String> set = new HashSet<>() 创建对象

HashSet:对集合的迭代顺序不做任何保证

哈希值

根据对象的地址或者字符串或数字算出来的int类型的数值

hashCode() 获取对象的哈希值

默认情况下,不同对象的哈希值是不同的。

通过方法重写可以实现不同对象哈希值相同

HashSet
  • 底层数据结构是哈希表
  • 迭代顺序不做保证
  • 没有索引方法,不能for循环遍历,可以fori
  • 不重复

HashSet集合保证唯一性原理:

如果哈希表未初始化,就进行初始化;

根据对象的哈希值计算对象的存储位置,该位置无元素则存储元素;

存入元素和之前元素对比哈希值:

​ 不同:继续执行,添加元素到集合

​ 相同:调用对象的equals()方法比较:

​ false:继续执行,元素添加到集合

​ true:元素重复,不存储

若要重复:需重写HashCode和equals方法

哈希表

元素为链表的数组

LinkedHashSet

哈希表和链表组成

TreeSet

间接的实现了Set接口;自然排序

  • 元素按照一定的规则进行排序,具体排序方式取决于构造方法
    • TreeSet():根据元素自然排序进行排序
    • TreeSet(Comparator comparator):根据指定比较器进行排序
  • 没有带索引的方法,不能使用普通的for循环遍历
  • 不包含重复元素

无参构造方法为自然排序

让元素所属的类实现Comparable接口,重写compareTo方法

重写方法时,注意排序规则按照要求的主要条件和次要条件

比较器排序Comparator
  • 用TreeSet集合存储自定义对象,带参构造方法使用比较器排序
  • 让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
  • 按照要求的主要次要排序条件

泛型

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

将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型

泛型格式:

  • <类型>:指定一种类型的格式,看作形参
  • <类型1,类型2>:指定多种类型的格式,用逗号隔开,看作形参
  • 将来具体调用的时候给定的类型可以看成实参,并且实参的类型只能是引用数据类型
泛型类
  • 格式:修饰符 class 类名<类型>{}
  • 范例:public class Generic{}
泛型方法
  • 格式:修饰符 <类型> 返回值类型 方法名(类型 变量名){ }
  • publc void show(T t){ }
类型通配符

为了表示各种泛型List的父类,使用类型通配符

  • 表示各种类型的泛型的父类
  • 通配符上限:<? extend 类型> 表示类型及其子类型
  • 通配符下限:<? super 类型> 表示类型及其父类型

Map

概述:

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

put(K key,V value):添加元素

remove(Object key):根据键删除键值对元素

clear():移除所有键值对元素

containsKey(Object Key):判断集合是否包含指定的键

containsValue(Object value):判断集合是否包含指定的值

isEmpty():判断集合是否为空

size():集合的长度,也就是集合中键值对的个数

Map集合的获取功能:

  • V get(Object key) 根据键获取值
  • SetkeySet() 获取所有键的集合
  • Collection values() 获取所有值的集合
  • Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合

Collections

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

常用方法:

  • public static <T extends Comparable<? super T>> void sort(List list):将指定列表按升序排列
  • public static void reverse(List <?> list):反转指定列表中元素的顺序
  • public static void shuffle(List <?> list):使用默认的随机源随机排序指定的列表