**前言:**兄弟们你的三连是对我最大的鼓励。下次一定嘿嘿
我会努力认真的完成后续的文章的,希望可以帮到需要的人。
我也是特别懒惰,动不动就刷短视频就是小半天,哎呀,要自觉自觉。
接下来的文章内容来源于
[硅谷学习路线](2021年度全网最全Java学习路线 - 哔哩哔哩 (bilibili.com))
Map集合接口
概念
Map与Collection并列存在。用于保存具有映射关系的数据:key-value
Map 中的 key 和 value 都可以是任何引用类型的数据
Map 中的 key 用Set来存放,不允许重复,value是可以重复的
常用String类作为Map的“键”
key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value
Map结构的理解
- Map中的key:无序的,不可重复。
- Map中的values:无序的,可以重复。
- Map的Key和Values都是放入在Entry中的。每一个Entry都表示一个Map的数据。
- Entry是无序的不可重复。
Map源码
使用set存放Entry
Entry属于Map的内部接口
我自己通过HashMap源码看到存储的都是Node类
Node类实现类Entry接口
Map接口的继承树
Map接口的常用实现类:HashMap、TreeMap、LinkedHashMap和 Properties。
其中,HashMap是 Map 接口使用频率最高的实现类
Map常见的方法
新增,修改,删除操作
方法 | 描述 |
---|---|
Object put(Object key,Object value) | 将指定key-value添加到(或修改)当前map对象中 |
void putAll(Map m) | 将m中的所有key-value对存放到当前map中 |
Object remove(Object key) | 移除指定key的key-value对,并返回value |
void clear() | 清空当前map中的所有数据 |
查询操作
方法 | 描述 |
---|---|
Object get(Object key) | 获取指定key对应的value |
boolean containsKey(Object key) | 是否包含指定的key |
boolean containsValue(Object value) | 是否包含指定的value |
int size() | 返回map中key-value对的个数 |
boolean isEmpty() | 判断当前map是否为空 |
boolean equals(Object obj) | 判断当前map和参数对象obj是否相等 |
转换成Collection集合
方法 | 描述 |
---|---|
Set keySet() | 返回所有key构成的Set集合 |
Collection values() | 返回所有value构成的Collection集合 |
HashMap
HashMap是 Map 接口使用频率最高的实现类。
允许使用null键和null值,与HashSet一样,不保证映射的顺序。
所有的key构成的集合是Set:无序的、不可重复的。所以,key所在的类要重写: equals()和hashCode()
所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类 要重写:equals()
一个key-value构成一个entry,所有的entry构成的集合是Set:无序的、不可重复的
JDK7的存储结构
JDK 7及以前版本:HashMap是数组+链表结构(即为链地址法)
创建实例之后,底层出现长度为16的一维数组 Entry[]
添加元素,首先调用Key值,计算出Key的hashcode。通过算法函数获取存放在数组的位置
如果数组位置上存在值,两个key的hashcode进行比较。成功则添加到该数组的链表上
如果hashcode不成功,两个key进行equal()比较如果为false那么添加成功
如果equals()为true,则代替前一个key的value值
JDK8
JDK 8版本发布以后:HashMap是数组+链表+红黑树实现。
创建实例的时候刚开始并没有创建数组,在添加第一个元素的时候进行添加数组长度16
JDK8底层数组并不是Entry[],而是Node[] 也就是上面我的源码截图
JDK8底层结构还存在红黑树
当数组中某一个索引位置上 链表的数据>8 且当前数组的长度>64 此时
此时所以上面的链表变为红黑树。
为什么变为红黑树
以为链表之间的比较每次都是一个一个比较
红黑树,通过比较大小,每一次都是比较掉一般数据量
下面尚硅谷的课程中开始对JDK7和JDK8源码的细致介绍。这里我介绍不会有视频细致。这一段建议看看视频
LinkedHashMap
LinkedHashMap 是 HashMap 的子类
在HashMap存储结构的基础上,使用了一对双向链表来记录添加 元素的顺序
与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代 顺序:迭代顺序与 Key-Value 对的插入顺序一致
LinkedHashMap中的内部类:Entry
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
Hashtable
Hashtable是个古老的 Map 实现类,JDK1.0就提供了。不同于HashMap, Hashtable是线程安全的。
Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构,查询 速度快,很多情况下可以互用。
与HashMap不同,Hashtable 不允许使用 null 作为 key 和 value
与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
Hashtable判断两个key相等、两个value相等的标准,与HashMap一致。
Properties
Properties 类是 Hashtable 的子类,该对象用于处理属性文件
由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型
存取数据时,建议使用setProperty(String key,String value)方法和 getProperty(String key)方法
Properties类(配置文件)
它可以实现读取Java配置文件,(我们把常用的配置信息写在配置文件中方便修改)
创建一个文件
name=wsl
age=21
sex=男
public class PropertiestestRead {
public static void main(String[] args) {
// 创建Properties对象用来读取文件
Properties properties = new Properties();
try {
// 使用文件输入流进行读取文件 指定文件位置
FileInputStream fileInputStream = new FileInputStream("G:\\IDEAworksapce01\\TrycatchTest\\src\\main\\resources\\PropertiesTest.properties");
//System.out.println(fileInputStream);
// 将输入流放入Properties对象中
properties.load(fileInputStream);
// 读取文件,指定键值对获取值
String name = properties.getProperty("name");
System.out.println(name);
fileInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (Exception e){
}finally {
}
}
}
Properties常用方法
返回值 | 方法名 | 描述 |
---|---|---|
String | getProperty(String key) | 用指定的键在此属性列表搜索指定的属性 通过key得到指定的值 |
Object | setProperty(String key,String value) | 调用Hashtable的方法Put。通过调用基类的Put方法来设置 键值对 |
Void | load(InputStream inStream) | 从输入流中读取属性列表(键和元素对)通过指定文件进行转载获取该文件中所有键-值对 |
Void | clear() | 清除所装在的键-值对该方法有基类(Hashtable)提供 |
Collcetions的工具类
这里的类和接口多了一个s注意哦
工具类说白了就是提供了一个API进行调用可以方便我们的开发
Collections工具类常见方法
方法 | 描述 |
---|---|
reverse(List) | 反转 List 中元素的顺序 |
shuffle(List) | 对 List 集合元素进行随机排序 |
sort(List) | 根据元素的自然顺序对指定 List 集合元素按升序排序 |
sort(List,Comparator) | 根据指定的 Comparator 产生的顺序对 List 集合元素进行排序 |
swap(List,int, int) | 将指定 list 集合中的 i 处元素和 j 处元素进行交换 |
Object max(Collection) | 根据元素的自然顺序,返回给定集合中的最大元素 |
Object max(Collection,Comparator) | 根据 Comparator 指定的顺序,返回 给定集合中的最大元素 |
Object min(Collection) | |
Object min(Collection,Comparator) | |
void copy(List dest,List src) | 将src中的内容复制到dest中 |
boolean replaceAll(List list,Object oldVal,Object newVal) | 使用新值替换 List 对象的所有旧值 |
Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集 合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全 问题
比如说HashMap,ArrayList都不是线程安全的