Map集合总览

List,Set,Map的区别

1.List和Set继承Collection接口
Map不继承Collection接口
2.List是有序的,可重复的
Set是无序的,不可重复的
(这是两者最容易记住的区别)
Map是用来存储(Key,Value)也就是键值对格式的集合

ArrayList,LinkedList,Vector的区别

**LinkedList:**采取双向循环链表实现,可以用来快速插入或者删除,但是不方便用来进行搜索,而且线程不安全.
**ArrayList:**采用动态数组实现,特点:搜索数据快
线程不安全
**Vector:**采用动态数组实现,特点:慢,但是线程安全,可以用枚举遍历
ArratList与Vector的区别
区别1: 采用动态对象数组实现的,但是底层数组的初始大小不同
ArrayList的 size() == 0
Vector的 size() == 10
区别2: 扩展容量的方式不同
ArrayList 第1次扩容为10,之后 原来size()+原来size()/2 也就是1.5倍
Vector 情况1:增量==0, 原来size()的2倍
情况2: 增量>0, 原来的size()+增量
ArrayList 和 Vector 不适合用于存储经常需要增加和删除
区别3: ArrayList 线程不安全,只适合于单线程,效率高
Vector 线程安全,当多线程的时候考虑使用

Collection和Collections的区别

Collection是接口,是List集合和Set集合的父接口
Collections是帮助类,这类提供一系列静态方法去操作集合对象。

Map集合

Collection是单列集合,一个元素
Map是双列集合,元素成对出现,每个元素由键(Key)和值(Value)两个部分组成
Map存储的是键值对
键(Key) 不可以重复
值(Value) 可以重复

经过查看API,发现Map也有很多实现类,学习常见4个实现类
1> HashMap<K,V> :底层采用哈希表+链表+红黑树实现
2> Hashtable<K,V>
3> LinkedHashMap<K,V>: 是HashMap的子类,在HashMap基础上确保了元素的链式存储记录存 储顺序
4> TreeMap<K,V>: 需要对存储的数据进行自定义排序
注意: Map有两个泛型 <K,V> 在使用的时候需要为它们指定数据类型 K,V 数据类型可以一样,也可以不一样
Map接口中的常用方法
V get(Object key) 根据key获取对应的值
V put(K key, V value) 向map集合中存入值 (注意,如果你要存入的值的Key存在Map集合中,那么你新存入的值会覆盖原本Map集合中的值)
V remove(Object key) 根据key删除键值对
default V replace(K key, V value) 使用新值替换指定key的值
int size() map 集合中键值对的个数
boolean containsKey(Object key) 判断map中是否包含指定key
boolean containsValue(Object value) 判断map集合中是否包含指定的值
boolean isEmpty() 判断map是否为空集合,当前仅当 size()==0

遍历map集合中数据(把map集合中数据输出)
方式1: 先获取所有key,再调用get根据key获取值 Set keySet()
//这个方法就是获取map的所有key的值
方式2: 直接获取键值对 Set<Map.Entry<K,V>> entrySet()
// 在Map接口,有一个内部接口 Entry 代表就是键值对
方式3: 不能获取key,只获取所有值的方法 Collection values()

HashMap

HasgMap的数据结构包含了:数组,链表,哈希表,树

**数组:**采用一段连续的存储单元来存储数据。对于指定下标的查询,时间复杂度O(1) 但是数组中间以及头部插入数据时,需要复制移动后面的元素,效率比较低。
**链表:**一种在物理存储单元上非连续、非顺序的存储结构,数据元素在逻辑顺序是 通过链表中的指针链次序实现的。 链表由一系列节点Node组成,节点可以在运行时动态生成。每个节点 都包含 “数据域” 和 “指针域” 由于链表不用按顺序存储,所以链表在插入数据的时候时间复杂度O(1) 但是查找一个节点或者访问特点编号的节点需要O(n)
哈希表:根据关键码值(key value) 直接进行访问的数据。 通过把关键码值映射到表中一个位置来访问记录 以加快查找的速度,这个映射函数称为哈希函数, 存放记录的表(数组)称为哈希表。
树:由n(n>=1) 个有限节点组成一个具有层次关系的集合
HashMap是Map接口中最常用的实现类
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
它是基于哈希表实现的, 继承了AbstractMap的抽象类,并且实现了Map接口,实现了克隆和序列化,所以可以被克隆和序列化
"哈希表" 将键的Hash值映射到内存地址,即根据键获取对应的值, 并将其存储到内存地址,也就是说HashMap是根据键 的Hash值来决定值的存储位置。
通过这种索引方式,HashMap获取数据的速度会非常快
但是会出现一个新问题,(哈希冲突)。
例如: 存储键值对 (x,“duan”)时,哈希表会通过"哈希函数f(x)“得到"duan” 的实现存储位置。 但是也会有新的问题。 如果再来一个(y,“chunfen”)时,哈希函数f(y)的哈希值和上面的f(x) 哈希值一样,这样发现一个问题 两个对象的存储地址冲突了,这种现象就被称为
"哈希冲突"

那么哈希表该怎么解决哈希冲突呢? 有
三种方式
解决
方式一:"开放地址法"
当发生哈希冲突时,如果哈希表没有被装满,说明在哈希表中必然有空的位置,那么可以把Key存放在冲突位置后面的空位置上。但是这种简单的办法也有缺陷,比如查找或者扩容
方式二:"再哈希法"
同义词产生的地址冲突是再进行计算另一个哈希函数的地址,直到冲突不在发生,这种方法不易产生聚集,但是增加了计算时间,如果不考虑时间成本并且对查询的元素要求极高的话,建议使用这种方式
方式三:"链地址法"
HashMap综合所有因素,采用"链地址法"解决哈希冲突
这种方法采用数组(哈希表)+链表的数据结构
当发生哈希冲突时,就要一个链表结构存储相同的Hash值的数据
采用除留余数法构造哈希函数,冲突解决采用链地址法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值