《Thinking in Java》学习——17章容器深入研究(三)

选择接口的不同实现

1.HashtableVectorStack的特征是,它们是哦过去遗留下来的类,目的只是为了支持老的程序(最好不要在新的程序中使用它们)。
2.容器之间的区别在于,所使用的接口是由什么样的数据结构实现的。

一.对List的选择

1.对于背后有数组支撑的ListArrayList,无论列表的大小如何,这些访问都很快速和一致;而对于LinkedList,访问的时间对于较大的列表将明显增加。
2.在使用迭代器插入心底元素时,对于ArrayList,当列表变大时,其开销变得很高昂,但是对于LinkedList,相对来说标低廉,并且不会随列表的尺寸的变化而变化。
3.在LinkedList中插入和移除的代价相当低廉,并且不随列表的尺寸反升变化,但是对于ArrayList,插入操作的代价特别高昂,并且其代价随着列表尺寸的增加而增加。
4.LinkedListList对端点会进行特殊处理——这使得在将LinkedList用作Queue时,速度可以得到提高。
5.对于随机访问的get()set()操作,背后由数组支撑的List只比ArrayList稍微快一点,但是对于LinkedList,相同的操作会变得异常引人注目的高昂。
6.CopyOnWriteArrayListList的一个特殊的实现,专门用于并发编程。

二.对Set的选择

1.HashSet的性能基本上总是比TreeSet好,特别是在添加和查询元素时,而这两个操作也是醉重要的操作。
2.TreeSet存在的唯一原因时它可以维持元素的排序状态,所以,只有当需要一个排序好的Set时,才应该使用TreeSet
3.由于内部支持排序,所以用TreeSet迭代通常比用HashSet要快。
4.对于插入操作,LinkedListHashSet的代价更高,这是由维护链表所带来额外的开销造成的。

三.对Map的选择

1.除了IdentityHashMap,所有的Map实现的插入操作都会随着Map尺寸的变大而明显变慢。但是,查找的代价通常比插入要小得多。
2.TreeMap通常比HashMap要慢。TreeMap是一种创建有序列表的方式。树的行为是:总是保证有序,并且不必进行特殊的排序。
3.LinkedHashMap在插入时比HashMap慢一点,因为它维护散列数据结构的同时还要维护链表。正是由于这个列表,使得其迭代速度更快。
4.HashMap使用的默认负载因子是0.75,这个因子在时间和空间代价之间达到老平衡。更高的负载因子可以降低表所需要的空间,但是会增加查找代价。

实用方法

一.List的排序和查询

1.List排序与查询的方法与对象数组所使用的相应方法有相同的名字与语法,只是用Collectionsstatic方法代替Arrays的方法而已。

二.设定Collection与Map为不可修改

1.Collections中提供了static方法unmodifiableCollection()unmodifiableList()unmodifiableSet()unmodifiableMap()unmodifiableSortedSet()unmodifiableMap()unmodifiableSortedMap()能够将操作的容器设置为“只读”。转换完成后,人和会改变容器内容的操作都会引起UnsupportedOperationException异常。
2.使用“不可修改方法”将返回一个引用,使用这个引用替换掉原本的引用,这样就不用担心无意中修改了只读的内容。

三.Collection或Map的同步控制

1.Collections类有static方法synchronizedCollection()synchronizedList()synchronizedSet()synchronizedMap()synchronizedSortedSet()synchronizedMap()synchronizedSortedMap()能够同步整个容器,其语法与“不可修改方法”相似。
2.Java容器类类库采用快速报错机制。它会探查容器上的任何除了你的进程所进行的操作意外的所有变化,一旦它发现其他进程修改了容器,就会立刻抛出ConcurrentModificationException异常。当程序的不同部分修改同一个容器时,就有可能导致容器的状态不一致,所以,此异常提醒你,应该修改代码。
3.ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySet都使用了可以避免ConcurrentModificationException的技术。

Java 1.0/1.1容器

一.Vector和Enumeration

1.在Java 1.0/1.1中,Vector是唯一可以自我扩展的序列,所以它被大量使用。基本上,可以将其看作ArrayList,但是具有又长又难记的方法名。
2.Java 1.0/1,1版的迭代器发明了一个新名字——枚举。Enumeration只有两个方法:boolean hasMoreElements(),如果此枚举包含更多的元素,该方法就返回true;另一个为Object nextElement(),该方法返回此枚举中的下一个元素(如果还有的话),否则抛出异常。
3.可以通过Vector()的方法elements()Collections.enumeration(Collection<?> c)方法生成一个Enumeration

二.Hashtable

1.现在的程序中已经没有理由再使用Hashtable了。

三.Stack

1.Stack是一个失败的设计,如果想要实现一个Stack,建议使用LinkedList自己实现:

public class Stack<T> {
    private LinkedList<T> storage = new LinkedList<T>();
    public void push(T v) { storage.addFirst(); }
    public void peek() { return storage.getFirst(); }
    public void pop() { return storage.removeFirst(); }
    public boolean empty() { return storage.isEmpty(); }
    public String toString() { return storage.toString(); }
}

2.BitSet
1.如果想要高效率地存储大量的“开/关”信息,BitSet是一个很好的选择。不过它的效率仅是对空间而言;如果想要高效的访问时间,BitSet比本地数组稍慢一点。
2.使用方法和Set一致,都是通过set()方法储存,get()方法取。
3.如果有一个可以命名的固定的标志集合,那么EnumSetBitSet相比,通常是一个更好的选择。使用BitSet而不是EnumSet的理由只包括:只有在运行时才知道需要多少个标志;对标志命名不合理;需要对BitSet进行某些特殊操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Java源码研究之容器(1) 如何看源码 很多时候我们看源码, 看完了以后经常也没啥收获, 有些地方看得懂, 有些...
    骆驼骑士阅读 981评论 0 22
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • .#完整的容器分类法 填充容器 1.Collections类也有一些实用的用于填充的方法,其中包括fill()。与...
    zpauly阅读 959评论 0 0
  • 1. 建立数据库 2. 创建表格 创建学籍表 创建课程表 创建成绩单 3. 插入数据 学籍表数据 课程表数据 成绩...
    五秋木阅读 407评论 0 0