1、如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。
11.1泛型和类型安全的容器
1、注解以@符号开头,可以接受参数,这里的@SuppressWarnings注解极其参数表示只有有关“不受检查的异常”的警告信息应该被抑制。
2、当指定了某个类型作为泛型参数时,并不仅限于只能将该确切类型的对象放置到容器中。向上转型也可以像作用于其他类型一样作用于泛型。
11.2基本概念
1、Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)
2、Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许使用数字来查找值,在某种意义上讲,它将数字与对象关联在了一起。映射表允许使用另一个对象来查找某个对象,被称为“关联数组”。因为它将某些对象与另外一些对象关联在了一起,或者被称为“字典”,因为它将某些对象与另外一些对象关联在了一起。或者被称为“字典”,因为可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。
11.3添加一组元素
1、Arrays.asList()方法接受 一个数组或是一个用逗号分隔的元素列表(使用可变参数),并将其转换成一个List对象。Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,将元素添加到Collection中。
2、Collection.addAll()成员方法只能接受另一个Collection对象作为参数,因此不如Arrays.asList()或Collection.addAll()灵活,这两个方法使用的都是可变参数列表。
11.4 容器的打印
1、Arrays.toString()来产生数组的可打印表示。
2、Collection在每个槽中只能保存一个元素。此类容器包括:List,它以特定的顺序保存一组元素;Set,元素不能重复;Queue,只允许在容器的一“端”插入对象,并从另外一“端”移除对象。Map在每个槽内保存了两个对象,即键和与之相关联的值。
3、HashSet使用的是相当复杂的方式来存储元素。存储的顺序看起来并无实际意义,如果存储顺序很重要,可以使用TreeSet,它按照比较结果的升序保存对象;或者使用LinkedHashSet,按照被添加的顺序保存对象。
4、HashMao提供了最快的查找技术,也没有按照任何明显的顺序来保存其元素。TreeMap按照比较结果的升序保存键,而LinkedHashMap则按照插入顺序保存键,同时还保留了HashMap的查询速度。
11.5List
1、List可以将元素维护在特定的队列中。List接口在Collection的基础上添加了大量的方法,可以在List的中间插入和删除元素。
2、ArrayList:长于随机访问元素,但是在List的中间插入和删除元素时较慢。
3、LinkedList:通过代价较低的在List中间进行的插入和删除操作,提供了优化的顺序访问,LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。
4、contains()方法来确定某个对象是否在列表中。
11.6迭代器
1、迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。
11.6.1ListIterator
1、ListIterator是Iterator的子类型,只能用于各种List类的访问。尽管Iterator只能向前移动,但是ListIterator可以双向移动。还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator,并且还可以通过调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
11.7 LinkedList
1、LinkedList可以使其用于栈、队列或双端队列的方法。
11.8Stack
1、“栈”通常是指“后进先出”的容器。有时栈也被称为叠加栈,因为最后“压入”栈的元素,第一个“弹出”栈。
11.9 Set
1、Set不保存重复元素。Set最常被使用的是测试归属性,可以很容易地询问某个对象是否在某个Set中。正因为如此,查找就成了Set中最重要的操作,因为通常都会选择一个HashSet的实现,专门对快速查找进行了优化。
2、Set具有与Collection完全一样的接口。实际上Set就是Collection
3、HashSet的输出顺序无任何规律可循。因为处于速度原因的考虑,HashSet使用了散列。HashSet所维护的顺序与TreeSet或LinkedHashSet都不同,因为它们的实现具有不同的元素存储方法。TreeSet将元素存储在红黑树数据结构中,而HashSet使用的是散列函数。LinkedHashList因为查询速度的原因也使用了散列。
11.10Map
11.11Queue
1、队列是一个典型的先进先出的容器,即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的。队列常被当做一种可靠的对象从程序的某个区域传输到另一个区域的途径。队列在并发编程中特别重要。
2、LinkedList提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。可以将LinkedList向上转型为Queue
11.11.1PriorityQueue
1、先进先出描述了最典型的队列规则。队列规则是指在给定一组队列中的元素的情况下,确定下一个弹出队列的元素的规则。先进先出声明的是下一个元素应该是等待时间最长的元素。
2、PriorityQueue默认的元素将使用对象在队列中的自然顺序,但是可以通过提供自己的Comparator来修改这个顺序。
11.12Collection和Iterator
1、Collection是描述所有序列容器的共性的根接口,它可能会被认为是一个“附属接口”,即因为要表示其他若干个接口的共性而出现的接口。
2、生成Iterator是将队列与消费队列的方法连接在一起耦合度最小的方式,并且与实现Collection相比,它在序列类上所施加的约束也少得多。
11.13Foreach与迭代器
1、foreach语法主要用于数组,但是也应用于任何Collection对象。
2、Foreach语句可以用于数组或其他任何Iterator,但是这并不意味着数组肯定也是一个Iterable,而任何自动包装也不会自动发生。数组先变成集合。
11.13.1适配器方法惯用法
1、希望添加一种或多种在foreach语句中使用Iterable类的方法,应该怎么做?
①一种方案是所谓适配器方法的惯用法。“适配器”部分来于设计模式,因为必须提供特定接口以满足foreach语句。
2、只要执行的操作会修改这个List,并且不想原来的数组被修改。就应该在另一个容器中创建一个副本
11.14总结
Java提供了大量持有对象的方式:
1、数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对接口做类型转换。可以是多维的,可以保存基本类型的数据。但是,数组一旦生成,其容量就不能改变。
2、Collection保存单一的元素,而Map保存相关联的键值对。有了Java泛型,就可以指定容器中存放的对象类型,因此就不会将错误类型的对象放置到容器中,并且在从容器中获取元素时,不必进行类型转换。各种Collection和各种Map都可以在向其中添加更多的元素时,自动调整其尺寸,容器不能持有基本类型,但是自动包装机制会仔细地执行基本类型到容器中所持有的包装类型之间的双向转换。
3、像数组一样,List也建立数字索引与对象的关联,因此数组和List都是排好序的容器。List能够自动扩容容量。
4、如果进行大量的随机访问,就使用ArrayList,如果要经常从表中间插入或删除元素,则应该使用LinkedList。
5、各种Queue以及栈的行为,由LinkedList提供支持。
6、Map是一种将对象(而非数字)与对象相关联的设计。HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。
7、Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。
8、新程序中不应该使用过时的Vector,Hashtable和Stack
第11章持有对象
最新推荐文章于 2022-02-28 19:21:24 发布