Java集合的学习笔记与总结

本文详细介绍了Java集合框架中的List、Set接口及其常见实现类,如ArrayList、LinkedList、HashSet、TreeSet的特性、存储结构、操作方法和扩容机制。同时,讲解了Map接口及HashMap、TreeMap的特点,以及泛型在类、接口、方法中的应用。此外,还提及了迭代器Iterator和ListIterator的使用,并探讨了集合操作的关键方法,如添加、删除、查找等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合种类

集合的父接口有两个,一个是Collection接口,另一个是Map接口。

List的特点

  1. 有序
  2. 有下标
  3. 元素可重复

Set的特点

  1. 无序
  2. 无下标
  3. 元素不能重复

List的实现类

  1. ArrayList
  2. LinkedList
  3. Vector

Set的实现类

  1. HashSet
  2. SortSet中的TreeSet

Collection父接口

方法

  • boolean add(Object obj) 添加一个对象
  • boolean addAll(Collection c) 将一个集合中的所有对象添加到此集合中
  • void clear() 清空元素
  • boolean contains(Object o) 检查集合是否包含对象
  • boolean equals(Object o) 比较集合是否与指定对象相等
  • boolean isEmpty() 判断集合是否为空
  • boolean remove(Object o) 在集合中移除o对象
  • int size() 返回集合中元素个数
  • Object[] toArray() 将列表转为数组
  • Iterator iterator() 迭代器
对于迭代器Iterator的使用
  1. 创建一个Iterator接收迭代器
  2. Iterator中的方法:
方法名作用
hasnext判断迭代器是否还有元素
next返回迭代的下一个元素
remove移除当前元素

注意事项:在迭代过程中不可以使用collection中的方法。

List子接口

方法

  • void add(int index,Object o) 在index下标插入对象o
  • boolean addAll(int index,Collection c) 将一个集合中的元素添加到此集合中index的位置
  • Object get(int index) 返回指定位置的元素
  • List subList(int fromIndex, int toIndex) 返回两个index之间的元素(不包括右边界)
  • ListIlterator listIterator() 列表迭代器
  • ListIlterator listIterator(int index) 列表迭代器,从指定位置开始
  • E set(int index,E element) 替换元素
迭代器ListIterator

特点

  1. 允许按任一方向遍历列表
  2. 迭代期间修改列表
  3. 获得迭代器在列表中的当前位置
  4. 无当前元素,光标位置位于previous()和next()之间

方法

返回值方法名参数作用
voidaddE指定元素插入列表
booleanhasNext/判断下一个元素是否存在
booleanhasPrevious/判断上一个元素是否存在
Enext/下一个元素
intnextIndex/返回下一个的索引
Eprevious/上一个元素
intpreviousIndex/返回上一个的索引
voidremove/删除元素
voidsetE替换元素

List实现类

ArrayList

特点:

  1. 数组结构实现,查询快、增删慢
  2. 运行效率快、线程不安全
Vector

特点:

  1. 数组结构实现,查询快、增删慢
  2. 运行效率慢、线程安全
LinkedList

特点:

  1. 链表结构实现,增删快、查询慢

ArrayList

属性:

属性默认值作用
DEFAULT_CAPACITY10添加了元素以后才会改变默认容量为10
elementDatanull当使用无参构造方法创建ArrayList的时候,会自动让这个数组等于DEFAULTCAPACITY_EMPTY_ELEMENTDATA,默认容量为0
size0实际元素个数
EMPTY_ELEMENTDATA{}空数组实例

扩容机制:

先增加容量,再让最后一个位置放入新元素(第一个元素插入后会默认把容量变为10,后续扩容都会变成上一次的1.5倍) 核心代码:

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
}

LinkedList

存储结构: 双向链表

扩容机制:

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

LinkedList和ArrayList的区别:

  1. 结构实现方式不同
  2. 插⼊和删除是否受元素位置的影响
  3. 内存空间占⽤

Set子接口

方法:

全部继承自Collection中的方法

Set实现类

HashSet
  1. 基于HashCode实现元素不重复
  2. 当存入元素的HashCode相同时,会调用equals来确认,如果结果为true,则拒绝存入
TreeSet
  1. 基于排列顺序实现元素不重复
  2. 实现SortedSet接口,对集合元素自动排序
  3. 元素对象的类型必须实现Comparable接口,指定排序规则
  4. 通过CompareTo方法确定是否为重复元素

