您的位置:首页 > 编程语言 > Java开发

Thinking in java(11章 对象的集合)

2015-07-02 10:02 507 查看
第十一章:对象的集合

数组创建时固定长度,当你创建一个数组时,只能保存特定类型(数组可以保存基本类型,但是容器则不能) 意味着会在编译时做类型检查。考虑到效率与类型检查,应该尽可能使用数组,然后要解决更一般化的问题,数组就可能收到过多的限制。

11.1 数组

数组与其他种类的容器之间的区别:效率、类型和保存基本类型的能力。在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。它是简单的线性序列,但是因其大小固定,因此空间不足时需要再创建一个新的数组,然后把旧数组中所有的引用移到新数组中。通用容器 List,Set和Map等,可以放任何类型,数组只能保存特定类型。

对象数组保存的是引用,基本类型数组直接保存基本类型的值

Arrays.fill() 用于填充数组

System.arraycopy()用于复制数组

Arrays.equal(a1,a2) 输出Boolean

11.1.3 Arrays类 提供了操作数组的实用功能

有四个基本方法:equals(),fill(),sort(),binarySearch()用于在已经排序的数组中查找元素。

11.2 容器

容器类库分为两种:(如果说分成三类的话,就是List Set和Map)

Collection:List必须保持元素特定的顺序,而Set不能有重复元素。ArrayList是一种List,HashSet是一种Set。

Map:一组成对的”键值对“对象

Map:

11.2.1 List(继承自Collection)

List必须保持元素特定的顺序,顺序保存

方法:add()

fill() 同一个对象引用填充整个容器

最基本最常用的容器:ArrayList

List有两种类型,一种是基本的ArrayList,其优点在于随机访问元素,另一种更强大的LinkedList,有一套更通用的方法

ArrayList:数组实现,快速随机访问,但是中间插入和移除的速度很慢

LinkedList:中间插入、移除开销不大,随机访问比较慢。还有addFirst(),addLast(),getFirst(),getLast(),removeFirst()和removeLast()方法

实现栈的所有功能

使用LinkedList制作队列(P335)

11.2.2 Set(继承自Collection)

Set不能有重复元素

方法:add()

HashSet:为快速查找二设计的Set,存入HashSet的对象必须定义HashCode()。采用散列函数。

TreeSet:保持次序的Set,底层为树结构,使用它可以从Set中提取有序的序列。根据红黑树的数据结构排序元素

LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序。使用迭代器遍历时,会按元素插入的次序显示

方法:

SortedSet(用于TreeSet):确保元素处于排序状态

SortedSet subSet(fromElement, toElement )

SortedSet headSet(toElement)

SortedSet tailSet(fromElement)

11.2.3 Map(继承自Collection):键值对关联性

方法:put()

HashMap:基于散列表的实现,插入和查询的开销是固定的

LinkedHashMap:使用链表维护内部

TreeMap:基于红黑树的实现,TreeMap是唯一的带有subMap()方法的Map,可以返回一个子树

类似的,有SortedMap,firstKey(),lastKey(),headMap(toKey),tailMap(fromKey)

11.3迭代器(也是一种设计模式)

迭代器也是一个对象,Iterator就是迭代器,有 next() hasnext() remove()方法

11.5 collection

任意的Collection可以生产Iterator,通过iterator()方法

Collection的功能方法:

add(Object),clear(),contains(Object),addAll(Collection),containsAll(Collection),is Empty(), remove()

iterator(), toArray()(返回一个数组,)

11.6 HashMap的性能因子

容量(capacity):散列表中桶的数量

初始化容量(initial capacity):创建散列表时桶的数量 HashMap和HashSet都允许在构造器中指定初始化容量

尺寸:当前散列表中记录的数量

负载因子:等于”尺寸、容量“。负载因子为0时,表示空的散列表,0.5表示半满的散列表,轻负载的散列表具有冲突少,适宜插入与查询的特点。

11.7HashCode()

1、对于String而言,hashCode()是基于String内容的,同时还希望hashCode()分布均匀散列码

2、hashCode()基本指导:

1)给int变量result赋予某个非零常值

2)为对象内每个有意义的字段f(数据类型)计算出一个int散列码c:

3)合并计算得到的散列码:result=37*result+c;

4)返回result

5)检查hashCode()最后生成的结果,确保相同的对象有相同的散列码

11.8容器性能比较

HasSet的性能总比TreeSet好,TreeSet存在的唯一原因是它可以维持元素的排序状态,所以只有当需要一个排好序的Set时,才应该使用TreeSet

HashTable和HashMap效率大致相同,HashMap通常更快一点,所以打算用HashMap来取代Hashtable。TreeMap通常比HashMap慢,但是需要TreeMap生成一个排好序的队列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: