寒假笔记5
set接口:实现共同的特征,不能存储重复元素
HashSet:哈希(散列),本质就是一个数组,算出哈希值,数据最多存在哈希表对应的位置,存储的元素是无序
TreeSet:树,存储的元素是有序(排序的),第一个存入是根
HashSet可以实现值不能重复(key不重复原理)
底层使用两方法hashCode() / equals()
先调用hashCode(),根据内容算出一个哈希值(int类型),先用整数哈希值比较,哈希值相同说明内容也相同。哈希值也有风险:内容不同算出的哈希值相同。所以在哈希值相同的情况下再调用equals()判断内容
结论:向HashSet中添加的数据类型中,必须提供hashCode()和equals()
向HashSet中存储我们自己定义的Student类型,如果没有重写hashCode(),默认会调用Object类中的hashCode()
Object类中,public native int hashCode();是一个native修饰方法(本地方法),由操作系统提供的,读取的是对象的内存地址
所以,只要是new出来的对象,对象地址都不同。现在的需求是,对象中内容相同,就判定为重复内容。需要对Object类中的equals()和hashCode()进行重写,根据内容计算哈希值,判断内容是否相等
TreeSet:树状结构,存储的元素是有序(排序),第一个存入是根
TreeSet底层使用的是红黑树,可以自平衡避免成为链表
Map接口:实现Map接口的实现类都是双列集合,可以存储一组键值对。键不能重复,值可以重复
实现类:HashMap可以存储一个为null的键,值都可以为null。向HashMap添加元素,首先用key计算出一个哈希值,当哈希值与数组长度取模运算,结果就是该元素在数组中的位置。如果此位置上还没有元素,直接将该元素存储到一个节点上,放到数组中,如果继续添加元素,出现同位置,先比较键是否相同,如果不同把后一个元素放到前一个元素的后面形成链表。当链表长度满足一定条件时转为红黑树。
底层用到的数据结构:哈希表(数组)+链表(默认长度16)
哈希表扩容:两倍
哈希表转为红黑树条件:当链表长度等于8时,哈希表长度小于64,会先扩容哈希表。当链表长度为8,哈希表长度大于64时才会转成红黑树。
TreeMap 底层实现红黑树,可以根据键进行排序
key值的类型必须实现Comparable接口
Hashtable 也是哈希结构,方法加了锁,多线程环境下是安全的,但不能存储null键和值,且是无序的。throw new NullPointerException() 抛出异常,终止
方式1:先拿到所有的key进行循环,每次拿到一个key,然后再上map中取值(效率低,不推荐)
方式2:Collection 接口:单列集合最大接口
Collections 类:一个集合操作的工具类,包含许多静态方法
int ... c 可变长度的参数,本质上是个数组,一个参数列表中,只能有一个可变长度的参数,且必须放在末尾