1. 集合补充
/
1.1treeSet添加的元素必须排序
两种方式 :
1 要添加的元素对应的类实现java.lang.Comparable接口,并实现compareTo方法
2 使用java.util.Comparator比较器类
如果要添加的元素符合两种比较器,则 Comparator优先(compare方法)
Comparable : 要添加的元素 实现该接口并覆写compareTo方法
Comparator : 比较器类 常应用比如Integer默认升序;
我想降序怎么办? 使用Comparator进行降序排序
如果添加的元素的类
我们应该使用 Comparable , 因为对扩展开发
其他人还可以使用 Comparator 实现新的排序功能
如果添加的元素的类不是我们写的
(1)该类有排序(实现了Comparable) 比如Integer 但是 默认排序结果不是我们想要的
我们可以使用Comparator进行调整排序,因为优先级高
(2)如果该类没有实现排序(没有实现Comparable);
这时候我们需要使用Comparator进行排序
因为我们不可能去改变人家类的源码
1.2 hash算法
一种安全的加密算法
把不定长的值改变为定长值
存在哈希冲突
散列表 :
数组中保存链表(单向链表) 链表节点内有四个属性
1 key 2 value 3 next 4 hash
散列表是一种数据结构
以封装的形式封装到了HashSet、 HashMap 和HashTable中
其中hashTable已经过时
hash算法在java中,就是指 hashCode函数及重写
哈希的目的就是为了查询快;因为hash是一个固定的值
hash过程
拿到对象
调用对象自身的hashCode()方法
然后进行hash算法
得到数组下标
把值保存到对应的数组
Set特性 : 无序不可重复 (hashCode和equals)
HashSet 和 HashMap
HashSet 就是HashMap的封装
本质就是一个HashMap
默认初始化容量 都是 16
封装之后 HashSet把value值屏蔽了
只能操作key
所以在使用set添加的时候 只需要传入key即可
添加过程
使用添加的键值对中的key,调用key的hashCode方法生成hash值
进行hash算法得到数组下标
判断该下标上是否有元素,如果没有把该键值对 保存到该数组中即可;
如果该数组中有对象 则调用key的equals方法和数组中的元素进行比较
如果相等则key不添加value值覆盖;
如果不相等,就把该对象的添加到已有元素的next属性,形成链表;
如果添加的时候就已经是链表了,则需要用key和链表中所有的元素key进行比较是否相等
因为散列表中 需要使用hashCode和equals来表示对象的唯一性
所以在进行添加自定义类型的时候
需要考虑 按需求重新hashCode和equals方法
2.Map
2.1Map : 无序 可重复
- value可重复 key不可重复
- Map和集合的操作基本都是一样的
- Object put(Object key,Object value) : 向map中添加键值对
- void clear() : 清空
- int size() : 添加个数
- boolean isEmpty() : 判断是否为空
- Object get(Object key) : 根据key 获取value
- Collection values() : 获取map中的所有value值,以集合形式返回
- booelan containsKey(Object key) : 判断是否包含某个key
- booelan containsValue(Object value) : 判断是否包含某个value
- Set keySet() : 获取map中的所有key,以Set集合形式返回
- Set entrySet() : 返回map中的键值对映射(key=value)
-
以Set集合形式返回
- V remove(Object key) : 根据key删除指定映射关系
-
返回value值
- map不能直接遍历
- 可以通过keySet 等方法进行间接遍历
2.2SortedMap是接口
- 仅实现了是TreeMap 元素必须有序 会按照某个规定进行排序
- 实现排序的原因 :
- 1 被添加的元素,实现了Comparable接口
- 2.编写一个比较器类,该比较器类必须实现Comparator接口
3.类型检查
3.1类型检查 :
编译过程中,检查数据类型是否匹配 - 什么是泛型
- 集合就跟数组一样 都是只能放同一种数据类型的
- 引入泛型之后,我们可以指定存储的类型
- 编译器在编译阶段,就会检查添加的数据的类型是否匹配
- 泛型只能是引用数据局类型
- 优点 : 统一了数据类型
-
减少数据类型转换
- 缺点 : 只能存储单一类型的元素
- 在集合声明的时候指定了该集合的数据类型
- 指明了类型之后,再向集合中添加数据的时候
- 编译器就会对数据类型进行校验