Thinking in Java 第十一章“对象的集合”要点总结----容器

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的转化

每一个类的构造器都可以传入剩下的两个类

猜你喜欢

转载自blog.csdn.net/weixin_38967434/article/details/82257902