1.6(java高级特性)集合Map

**前言:**兄弟们你的三连是对我最大的鼓励。下次一定嘿嘿

我会努力认真的完成后续的文章的,希望可以帮到需要的人。

我也是特别懒惰,动不动就刷短视频就是小半天,哎呀,要自觉自觉。

接下来的文章内容来源于

[硅谷学习路线](2021年度全网最全Java学习路线 - 哔哩哔哩 (bilibili.com))

Map集合接口

概念

Map与Collection并列存在。用于保存具有映射关系的数据:key-value

Map 中的 key 和 value 都可以是任何引用类型的数据

Map 中的 key 用Set来存放,不允许重复,value是可以重复的

常用String类作为Map的“键”

key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到 唯一的、确定的 value

Map结构的理解

在这里插入图片描述

  1. Map中的key:无序的,不可重复。
  2. Map中的values:无序的,可以重复。
  3. Map的Key和Values都是放入在Entry中的。每一个Entry都表示一个Map的数据。
  4. 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源码的细致介绍。这里我介绍不会有视频细致。这一段建议看看视频

JDK7/8源码

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都不是线程安全的

在这里插入图片描述

在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_46401545/article/details/121522049