十,泛型初步
(一)如果底层有<E>就说明是泛型指定的数据类型,不需要强制数据类型转换
(二)使用泛型的好处
-
集合中存储的元素统一了
-
从集合中取出的元素类型是泛型执行的类型,不需要强制数据类型转换
-
迭代器也需要使用泛型
(三)泛型的缺点
导致集合中存储的数据缺乏多样性
(四)自定义泛型
-
自己定义类的时候页可以使用泛型
十一,HashSet与HashMap(非线程安全)
(一)哈希表底层的数据结构
-
HashSet底层是一个哈希表也叫散列表
-
是数组和单向链表的结合体
-
数组:查询效率好,增删效率低
-
单向链表:增删效率低,查询效率高
-
-
哈希表“存储单向链表的以为数组
-
put方法的原理
-
将key与value封装到node对象中
-
底层调用hashcode方法(返回内存地址)得到hash值
-
在返回null的时候不需要equals
-
-
get方法的实现原理
-
先用key的hashcode()方法得出哈希值,通过哈希算法转换为数组下标,通过数组下标,快速定位到某个位置上
-
如果位置上什么也没有则返回null,如果位置上有单向链表,那么拿着参数key和单向链表上的每一个节点中的key进行equals,如果都是false返回null,反之,将这个节点的value返回
-
在返回null的时候不需要进行equals
-
-
为什么哈希表的增删查找效率都高
-
增删是在链表上完成的
-
查询也只需要扫描部分
-
-
为什么放在HashMap集合中的key部分的元素都要重写equals方法
-
因为默认比表的存储地址
-
-
HashMap结合的特点
-
无序不可重复
-
HashMap中的key部分是放在了HashSet里面,因此也要重写HashMap中的equals方法
-
也可以存null,并且通过get方法得到null对应的value
-
HashTable(线程安全的,初始容量是11,扩容是*2+1,扩容因子是0.75)的k与v不能为null
-
-
重点
-
放在HashMap中的key部分的严肃与HashSet中的元素需要重写hashCode与equals
-
如果一个类的equals方法重写了,必须重写hashCode,如果equals返回的true,则hashCode返回一定相同
-
-
HashMap集合的初始容量必须是二的倍数,这样介意提高存取效率
-
在jdk8之后如果哈希表的单向链表中元素大于八,单向链表的数据结构会变成红黑树的数据结构,当红黑树的元素小于6以后又会变回单链表
-
(二)特点
-
无序不可重复
-
放到Hashet的元素实际上是放到HashMap的key上
-
TreeSet按照从小到大的顺序自动排序
(三)Map接口的常用方法
-
Clear清除
-
Containskey是否包含某种key
-
Containsvalue是否包含某种value
-
Get获取通过key获得value
-
支持泛型
-
Put存放键值对
-
Keyset获取集合中所有的key
-
Remove删除键值对
-
Size大小
-
Values获取所有的value,返回一个colltion
-
IsEmpty
-
Set<map,entry<k,v>> entryset() 将map集合转换为set集合
(四)Map集合遍历
-
方法一
-
方法二(效率更高)
十二,TreeSet
(一)基本
1.底层是TreeMap集合
2.TreeMap底层是二叉树
3.TreeSet集合中的元素等同于TreeMap集合的key部分
4.TreeSet中的元素可以按照元素大小顺序自动排序。称为可排序集合。
(二)排序方法一
1.对于自定义的类型要指定排序规则
2.C.NewClass3_15.Person cannot be cast to java.lang.Comparable
3.出现这个异常的原因是自定义类没有实现*comparable*接口。
4.要解决这个异常要让自定义类继承*comparable*接口
5.然后重写comparaTo
6.比较规则写法:(二叉树)
(1)返回0表示,value会覆盖
(2)返回小于0表示 会继续在左子树上面找
(3)返回大于0表示会继续在右子树上面找
(4)在写compareto的时候不要忘记像是String这些数据函数自带compareto方法。
7.自平衡二叉树
(1)遵循左小右大的存放原则
(2)遍历二叉树的三种方法(前中后是说的根的位置)
①前序遍历:根左右
②后续遍历:左右根
③中序遍历:左根有
(3)Treeset与treemap采用的是中序遍历的方法
(三)排序方法二
1.创建比较器 *Comparator(注意与排序方法一区分)*
2.使用比较器
(四)如果比较规则不经常改变用第一种,如果比较规则经常改变使用第二种方法。第二种符合oct原则,可以切换改变。
十三、集合工具类
(一)Collection与collections
-
Collection是集合接口
-
Collections是集合工具类
(1)Collections.synchronizedList(集合) 将不是线程安全的集合变成线程安全的
(2)Collections.sort(list,比较器); 将集合排序(也需要实现comparalbe接口)
(3)可以将set集合转换为list集合在通过上面的方法进行排序