-
17、Java——集合:Set与Map
1、List : 有序的,可重复的
(1)新增了一些根据索引操作的方法
①ArrayList②Vector③LinkedList
Set : 无序的 不可重复
(2)新增功能: static <E> Set<E> of(E... elements) 返回包含任意数量元素的不可修改集。
其他方法从Collection继承,遍历方式:foreach,iterator
(3)注意:存放数据的顺序与内部真实存储的顺序可能不一致
2、HashSet-->是由HashMap维护的
(1)无序的,不可重复,底层结构: 哈希表(数组+链表+红黑树)。
(2)特点: 查询,增删效率较高,无序,去重。
(3)应用场景 : 存储数据由单个值决定的情况下,想要去重的情况下,适合使用HashSet,新增内容 : 无新增方法
(4)哈希表中hashcode与equals之间的关系(前提是重写hashcode与equals都是根据成员变量计算)
(5)equals相等hashcode一定相等,hashcode相等,equals不一定相等
(6)哈希表存储自定义引用数据类型数据的去重:需要在数据的类型中重写hashcode与equals方法,实现根据内容(成员变量的值)进行比较和计算。
3、TreeSet --> 是由TreeMap维护的
(1)无序,去重,底层结构 : 红黑树(平衡二叉树),特点 : 默认升序排序
(2)新增方法 : 数据的大小比较相关的方法,因为红黑树结构中数据已经比较过大小,默认升序
4、ClassCastException : 类型转换异常
(1)问题: 在存储自定义引用数据类型数据的时候,对象数据不确定比较规则,在TreeSet无法实现比较,无法排序
(2)需要: 指定学生数据的比较规则,内部比较规则|内部比较器|自然排序,实现一个java.lang.Comparable接口,重写compareTo方法,在compareTo方法内部指定比较规则
(3)定义在类的内部,是一种默认的比较规则
①缺点: 比较局限,不够灵活,硬编码,不便于后期维护
(4)外部比较规则|外部比较器|定制排序
①定义在javabean类的外部,单独指定某种数据的某种比较规则
②使用的时候,可以指定使用哪一个中外部比较规则,没有指定外部比较规则,默认需要内部,实现一个接口Comparator接口,重写int compare(T o1, T o2) 方法,方法内部指定两个参数的比较规则
③实现内部比较器: 定义一个TreeSet集合存储学生信息,要求根据学生姓名进行排序,实现根据姓名降序排序
5、类 java.util.Collections 提供了对Set、List、Map操作的工具方法。
(1)如何处理HashMap的线程不安全问题:
①可以Hashtable
a.线程安全问题b.HashMap允许key与value为null,Hashtable不允许c.细节问题,底层源码
②static <K,V>Map<K,V> synchronizedMap(Map<K,V> m) 返回由指定映射支持的同步(线程安全)映射。
③juc 高级并发编程包,ConcurrentHashMap<K,V>-->推荐
6、Map <K,V>
(1)存储键值对数据,元素的集合,键值对的集合,K-V 键值对,key,value可以为任意引用数据类型的数据
(2)key--> 唯一的,无序的 --> Set集合,value --> 无序的,可重复的 -->Collection
(3)键值对为一个映射关系,key--> 映射-->value,一个key只能对应一个value,一个key可以实现对应一个集合作为value,集合中可以存放多个值
7、Map集合的遍历方式:
(1)keySet() 获取集合中所有的key,然后遍历key,根据key获取value
(2)values() 获取集合中所有的value
(3)entrySet() 返回多个Map.Entry类型的键值对对象,一个set集合
8、HashMap
(1)底层: 哈希表(数组+链表+红黑树),特点: 查询,增删效率较高,新增方法: 无新增方法,遍历方式: 与map相同,并允许null值和null键
(2)①DEFAULT_LOAD_FACTOR : 默认的加载因子 0.75
②DEFAULT_INITIAL_CAPACITY : 默认初始容量 1<<4 = 16
③threshold 扩容临界值 | 阀值 CAPACITY*LOAD_FACTOR
(3)扩容: newCap = oldCap << 1 每次扩容原数组容量的2倍,去重: key中存储数据的类型要求重写hashcode与equals方法
9、TreeMap
(1)根据key实现去重①底层结构: 红黑树②特点: 根据key对数据做升序排序③新增功能: 比较相关的一些方法
(2)根据key做去重,根据key做排序①要求: key指定比较规则|方式|比较器|排序②内部比较器③外部比较器④定义TreeMap存储键值对数据,key为Teacher
10、Properties
(1)存储的键值对都是字符串,Properties可以保存到流中或从流中加载。
(2)软编码 : 经常改动的内容不要定义在源代码中,定义在一个外部的文件中-->配置文件,从程序中每次动态从文件中进行读取内容,使用读入的最新内容。
(3)配置文件 : properties格式,符合Properties特点: 键值对 都是字符串。
11、SE重点知识: 面向对象 集合
(1)集合 与 数组之间的区别:
(2)Collection与Collections之间的区别
(3)List与Set之间的区别
(4)ArrayList与LinkedList,Vector之间的区别
(5)ArrayList特点与扩容问题
(6)HashMap扩容机制
(7)HashMap线程安全问题
①数组:
定长
引用数据类型
存储数据类型一致
有序
②集合:
引用数据类型
存储任意引用数据类型数据
容量可以根据数据的多少动态增删
③Collection : 单个数据值元素的集合
a.List : 有序 可重复
ArrayList
LinkedList
b.Set : 无序 不可重复
HashSet
TreeSet
④Map : 映射元素的集合
HashMap
TreeMap
Hashtable
Properties
⑤Collections 操作集合数据的工具类
多线程
网络编程
链表图
哈希表
HashMap哈希表
出处:https://www.cnblogs.com/Blank0926/p/15062160.html