剖析Java 集合框架第一弹

序言

    写文章,这个想法我觉得很多人都有,我也很早就有,但是一直拖着,基于各种考虑:文笔不好啦,没有素材啦,没有深度啦。不管怎样,今天终于迈出了第一步,值得庆祝。
    主要分析生活中的感悟和自己专业技术(java方向),前期可能是以技术文章为主,毕竟对于新手来说,写生活感悟不比高考写命题作文简单。
    希望能分享我的所学所感,促使自己热爱生活,稳步提升。经常加班到深夜,走在寂静无人的路上,想的最多的就是活着是为了什么,这么拼,最后得到什么,为了什么。现在还没有确切答案,但是我希望我能热爱生活!
话不多说,进入今天的分享主题,java集合框架

1. 集合概况

下图展示了Java容器类库关系图
image

数据结构本质就是数组链表

无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。
不可重复性是指添加的元素按照 equals()判断时 ,返回 false,需要同时重写 equals()方法和 HashCode()方法。

Java容器类类库的用途是"保存对象",并将其划分为两个不同的概念:
Collecton 一个独立元素的序列

  • List 必须按照插入的顺序保存元素

  • Arraylist:基于动态数组实现,支持随机访问、有序、重复、线程不安全、扩容为当前的1.5倍。

  • Vector:和 ArrayList 类似,线程安全,扩容为当前的2倍。

  • LinkedList:双向链表,只能顺序访问,快速插入和删除元素。还可以用作栈、队列和双向队列。线程不安全。

  • Set 不能有重复元素

  • HashSet(无序,唯一): 基于哈希表实现,底层采用 HashMap 来保存元素

  • TreeSet(有序,唯一):红黑树(自平衡的排序二叉树),支持有序性操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。

  • LinkedHashSet:是 HashSet 的子类,内部使用双向链表维护元素的插入顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

  • Queue 按照排队规则来确定对象产生的顺序

  • LinkedList:可以用它来实现双向队列和栈。

  • PriorityQueue:基于堆结构实现,可以用它来实现优先队列。Map. 一组成对的"键值对"对象,允许你使用键来查找值。

  • HashMap:JDK1.8 由数组+链表组成的,当链表长度大于阈值(默认为 8)(当前数组的长度大于 64)时,将链表转化为红黑树,以减少搜索时间,key/value可为null

  • LinkedHashMap:继承自 HashMap,使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

  • TreeMap:红黑树

  • Hashtable:数组+链表组成的,线程安全的,它是遗留类,不应该去使用它,而是使用 ConcurrentHashMap 来支持线程安全,key/value不可为null

线程安全的集合类

ArraylistLinkedListHashMapHashSetTreeSetTreeMapPriorityQueue 都不是线程安全的。java.util.concurrent 包中提供了很多并发容器供你使用:

  • ConcurrentHashMap: 可以看作是线程安全的 HashMap
  • CopyOnWriteArrayList:可以看作是线程安全的 ArrayList,在读多写少的场合性能非常好,远远好于 Vector.
  • ConcurrentLinkedQueue:高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。
  • BlockingQueue: 这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。
  • ConcurrentSkipListMap :跳表的实现。这是一个Map,使用跳表的数据结构进行快速查找。

2. 如何选用集合

以下基于《Java编程思想》第四版第17章 容器深入研究 总结

  • List的选择:
    最佳的做法可能是将ArrayList作为默认首选,只有需要额外的功能,或者频繁的进行插入和删除而使性能变差的时候,才去选择LinkedList。如果使用的是固定数量的元素,可以Arrays.asList()产生的列表List。或者直接使用数组。应该避免使用Vector,应该使用CopyOnWriteArrayList,专门用于并发编程。
  • Set的选择
    HashSet的性能最好。只有需要一个有序的Set时,才应该使用 TreeSet。对于插入操作, LinkedHashSetHashSet的代价更高,这是由维护链表所带来额外。
  • Map的选择
    SetHashMap的性能最好。需要排序时使用TreeMap,LinkedHashMap在插入时比HashMap慢一点。避免使用HashTable,使用 ConcurrentHashMap 来支持线程安全。

3. 集合容器中的设计模式

迭代器模式

Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。

public interface Iterator<E> {
    //集合中是否还有元素
    boolean hasNext();
    //获得集合中的下一个元素
    E next();
    ......
}

从 JDK 1.5 之后可以使用 foreach 方法来遍历实现了 Iterable 接口的聚合对象。

List<String> list = new ArrayList<>();
for (String item : list) {
    System.out.println(item);
}

适配器模式

java.util.Arrays#asList() 可以把数组类型转换为 List 类型。

@SafeVarargs
public static <T> List<T> asList(T... a)
Integer[] arr = {1, 2, 3};
List list = Arrays.asList(arr);
//也可以使用以下方式调用 asList():
List list = Arrays.asList(1, 2, 3);

应该注意的是 asList() 的参数为泛型的可变长参数,不能使用基本类型数组作为参数,只能使用相应的包装类型数组。

感谢看官看完!本来想挨个分析源码,还是太年轻。且不说花了多长时间,限于篇幅,码字,排版,编辑...真是令人头大

磕磕绊绊写完了基本篇,下篇源码分析,敬请期待!

ps

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

推荐阅读更多精彩内容