Set系列集合的特点
Set系列集合概述
Set系列集合特点
无序:存取顺序不一致(但存储完毕后,集合的顺序不会再变动
不重复:可以去除重复
无索引:没有待索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
set集合实现类特点
HashSet:无序,不重复,无索引
LinkedListSet:有序,不重复,无索引
TreeSet:排序,不重复,无索引
Set集合的功能上基本上与Collection的API一致
HashSet元素无序的底层原理:哈希表
HashSet底层原理
HashSet集合底层采取哈希表存储数据
哈希表是一种对于增删改查数据性能都较好的结构
哈希表的组成
JDK8之前的,底层使用数组+链表组成
JDK8之后,底层采用数组+链表+红黑树组成
哈希值
是JDk根据对象的地址,根据某种规则算出来的int类型的数值
Object类的API
public int hashCode():返回对象的哈希值
HashSet1.7版本原理解析:数组+链表+(集合哈希算法)
创建一个默认长度16的数组,默认加载因为0.75,数组名为table
根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)
判断当前位置是否为null,如果是null直接存入
如果不为null,表示有元素,则调用equals方法比较(此处比较的是地址
如果一样,则不存。如果不一样,则存入数组
JDK7新元素占老元素位置,指向老元素
JDK8中新元素挂在老元素下边
当数组存到16*0.75(加载因)=12时,就自动扩容,每次扩容到原来的两倍
JDK1.8版本开始HashSet原理解析
底层结构:哈希表(数组,链表,红黑树的结合体)
当挂在元素下面的数据过多时,查询性能降低,从JDK8开始后,当链表长度超过8时,自动转化成红黑树
HashSet元素去重复的底层原理
hashCode和equals方法默认都是通过地址判断是否重复
可以通过重写hashCode和equals方法保证集合中不出现重复元素
实现类:linkedHashSet
LinkedHashSet作为HashSet的子类
可以保证存储和取出的元素顺序一致
底层数据结构依然是哈希表,但每个元素又额外多了一个双链表的机制记录存储的顺序
实现类:TreeSet
按照元素的大小默认升序排序
TreeSet集合底层是基于红黑树的数据结构实现的,增删改查性能都较好
TreeSet集合是一定要排序的,可以见元素按照指定的规则进行排序
TreeSet集合默认排序的规则
对于数值类型:Integer,Double,官方默认按照大小进行升序排序
对于字符串类型:默认按照首字符的编号进行升序排序
对于自定义类型,无法直接排序,需要指定排序规则
TreeSet集合自定义排序规则
两类方法
类实现Comparable接口,重写比较规则
集合自定义Comparator比较器对象,重写比较规则
当二者同时存在,会优先调用集合自己的比较器
Collection体系的特点,使用场景总结
1,如果希望集合可以重复,又有索引,索引查询要快?
ArrayList基于数组
2,如果希望元素可以重复,有有索引,增删首位操作快?
LinkedList基于链表
3,如果希望增删改查都快,但元素不重复,无序,无索引
HashSet基于哈希表
4,如果希望增删改查都快,但是元素不重复,有序,无索引
LinkedHashSet基于哈希表和双链表
5,如果要对对象进行排序
TreeSet基于红黑树
补充知识:可变参数
可变参数
可变参数用在形参中可以接收多个数据(用在方法定义时
可变参数的格式:数据类型...参数名称
可变参数的作用
传输参数非常灵活,方便。可以不传输参数,可以传输一个或多个,也可以传输一个数组
可变参数在方法内部本质上就是一个数组
可变参数注意事项
一个形参列表中可变参数只能有一个
可变参数必须放在形参列表的最后边
补充知识:集合工具类Collections
Collections集合工具类
Java.utils.Collections属于工具类
作用:Collections并属于集合,是用来操作集合的工具类
向集合中添加数据
Collections.addAll(list,"只因");
打乱集合(通过索引打乱集合
Collections.shuffle(list);
排序和TreeSet差不多
类实现Comparable接口,重写比较规则
集合自定义Comparator比较器对象,重写比较规则
当二者同时存在,会优先调用集合自己的比较器
Collection体系的综合案例
Map集合体系
Map集合概述和使用
Mao集合是一种双列集合,每个元素包含两个数据
Map集合的每个元素的格式:key=value(键值对元素
Map集合也被称为“键值对集合”
Map集合整体格式
完整格式{key1=value1,kery2=value2,key3=value3....}
Map集合体系特点
使用最多的是HashMap
重点掌握HashMap,LinkedHashMap,TreeMap即可,其后续理解
Map集合的键无序,不重复
Map集合的值不做要求,可以重复
Map集合的特点都是由键决定的
Map集合的简直都可以为Null
Map集合后面重复的键对应的值会
Map集合实现类特点
HashMap:元素按照键是无序,不重复,无索引,值不做要求。
LinkedHashMap:元素按照键是有序的,不重复,无索引,值不做要求
TreeMap:元素按照键是排序,不重复,无索引的,值不做要求
Map集合API
Map集合是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的
Map<String,Integer> map=new HashMap<>();
//1,向集合内添加元素
map.put("小黑子",1);
map.put("香精煎鱼",1);
map.put("香翅捞饭",1);
map.put("再看一眼就爆炸",1);
map.put("在靠近点就融化",1);
System.out.println(map);
//2,清空集合
//map.clear();
//3,判断集合是否为空,为空则返回true
System.out.println(map.isEmpty());
//4,根据键获取对应值
System.out.println(map.get("小黑子"));
//5,根据键删除整个元素,会返回键的值
System.out.println(map.remove("小黑子"));
//6.判断是否包含某个键,包含则返回true
System.out.println(map.containsKey("小黑子"));
//7,判断是否包含某个值,包含则返回true
System.out.println(map.containsValue(1));
//8,获取全部键的集合public Set<K> KeySet()
Set<String> keys = map.keySet();
System.out.println(keys);
//9,获取全部值的集合public Set<V> Values();
Collection<Integer> values = map.values();
System.out.println(values);
//10,集合大小
System.out.println(map.size());
//11,合并其他Map集合
Map<String,Integer> map1=new HashMap<>();
Map<String,Integer> map2=new HashMap<>();
map1.put("蒸虾头",2);
map1.put("油饼",3);
map2.put("树脂",2);
map2.put("蒸虾头",1);
map1.putAll(map2);//把集合map2的元素拷贝一份到map1,键相同的,使用map2的值覆盖
System.out.println(map1);
Map集合的遍历方式一:键找值
先获取Map集合的全部键的Set集合
遍历键的Set集合,然后通过键提取相应值
Map集合的遍历方式二:键值对
先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了
遍历Set集合,然后提取键以及提取值
Map集合的遍历方式三:Lambda表达式
map.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String s, Integer integer) {
System.out.println(s+integer);
}
});
Map集合的实现类HashMap
HashMap是Map里的一个实现类元素按照键是无序,不重复,无索引,值不做要求。
直接使用Map里的方法即可
HashMap跟HashSet底层原理是一样的,只是HashMap的每个元素包含两个值而已
实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已
同时也是依赖HashCode和equals保证键的唯一性·
如果键要存储的是自定义对象,需要重写hashcode和equals方法
Map集合的实现类LinkedHashMap
这里的有序值得是保证存储顺序和取出的元素顺序一致
底层结构仍是哈希表,只是每个键值对元素又多了一个双链表的储存机制记录存储的顺序
Map集合的实现类TreeMap
不重复,无索引,可排序
按照键数据的大小默认升序,只对键排序
如果是自定义类作为键,同样
两类方法
1,类实现Comparable接口,重写比较规则
2,集合自定义Comparator比较器对象,重写比较规则
当二者同时存在,会优先调用集合自己的比较器