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生成一个排好序的队列。
数组创建时固定长度,当你创建一个数组时,只能保存特定类型(数组可以保存基本类型,但是容器则不能) 意味着会在编译时做类型检查。考虑到效率与类型检查,应该尽可能使用数组,然后要解决更一般化的问题,数组就可能收到过多的限制。
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生成一个排好序的队列。
相关文章推荐
- Eclipse安装颜色主题,个性化你的IDE,让你的IDE焕然一新
- java读取系统Properties配置文件利用线程实时监控配置文件变化
- Java虚拟机规范 JavaSE7——Runtime Data Areas
- java replaceall 用法
- java验证码实现
- Spring Web Flow 入门demo(二)与业务结合 附源码
- SimpleDateFormat安全的时间格式化
- Spring Boot 引入 properties 文件的笔记
- JAVA学习 分析Servlet
- 《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA Hibernate和Spring Security》
- Java中定义初始化和构造初始化的区别
- Java JVM(六):JDK8 元空间
- Java大文件按行切割
- Eclipse 安装spring插件
- Eclipse 实用快捷键
- 页面与后台传递中文乱码问题(java乱码)
- JAVA设计模式之享元模式
- java.net.SocketException: socket failed: EACCES (Permission denied)联网权限已经设置了还是报错的两个原因及解决方案
- Java并发编程:阻塞队列
- springAOP日志记录数据库项目实例