一、Set集合(单列)
特点
1.去重
2.存取顺序不一致
3.没有索引概念
二、TreeSet集合
特点
除了拥有其父类Set的特点之外,还能够排序
使用的时候一定要指定排序规则
排序规则的指定
排序返回值
为负则存左边
为正存右边
为0代表元素重复,不存
实现排序的方法
法1:实现comparable接口,并重写接口的compareTo方法
法2:构造参数传入比较器排序
两种排序使用原则
对于自定义的类,优先使用比较器排序
已经有默认的Comparable接口排序,但不满足排序需求,则需要使用比较器排序
三.HashSet集合
特点
1.保证元素不重复
2.不保证元素顺序
LinkedHashSet
特点
1.不重复
2.存取有序
四、HashMap(双列集合)
特点
父类Map<K,V>是一个泛型接口,泛型参数有俩,分别为K,V,代表了所要存储的键值对类型
键是唯一的,值是可重复的,且键值对一一对应
键和值都可以为null
无序
Map接口中的方法
put :添加
get :获取
remove :删除
containsKey :是否包含Key
containsValue :是否包含value
clear : 清除所有的内容
isEmpty :是否存在
size :长度
keySet :key值获取
values : 获取所有的value值
使用注意
如果Key存的是自定义对象,那么一般要重写equals和hashCode方法,才能保证键唯一
一般用String作为键,使用较多
TreeMap
特点
根据键排序的map
如果键为自定义对象则需要实现Comparable接口或者构造器传入比较器
LinkedHashMap
特点
保证读取顺序
可变参数
方法的参数是可变的
形式:修饰符 返回值 方法名称(参数类型... 参数名)
public void sum(int.... a)
可变参数实际是一个动态数组
如果一个方法有多个参数,且包含可变参数,则可变参数要放在最后
HashMap底层数据结构
什么是hash值?
1.是根据对象的地址或者属性生成的一个int类型的整数
2.如果重写了hashCode则是按照对象属性计算hash值
3.如果没有重写hashCode则是按照对象地址计算hash值
hash碰撞
两个不同对象的hash值一样
哈希表(hash桶)
其实就是一个数组,但是元素的位置是根据对象的hash值计算出来的
jdk1.8之前
数组+链表
1.首先创建一个长度为16的数组,加载因子为0.75,
2.接着根据元素的hash值以及数组长度,计算出元素存储的位置(数组索引)
3.如果计算出来的当前索引位置为null,则直接添加
4.如果计算出的索引位置不为null,则继续调用equals方法比较元素内容
内容一样,则不存
内容不一样:新的元素存在该数组位置,老的元素以链表形式挂在新元素下面
数组扩容时机
一旦数组内存储的数据>数组长度*加载因子时,数组长度就会扩大到二倍
jdk1.8之后
数组+链表+红黑树
当链表长度大于8之后,会把链表变成进行树化,树化成红黑树,提高查询效率