我是靠谱客的博主 难过小馒头,最近开发中收集的这篇文章主要介绍javase容器set map的特点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

	javase第十五天总结(Set_Map)

一:Set的集合和使用
1.1 set 特点:无序,唯一
Set集合:
HashSet: 采用Hash table哈希表存储结构
优点:添加、查询、删除速度快,
缺点:无序
LinkedHashSet:
采用哈希表存储结构,同时使用链表维护次序
有序,(添加顺序)
TreeSet:
采用二叉树(红黑树)存储结构
优点:有序,查询速度比list快(按照内容查询)
缺点:查询速度没有HashSet快
1.2 使用各种set集合存储课程名称
方法:1,创建一个集合set对象
Set set = new HashSet ();

二:Set集合的原理
2.1 外部比较器Comparator的作用和使用

问题:内部比较器Comparable只有一个,如果希望指定多种比较的规则,怎么办?
解决:可以定义多个外部比较器,定义额外的类实现Comparator接口
2.2 哈希表原理
2.2.1 引入哈希表
1,在无序数组中按照内容查找,效率低下,时间复杂度是O(n)
2,在有序数组中按照内容查找,可以使用折半查找,时间复杂度O(log2n)在二叉平衡树中按照内容查找,时间复杂度O(log2n
3,在数组中按照索引查找,不进行比较和计数,直接计算得到,效率最高,时间复杂度O(1)

问题:按照内容查找,能否也不进行比较,而是通过计算得到地址,实现类似数组按照索引查询的高效率呢O(1)
有!!!哈希表来实现
2.2.2 哈希表的特点
Hashtable 也叫散列表
特点:快,很快,非常快
主结构:顺序表

2.2.3.哈希表是如何添加数据的
1.计算哈希 码(调用hashCode(),结果是一个int值,整数的哈希码取自身即可)
2.计算在哈希表中的存储位置 y=k(x)=x%11
x:哈希码 k(x) 函数y:在哈希表中的存储位置
3.存入哈希表
 情况1:一次添加成功
 情况2:多次添加成功(出现了冲突,调用equals()和对应链表的元素进行比较,比较到最后,结果都是false,创建新节点,存储数据,并加入链表末尾)
 情况3:不添加(出现了冲突,调用equals()和对应链表的元素进行比较, 经过一次或者多次比较后,结果是true,表明重复,不添加)
结论1:哈希表添加数据快(3步即可,不考虑冲突)
结论2:唯一、无序
2.2.4.哈希表是如何查询数据的
和添加数据的过程是相同的
 情况1:一次找到 23 86 76
 情况2:多次找到 67 56 78
 情况3:找不到 100 200
结论1:哈希表查询数据快
2.2.5.hashCode和equals到底有什么神奇的作用
 hashCode():计算哈希码,是一个整数,根据哈希码可以计算出数据在哈希表中的存储位置
 equals():添加时出现了冲突,需要通过equals进行比较,判断是否相同;查询时也需要使用equals进行比较,判断是否相同
2.2.6.各种类型数据的哈希码应该如何获取 hashCode()
1.int 取自身 看Integer的源码
2.double 3.14 3.15 3.145 6.567 9.87 取整不可以 看Double的源码
3.String java oracle j+a+v+a 将各个字符的编码值相加不可以
abc cba bac a:97 b:98 c:99
abc 197+298+399 cba 199+298+397
4.Student 先各个属性的哈希码,进行某些相加相乘的运算
int id String name int age double score;
2.2.7.如何减少冲突
1)哈希表的长度和表中的记录数的比例–装填因子:
如果Hash表的空间远远大于最后实际存储的记录个数,则造成了很大的空间浪费, 如果选取小了的话,则容易造成冲突。 在实际情况中,一般需要根据最终记录存储个数和关键字的分布特点来确定Hash表的大小。还有一种情况时可能事先不知道最终需要存储的记录个数,则需要动态维护Hash表的容量,此时可能需要重新计算Hash地址。
装填因子=表中的记录数/哈希表的长度, 4/ 16 =0.25 8/ 16=0.5
如果装填因子越小,表明表中还有很多的空单元,则添加发生冲突的可能性越小;而装填因子越大,则发生冲突的可能性就越大,在查找时所耗费的时间就越多。 有相关文献证明当装填因子在0.5左右时候,Hash性能能够达到最优。
因此,一般情况下,装填因子取经验值0.5。
2)哈希函数的选择
直接定址法 平方取中法 折叠法 除留取余法(y = x%11)
3)处理冲突的方法
链地址法 开放地址法 再散列法 建立一个公共溢出区

第三节 Map集合的使用
3.1 Map集合类型
• Map
• 特点:存储的键值对映射关系,根据key可以找到value
• HashMap
• 采用Hashtable哈希表存储结构(神奇的结构)
• 优点:添加速度快 查询速度快 删除速度快
• 缺点:key无序
• LinkedHashMap
• 采用哈希表存储结构,同时使用链表维护次序
• key有序(添加顺序)
• TreeMap
• 采用二叉树(红黑树)的存储结构
• 优点:key有序 查询速度比List快(按照内容查询)
• 缺点:查询速度没有HashSet快
方法摘要
void clear()
从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>>
entrySet()
返回此映射中包含的映射关系的 Set 视图。

boolean equals(Object o)
比较指定的对象与此映射是否相等。
V
get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode()
返回此映射的哈希码值。
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
Set
keySet()
返回此映射中包含的键的 Set 视图。

V
put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
V
remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size()
返回此映射中的键-值映射关系数。
Collection
values()
返回此映射中包含的值的 Collection 视图。

最后

以上就是难过小馒头为你收集整理的javase容器set map的特点的全部内容,希望文章能够帮你解决javase容器set map的特点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部