_17_排序,散列表和Hash,MAP泛型和Map转型list

1 要添加的元素对应的类实现java.lang.Comparable接口,并实现其中的compareTo方法
2 让集合做到排序还有另外一种方式,java.util.Comparator比较器接口,写一个比较器类,在元素添加之前先进行比较
如果两个比较器都有,优先使用Comparator
在这里插入图片描述

散列表
Hash算法 :
是一种安全的加密算法,把不定长的值改为定长的值,但不能保证其值的唯一性,java中就是指hashCode()方法
目标 : 给每个对象生成一个唯一的标识符
下标不在是 0 , 1 ,2 … 而是 对应的hash值
哈希冲突 : 同一个对象,生成多次的值,肯定相同,但是不同的对象,生成的值也有可能相同
Hash的目的 就是为了查询快,hash值就是一个固定的数值,整型值,所以在定长数据的情况下,查询非常快

1 hash过程
拿到对象,调用对象的hash算法(hashCode方法),然后对这个hash值进行算法,作为数组的下标,然后把这个值保存到数组中

HashMap 怎么向Hash表中添加元素
1 添加的时候,HashMap保存的是映射关系(Entry(K,V))
如果生成了重复hash值,会保存到一个单向链表中
单向链表中,保存的是Entry对象
在这里插入图片描述
2 重点 : 先调用要存储的映射关系的key对象,然后调用key对象的hashCode()方法,生成hash码,然后对这个hash码进行hash,得到下标(通过算法)
判断数组中是否有这个下标,如果没有,就占用一个数组空间,保存这个对象
如果有相同的下标,把要添加的键(key)调用equals方法,去和哈希码值相同的链表中的每个元素进行比较,如果返回true,说明有了这个对象了,key就不添加,value值覆盖原来的value值
如果返回false,说明没有这个key,就把这个entry对象,添加到链表中

所以 覆写equals的时候,还需要考虑覆写hashCode,因为在哈希表中,由hashCode和equals来决定数据的唯一性

Set添加.和map相同,唯一不同的地方就是,map是键值对,而set只有key
添加的时候,如果有这个key,就不添加

Set 就是 map的key部分

在这里插入图片描述

Map
Map : 无序可重复
Value可重复,key不可重复
Object put(Object key , Object value); 向Map中添加键值对
Void clear()
Int size();
Boolean isEmpty() 是否为空

Object get(Object key) : 通过key 获取value
Collection values( ) : 获取所有的value
Boolean containsKey(Object key) 判断map中是否有这个key
Boolean containsValue(Object value) 判断map容器中是否有这个value
Set keySet() : 获取map中所有的key,以set集合形式返回
Set entrSet() 返回map容器中的映射关系,以set集合形式返回
Remove(Object key) 根据key删除这个映射关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类型检查 :
编译过程中,检查数据类型是否匹配

什么是泛型 :
集合可以存储任意数据类型元素,但是操作起来不是很方便
因为存进去的元素都发生向上转型为Object,丢失了子类特有的属性
这样在操作的时候还需要强制类型转换(向下转型)
缺点 : 比较麻烦
优点 : 可以存放任意类型的元素
使用泛型之后,会对类型做限制,集合中就只能存放指定的类型
缺点 : 必须是同一种数据类型
优点 : 使用方便,不需要向下转型
泛型不能写基本数据类型,只能是引用数据类型
在这里插入图片描述

在这里插入图片描述

如何让我们的类也有泛型
在这里插入图片描述

在调用的时候,如果没有指定泛型,T就是Object
在这里插入图片描述
如果指明了泛型,T就是对应的类型

在这里插入图片描述

Map转List,并以value值进行排序
Map 数据
在这里插入图片描述
1 先把Map转为List
先把Map转为set
在这里插入图片描述
创建list的时候,调用有参构造,可以直接把set转换为list
在这里插入图片描述
2 再对list进行排序
在这里插入图片描述

3 遍历输出
在这里插入图片描述
4.本章总结
List : 有序,可重复
ArrayList底层是数组,特性是查改快,增删慢
LinkedList 底层是双向链表,增删快,查改慢
Set : 无序不可重复
TreeSet 底层是二叉树,能够实现排序
需要依赖于比较器,两种方式,参考上面笔记
HashSet底层是哈希表/散列表
Map : 无序可重复
Value可重复,key不可重复

发布了24 篇原创文章 · 获赞 0 · 访问量 395

猜你喜欢

转载自blog.csdn.net/qq1317121361/article/details/105354064
今日推荐