Java 集合 笔记

体系

  • Collection接口
    • List接口:按照顺序插入数据,可重复
      • ArrayList实现类
      • LinkedList实现类
    • Set接口:不可重复的集合
      • HashSet实现类:无序、不可重复、无索引
      • LinkedHashSet实现类:有序、不可重复、无索引
      • TreeSet实现类:可排序、不可重复、无索引
    • Queue接口:队列
      • LinkedList实现类
      • ArrayBlockingQueue实现类
      • PriorityQueue实现类
  • Map接口
    • HashMap实现类
    • Hashtable实现类

在这里插入图片描述
在这里插入图片描述

ArrayList

底层通过数组实现,可理解为扩容数组

ArrayList的插入,可能涉及数组元素的移动、扩容

创建ArrayList对象

不传递类型参数和长度参数,直接构造:ArrayList list = new ArrayList();

此时list可以包含各种类型的数据,底层是长度为0的数组
请添加图片描述
可以传入长度参数,指定数组初始长度:ArrayList list = new ArrayList(10);

可以传入另一个同类型集合作为参数

⚠️ArrayList扩容机制:无参构造时,创建长度为0的数组,第一次add时,底层创建长度为10的数组。存满时,扩容1.5倍,如果1.5倍还不够存,那么以新数组的实际长度为准

