java-----集合


在这里插入图片描述

1.集合概况

1.1 接口

顶级接口:Collection和map接口,Collection接口存储的单个对象,map存储的使key-value键值对对象
Collection顶级接口下的子接口:

  • 1.list接口:存储的数据有序且重复
  • 2.set接口:存储的数据使无序的且不能重复
  • 3.Queue接口:多使用优先级处理

1.2 List接口

List接口实现类共有特征:
1.数据有序
2.数据可以重复
3.数据可以为null

1.2.1 ArrayList类

1.基本特点:

  • 数据插入有序
  • 数据是可以重复的
  • 存储的数据可以为null
  • 数据结构为数组
  • 集合可以自动扩大

2.自定义实现
3.源码剖析(JDK版本基于1.7实现):

  • 继承关系
  • 属性即默认值
  • 构造函数
  • 底层数据结构
  • 扩容机制
  • 常用方法:add()、remove()、get()
    4.应用场景
    (数据是有序/数据可以重复/数据是可以存储空)在查询较高的场景

1.2.2 LinkedList类

1.基本特点

  • 底层是通过链表实现

2.源码剖析:

  • 结构:采用的是双向链表
  • 插入节点Node,删除节点

3.应用场景
(数据是有序/数据可以重复/数据是可以存储空)在修改比较高的场景下

1.2.3 Vector类

线程安全集合类
与ArrayL也是通过数组实现的,Vector支持线程的同步

2.Map接口

2.1 HashMap类

1.特点:

  • 底层数据结构是hash表(数组+链表)
  • 元素重复问题:(key是不能重复,value可重复)
  • 元素有序问题:插入时无序的
  • 元素是否可以为空:key和value都可以为空
  • 默认大小:16
  • 扩容大小:2倍关系扩容

2.重点

  • 元素如何插入?add()
  • 如何移除元素?remove()

3.应用场景
数据统计场景

2.2 LinkedHashMap类

1.特点:

  • 底层数据结构是哈希表
  • 继承自HashMap:具有HashMap所有的特点
  • 数据有序:插入有序,访问有序

2.重点:
如何做到数据有序?添加两个属性:维护一个双向的链表接口
3.应用场景
数据统计且数据有序(统计数据出现的次数且如果数据次数相等按照插入顺序)

2.3 HashTable类

1.特点:

  • 底层数据结构是哈希表
  • 数据重复问题:(key不能重复,value可以重复)
  • 元素是否可以为null:key和value都不能为null
  • 数据有序问题:数据无序
  • 线程安全:HashTable是线程安全的
  • 默认大小:11
  • 扩容大小:2倍+1

2.HashMap和HashTable和ConcurrentHashMap的区别?

  • HashMap线程不安全,数组+链表+红黑树
  • HashTable线程安全,锁住整个对象,数组+链表
  • ConcurrentHashMap线程安全,CAS+同步锁,数组+链表+红黑树
  • HashMap的key、value均可为null。而其他的两个类不支持
    3.应用场景:数据统计问题(考虑线程安全问题时只能用该集合)

2.4 WeakHashMap类

1.特点:

  • 数据随着时间推移会消失或减少

2.java中四种引用

  • 强引用(strong):强引用所作用对象在内存不足抛出OOM的问题时都不会回收作用的对象
  • 软引用(soft):当内存不足时,在发生GC操作时,软引用所作用的对象会被回收
  • 弱引用(weak):只要发生GC操作,无论内存是否充足,弱引用所作用对象会被回收
  • 虚引用(phantom):和对象的生命周期无关,主要是来提醒对象被回收

3.应用场景:在内存紧张情况下,将非关键信息存放在该集合中

2.5 TreeMap类

1.特点:

  • 数据会按照属性的特征进行排序
  • 底层的数据结构:使用红黑树

2.应用场景
数据排序

3.set接口

3.1 HashSet类

1.特点:

  • HashSet实现基于HashMap:具有HashMap 所有特点
  • 数据不能重复
  • 可以存储null值
  • 数据是无序的

2.重点:
如何通过HashMap实现HashSet?
HashMap中存储key-value键值对,set接口的实现类都是存储单种类型的元素,set的实现中使用了HashMap中的key来存储元素,Value值给定的是一个Object对象填充。
3.应用场景
数据去重场景

3.2 LinkedHashSet类

1.特点

  • LinkedHashSet是基于LinkedHashMap实现的
  • 元素是不能重复的
  • 可以存储null值
  • 数据是有序的(插入和访问有序)
    2.应用场景
    数据去重且数据有序

3.3 TreeSet类

1.特点:

  • TreeSet是基于TreeMap实现的
  • 数据元素是按照属性进行排序的
    2.应用场景
    数据去重且按照属性特征大小排序

4.Queue接口

4.1 PriorityQueue类

1.特点

  • 底层数据结构是堆结构,默认是小根堆
  • 优先级队列保证取出的数据都是队列最小/最大的
    2.重点:
    小根堆的插入元素和删除元素的移动过程
    3.应用场景
    Top k 问题

5.其他

5.1迭代器(Iterator)

5.1.1迭代器介绍

迭代器提供了一种访问集合/容器的访问方式,而不用暴露容器内部实现细节,是一种设计模式

5.1.2 迭代器的使用(3个方法)

1.next():获取当前元素
2.hasNext():判断是否有下一个元素
3.remove():删除当前元素

5.1.3 自定义迭代器

1.集合要具有迭代器功能需要在集合类上实现Iterable接口,该接口就含有iterator()方法
2.自定义类该类实现Iterable接口,该接口是包含迭代器三个方法
3.在iterator()方法中实现实例化第二部自定义类

5.1.4 扩展点

1.Iterable接口在所有集合中都可以使用,ListIterable是List接口下特有的迭代器
2.Map接口中的迭代器使用:以键值对(entrySet方法)、以键形式(keys方法)、以值形式(Value)遍历
3.在通过迭代器遍历时删除抛出ConcurrentModificationException异常问题

5.2比较器

重点:
comparable和comparator区别?(treeMap/treeSet/priorityqueue)都使用比较器

5.3 工具类(Collections)

线程安全的方法,二分查找…

今天也要好好学习呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿可可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值