Java集合的学习笔记与总结

集合种类

集合的父接口有两个,一个是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 不可以是基本类型
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值