常用方法

  • add(e):末端添加数据e
  • add(i, e):索引i位置增加元素e
  • addAll(Collection c):把集合c中的元素全加进调用的对象
  • size():集合中元素个数
  • get(i):获取索引i位置处的元素
  • set(i, e):设置索引i处元素为e(有返回值,是修改前的值
  • remove(i):删除索引i处的元素(有返回值,是删除的元素值
  • 可用enhance for遍历
  • indexOf(e):返回e第一个索引,若不存在,返回-1
  • lastIndexOf(e):返回e最后一个索引,若不存在,返回-1
  • boolean contains(e):是否存在e
  • boolean isEmpty()ture表示集合空
  • clear():清空
  • toArray():把集合变成数组类型
  • clone():复制新对象

请添加图片描述

LinkedList

底层是双链表实现,查询慢,增删快

创建LinkedList对象

ArrayList类似,不再赘述

常用方法

添加元素

  • add(e):在末端添加元素e
  • add(i, e):在索引i位置添加元素e
  • pop(e):在链表最前面添加元素e
  • addFirst(e):头插e
  • addLast(e):尾插e
  • addAll(Collection c):将c中的数据都添加

获取元素

  • get(i):获取索引i位置处的元素
  • getFirst():获取第一个元素
  • getLast():获取最后一个元素
  • 可用enhance for按顺序遍历
  • contains(e):是否包含元素e
  • indexOf(e):获取e的第一个索引
  • lastIndexOf(e):获取e的最后一个索引

修改元素

  • set(i, e):将索引i的元素设置为e

删除元素

  • remove():默认删除第一个元素
  • pop():弹出第一个元素
  • remove(i):删除索引i位置
  • remove(e):删除元素e
  • removeFirst()
  • removeLast()
  • clear():清空

其他

  • size():获取长度
  • isEmpty()“:是否为空

补充 比较器

ArrayListLinkedList有排序方法sort(),对于一维数组可以实现默认升序

我们可以自己指定排序方式,需要传入比较器类对象,这个类必须实现Comparator接口,重写compare方法

compare方法需要指定类型参数,返回一个int,传入Object对象o1o2。返回0表示两个对象值“相等”;返回正数,说明o1>o2,那么o1要排到o2后面,实际就是降序;返回负数,说明o1<o2o1排在o2前面,就是升序

请添加图片描述


HashSet

特点:无序存储,保证集合中元素唯一,不重复

底层是数组+链表(JDK 8 以前),数组+链表+红黑树(JDK 8开始),元素加入HashSet时,通过哈希算法计算应该存储的位置。采用一定方法解决冲突(数组+链表,拉链法)

哈希值:根据hashCode()方法计算出来的整数值。该方法定义在Object类中,所有对象都可以调用,默认用地址值进行计算;一般情况会重写hashCode()方法

在这里插入图片描述

  1. 达到装填因子时,扩容为原来的两倍
  2. 链表长度>8,并且数组长度>=64,转化为红黑树
  3. 自定义类型,必须重写euqalshashCode方法

常用方法

创建

  • Set<Integer> set = new HashSet<Integer>(); 可以不指定类型参数,存储任意类型

添加元素

  • add(e):将元素e添加
  • addAll(Collection c):将集合c里面的元素添加进去

访问元素

  • enhance for遍历

删除元素

  • remove(e):删除元素e
  • clear():清空

其他

  • isEmpty():判断集合是否为空
  • contains(e):判断集合是否包含e
  • clone():克隆对象

LinkedHashSet

底层还是哈希表,但增加了双链表机制,保证有序:存储和读取的顺序相同

TreeSet

底层:采用红黑树实现。(不需要重写hashCodeequals

不可重复、无索引。

支持排序

  1. 默认按照元素从小到大的顺序排,对于IntegerDouble,按照值从小到大排;对于字符串、字符类型,按照ASCII数字顺序
  2. 自定义类型的对象排序,需要让类实现Comparable接口,重写compareTo方法,否则添加入TreeSet会报错

在这里插入图片描述

  1. 构造TreeSet的时候,传递比较器,实现Comparator接口,重写compare方法

Queue

实现类包括LinkedListArrayBlockingQueuePriorityQueue

ArrayBlockingQueue底层是数组,构造时需要传入参数,指定长度。队列满无法再入队

LinkedList是链队

PriorityQueue是优先队列,小顶堆

常用方法

  • add / offer:队尾添加元素。对于长度有限制的队列,队列满时,add会抛出uncheck异常,offer会返回false
  • remove / poll:移除队头元素,并返回该元素。队列空时,remove会抛出异常,poll会返回null
  • element / peek:返回队头,但是不删除。队列空时,和上述类似
  • isEmpty:判断队列是否为空
  • size:返回队列长度
  • contains(e):判断是否包含元素e
  • clear():清空队列

HashMap

底层和HashSet一样

存储对象是K-V(键值对)

常用方法

添加 / 修改数据

  • put(key, value):将K-V添加。(覆盖原本的值,可以用于修改数据,返回被修改之前的值
  • putIfAbsent(key, value):如果不存在key,那么插入K-V;如果存在,不做任何操作
  • replace(key, value):修改key对应的value,返回修改前的值。不存在key的话,不做修改

获取数据

  • get(key):获取key对应的value
  • getOrDefault(key, defaultValue):获取key对应的value,如果不存在key,则返回defaultValue
  • containsKey(key):判断是否存在key
  • isEmpty():判断是否空

删除数据

  • remove(key):移除key对应的键值对
  • remove(key, value):删除特定的key-value,必须完全正确才能删除
  • clear():清空

获取对象

  • Set keySet():返回key组成的集合
  • Collection values():返回value组成的集合
  • Set<Map.Entery<1,2>> entrySet():获取键值对对象的集合。可以再用getKey()getValue()获取键值

请添加图片描述

LinkedHashMap

底层和HashMap一样,在此基础上,增加了双链表,保证有序:数据存储和取出顺序一致

TreeMap

底层和TreeSet一样,采用红黑树

特性由key决定:不重复、可排序、无索引

排序实现:

  1. 实现Comparable接口,重写compareTo方法
  2. 构造时传入构造器,实现Comparator接口,重写compare方法

Hashtable

区别于HashMap

  1. 实现方式不一样,继承的父类不同
  2. 底层结构的容量不同,默认HashMap(16)、Hashtable(11)
  3. HashMap的K-V可以是null,而Hashtable不可以
  4. HashMap线程不安全,效率高;Hashtable相反
  5. HashMap数据存储采用Hash算法,而Hashtable采用hashcode

补充:迭代器Iterator

迭代器是集合专用的遍历方式,类为Iterator

集合获取迭代器对象

  • Iterator<E> iterator()方法:获取迭代器,默认指向当前集合的0索引

Iterator中的常用方法

  • boolean hasNext():检查当前位置是否存在元素
  • E next():获取当前位置的元素,并将迭代器移向下一个位置
  1. NoSuchElementException异常:当前指向位置没有元素
  2. 迭代完后,指针不会复位
  3. 迭代过程中,不要使用集合的方法进行增删

请添加图片描述

Collections工具类

常用API

  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合c批量添加elements
  • public static void shuffle(List<?> list):打乱List集合元素的顺序

在这里插入图片描述

不可变集合

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值