1.容器的大致分类
Map:用来保存键值对
Collection:用来保存单一元素 : 又分为 List 、 Set 、 Queue
虚点框:接口
虚线框:抽象类
实线框:普通类
粗线框: 常用
实线 :一个类可以生成指向的那个类
虚线:接口、抽象类之间的继承
2.容器的打印不需要任何特殊操作
容器的打印方法是在 abstractCollection 和 abstractMap 抽象类里面
3容器的缺点
4.将容器所装的类型规定的方法
法一:创建一个类,并将某个容器作为自己的一个成员,这样使用这个类的时候就必须使用某一类型(比如String)
法二:泛型
5.迭代器
是一种设计模式。它的作用是遍历序列,而且不管序列到底是什么序列(不管序列的底层实现)
6.无意识的递归
由于前面有“come on”所以他会想把this也变成String,从而调用this的toString方法,最终形成递归。
解决:调用Object的toString方法。
7.使用LinkedList实现Stack、Queue
8.Set(里面的元素不能重复)
https://blog.csdn.net/qq_33642117/article/details/52040345:详细说明了TreeSet、HashSet
9.自定义对象存入Set
亲自测试:
使用TreeSet:必须实现Comparable接口的compareTo方法 或者 在TreeSet构造器上传入自定义的Comparator
使用HashSet:实现equals方法 + 实现hasHash方法(先看哈希码是否相同,再调用equals进一步判断)
10.Map
实验可知:
传入容器的必须是对象,如果是基本类型,他会自动封装。
keyset方法返回的方法是HashMap中的内部类KeySet extends AbstractSet
values方法返回的是HashMap中的内部类Values extends AbstractCollection
11.用自定义类型做键或值
利用HashMap的话还是要 重写hashCode 和 equals
12.通过容器的get方法获得的对象都是Object,所以必须转型。
13.自己编写Map(for循环遍历 和 哈希散列)
法一:不用散列
继承AbstractMap方法,就要实现
entrySet() : 我觉得这个方法就是返回一个Set对象,可以利用Collection来操作Map
https://www.cnblogs.com/macs524/p/5738990.html
法二:散列
slot称为散列的槽的个数
bucket称为槽,也称为桶
14.HashMap的性能因子
容量(capacity):HashMap中桶的数量
尺寸(size):HashMap中存放的记录数
负载因子(Load Factor):size/capacity:平均每个桶有几条记录
再HashMap初始化时,可以指定HashMap的负载因子。HashMap默认负载因子是0.75。
15.重载hashcode方法(应该使用对象内有意义的识别信息 )
hashCode()生成的结果,经过处理后,可以作为桶(bucket)的索引
16.Reference类
https://blog.csdn.net/androidstar_cn/article/details/54710652
https://blog.csdn.net/wangdong5678999/article/details/68931538
16.容器的选择:
17.对List的选择
18.对Set的选择
19.对Map的选择
TreeMap中的元素已经排好序,这对某些查找工作来说会比较容易。
20.返回只读容器
21.快速报错 fail-fast机制
fail-fast机制保证了 ,除了你的进程改变容器,其他进程改变你的容器就会抛出异常。
22.未支持的方法
调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的市Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。
这种设计模式避免了接口数量的爆炸! 我的理解是,如果把每个方法都设计成接口,那么每个子类都要实现这个接口,如果不希望某些子类实现该接口,就会比较麻烦。如果直接把方法定义为 抛出未支持操作异常 ,那么就只用在想要实现某种方法的子类里面重写该方法,而没有重写的子类就不支持该方法。
23.排序
数组的排序可以用 Arrays (可以指定Comparator;也可以让类实现Comparable接口)
容器的排序可以用 Collections (可以指定Comparator;也可以让类实现Comparable接口)
Comparable 和Comparator主要是排序, 相等主要是依靠equals 和 hashCode 方法
24.List、Set、Queue的转化
每一个类的构造器都可以传入剩下的两个类