HashSet

存储结构: 哈希表(jdk1.8之后 数组+红黑树) 使用HashMap

存储过程:

  1. 根据hashcode计算保存的位置,如果为空,直接保存,不为空则执行下一步
  2. 调用equals方法,如果equals方法为true,则认为是重复,不允许加入,否则,形成链表(红黑树)

注意事项: 使用equals和hashcode的方式判断是否重复(所以部分对象需要重写)

TreeSet

存储结构: 红黑树 使用TreeMap

存储过程: 根据元素的大小分布在节点的左右

注意事项: 元素对象必须实现Comparable接口(需要制定泛型),重写CompareTo方法从而制定排序规则 (用CompareTo方法判断是否重复)

定制比较器comparator(让元素不需要实现comparable接口)

在这里插入图片描述

Map体系

Map的实现类

  1. HashMap
  2. SortedMap接口下的TreeMap

Map接口的特点:

  1. 用于存储任意键值对(K-V)
  2. 键: 无序、无下标、不允许重复
  3. 值: 无序、无下标、允许重复

Map接口常用方法

  • V put(K key,V value) 存储对象 key重复则覆盖原值
  • Object get(Object key) 根据键获取对应的value
  • Set keySet() 返回所有key
  • Collection values() 返回所有vaue的集合
  • Set<Map.Entry<K,V>> entrySet() 返回键值匹配的Set集合
  • boolean containsKey(Object key) 判断是否有此key
  • boolean containsValue(Object value) 判断是否有此value
  • boolean equals(Object o) 比较是否相等

EntrySet()使用方法

调用EntrySet方法会返回一个Set集合里面是Map.Entry类型,此类型封装了key和value。

HashMap

存储结构: 数组+红黑树

默认初始容量: 16

默认记载因子(当实际容量等于总容量75%的时候实行扩容机制): 0.75

对于键判断重复的机制: 使用equals和hashcode的方式判断是否重复(所以部分对象需要重写)

线程不安全

属性

属性默认值作用
DEFAULT_INITIAL_CAPACITY16默认容量(添加第一个元素后才会使用该容量)
MAXIMUM_CAPACITY2的30次方最大容量
DEFAULT_LOAD_FACTOR0.75默认加载因子
TREEIFY_THRESHOLD8当数组长度大于MIN_TREEIFY_CAPACITY并且链表长度大于该值时,HashMap的结构从数组+链表转换为数组+红黑树
UNTREEIFY_THRESHOLD6当树的元素少于该值时,HashMap的结构从数组+红黑树转换为数组+链表
MIN_TREEIFY_CAPACITY64当数组长度大于该值并且链表长度大于TREEIFY_THRESHOLD时,HashMap的结构从数组+链表转换为数组+红黑树

总结

  1. HashMap创建时,为了节省空间,添加第一个元素时,table容量调整为16
  2. 当元素个数大于阈值时,会进行2n扩容,目的是减少调整元素的个数
  3. jdk1.8后 每个链表长度大于8,且元素个数大于64时,会调整为红黑树,提高执行效率
  4. jdk1.8后 当红黑树元素小于6时,调整成链表

Hashtable

特点: 线程安全,运行效率慢;不允许null作为key或者value

子类: Properties

要求key和value都是String,通常用在配置文件读取


泛型

泛型类

语法: 类名****

注意事项: 泛型不能使用new来创建对象(构造方法可能为私有的)

泛型接口

语法: 接口名

注意事项: 可以创建静态常量 但不可以是泛型静态常量

泛型方法

**语法:**修饰符 返回值类型 方法名()

注意事项: 调用的时候会根据传入的数据自动判断类型(也可以在方法面前通过<>来指定类型)

泛型集合

语法: 集合类型

Collections工具类

方法

  • public static void reverse(List<?> list) 反转集合中元素的顺序
  • public static void shuffle(List<?> list) 随机重置集合元素的顺序
  • public static void sort(List<?> list) 升序排序(元素类型必须实现comparable接口)
  • public static int binarySearch(List<? extends Comparable<? super T>> list, T key) 二分查找法,集合需要已经排好序
  • toArray(集合类型) list转换为数组 不可以是基本类型
  • Arrays.asList(集合类型) 数组转换为list 不可以是基本类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值