1. Java·Collection内部细剖

文章目录

  • 1. Java·Collection内部细剖
    • 1.1. 大纲
      • 1.1.1. Collection
      • 1.1.2. Iterable
      • 1.1.3. 集合
        • 1.1.3.1. Set
          • 1.1.3.1.1. HashSet
            • 1.1.3.1.1.1. LinkedHashSet
          • 1.1.3.1.2. SortedSet
            • 1.1.3.1.2.1. TreeSet
          • 1.1.3.1.3. EnumSet
        • 1.1.3.2. List
          • 1.1.3.2.1. ArrayList
          • 1.1.3.2.2. LinkedList
          • 1.1.3.2.3. Vector
            • 1.1.3.2.3.1. Stack
        • 1.1.3.3. Queue
          • 1.1.3.3.1. PriorityQueue
          • 1.1.3.3.2. Deque
            • 1.1.3.3.2.1. ArrayDeque
            • 1.1.3.3.2.2. LinkedList
      • 1.1.4. Map
        • 1.1.4.1. HashMap
          • 1.1.4.1.1. LinkedHashMap
        • 1.1.4.2. Hashtable
          • 1.1.4.2.1. Properties
        • 1.1.4.3. SortedMap
          • 1.1.4.3.1. TreeMap
        • 1.1.4.4. WeakHashMap
        • 1.1.4.5. IdentityHashMap
        • 1.1.4.6. EnumMap
    • image

花了一下午时间,大致整理了一下Java的Collection接口内部的各个接口和实现类。由于时间和精力因素,只能将Collection宏观上的一些接口与实现类进行简单总结,至于实现类里都是如何运作以及运行机制,本文不会涉及。


最近使用了一款思维导图软件,推荐给大家,并且本文就用它来完成了大纲和注释部分。遗憾的是它仅支持IOS和MacOS系统上,如果有条件,大家可以试一试:MindNote,如果你正在寻找一款思维导图软件,可以尝试使用一下。

IOS端

MacOS端


1.1. 大纲

先来一张大纲图

如图所示,Collection接口中,实现了Iterable接口,从此可得出结论:有Collection派生出的子类和子接口的实现类,都有iterator()方法。该方法多用于遍历集合内部的元素。
从Collection接口中,派生出了两类,分别是:集合类、Map类。list类用于存放单个元素,Map类用于存放键值对结构的数据。

接下来,我们从Collection内部的点点滴滴说起。

1.1.1. Collection

Collection是最基本的集合接口,一个Collection代表一组Object集合,这些Object被称作Collection的元素。Collection是一个接口,用以提供规范定义,不能被实例化使用。

1.1.2. Iterable

迭代器接口,这是Collection类的父接口。实现这个Iterable接口的对象可使用foreach遍历。也就是说,所有Collection结合都具有foreach遍历方法。

1.1.3. 集合

1.1.3.1. Set

  1. Set是一个接口,继承自Collection,集合中对象皆为无序。且不能包含有重复元素,这是Set类层的共有属性
  2. 判断两个对象相同不能使用==运算符,而是根据equals方法。在Set中加入新元素时,如果在新增时,新元素和Set中已有的对象进行比较都返回false,则Set就会接受这个新元素对象。否则插入失败。
  3. 由于以上Set的制约,在使用时应注意:①为Set集合中的元素类中实现一个有效地equals方法;②对Set的构造函数,传入的Collection参数不能包含重复的元素。
1.1.3.1.1. HashSet

HashSet是Set接口的实现,使用HASH算法来存储集合中的元素,存取和查找性能良好。当向HashSet中存入元素时,HashSet会调用该对象的hashcode()方法得到hashCode值,然后据此决定该对象在HashSet中的存储位置。

1.1.3.1.1.1. LinkedHashSet
  1. LinkedHashSet继承自HashSet
  2. LinkedHashSet也是根据元素的HashCode决定元素的存储位置,和HashSet不同的是,它同时使用链表维护元素次序,这样使元素看起来是以插入时的顺序保存的。
  3. 当遍历LinkedHashSet集合时,会按元素的添加顺序来访问集合的元素。
  4. 由于LinkedHashSet需要维护元素的插入顺序,因此性能地狱HashSet,但在迭代访问全部元素时会有很好的性能(链表遍历性能高)
1.1.3.1.2. SortedSet
  1. SortedSet是一个接口,不可实例化
  2. 顾名思义,此接口用于排序操作,实现此接口的子类都属于排序的子类。
1.1.3.1.2.1. TreeSet
  1. TreeSet是SortedSet接口的实现类,他可以确保集合元素处于排序状态
1.1.3.1.3. EnumSet
  1. EnumSet是一个专门为枚举类设计的集合类
  2. 所有元素都必须指定枚举值,在创建EnumSet时显式或隐式地指定。
  3. EnumSet中元素也是有序的,他们以枚举在EnumSet类内的定义顺序来决定集合元素的顺序

1.1.3.2. List

  1. List是一个接口;
  2. 代表元素有序、可重复的集合。
  3. 集合中每个元素都有对应的顺序索引。
  4. 允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。
  5. List集合默认按元素的添加顺序设置元素的索引。
1.1.3.2.1. ArrayList
  1. ArrayList是List的实现类
  2. 基于数组实现的List类
  3. 它封装了一个动态增长的、允许再次分配的Object[]数组
1.1.3.2.2. LinkedList
  1. LinkedList是List和Deque接口的实现
  2. 能对他进行队列操作,即:可以根据索引来随机访问集合中的元素,同时他还是先了Deque接口,能将LinkedList当做双端队列使用,自然也可以被当做栈来使用。
1.1.3.2.3. Vector
  1. Vector是List的实现类,用法集合和ArrayList几乎完全相同;
  2. Vector线程安全
1.1.3.2.3.1. Stack
  1. Stack继承自Vector
  2. Stack用于模拟’栈‘这种数据结构(Last In First Out后进先出)

1.1.3.3. Queue

  1. Queue是Collection的子类接口
  2. 用于模拟队列这种数据结构(先进先出First In First Out)。
  3. 队列的头部保存着队列中存放时间最长的元素,队列尾部保存着队列中存放时间最短的元素。新元素插入到队列尾部,访问元素会返回队列头部的元素,且不允许随机访问队列中的元素。
1.1.3.3.1. PriorityQueue

不了解,暂不做介绍

1.1.3.3.2. Deque

Deque是Queue的子类接口

1.1.3.3.2.1. ArrayDeque

不了解,暂不做介绍

1.1.3.3.2.2. LinkedList
  1. LinkedList是List和Deque接口的实现
  2. 能对他进行队列操作,即:可以根据索引来随机访问集合中的元素,同时他还是先了Deque接口,能将LinkedList当做双端队列使用,自然也可以被当做栈来使用。

1.1.4. Map

  1. Map
  2. Map用于保存具有映射关系的数据,因此Map集合保存了key与value两组值;
  3. Key和Value都可以使任何引用类型的数据,但Key不允许重复。即:同一个Mao对象的任何两个key通过equals比较结果总是返回false
  4. Map的这些实现类和子接口中value的存储行事和List非常相似(即value可以重复,根据索引来查找)

1.1.4.1. HashMap

  1. HashMap是Map的实现类
  2. HashMap和HashSet一样也不能保证元素顺序,也是以hashCode值来存放位置,并且也是通过key值得equals比较两个key是否相等
1.1.4.1.1. LinkedHashMap
  1. LinkedHashMap继承自HashMap
  2. LinkedHashMap也使用双向链表来维护键值对的次序,该链表只负责维护Map迭代的顺序,其顺序就是Map插入的顺序

1.1.4.2. Hashtable

  1. 是Map的实现类
  2. 支持同步,线程安全
1.1.4.2.1. Properties
  1. Map的实现类
  2. 其在处理属性文件时很方便(例如win平台的.ini文件)
  3. Properties可以把Map对象和属性文件关联起来,从而可以把Map对象中的键值对写入到属性文件中,也可以加载到Map对象中

1.1.4.3. SortedMap

  1. 是Map的一个子接口
  2. 如Set接口派生出SortedSet、SortedSet有一个TreeSet实现类一样,Map接口中也派生出一个SortedMap、SortedMap也有一个TreeMap实现类
1.1.4.3.1. TreeMap
  1. TreeMap是SortedMap的实现类
  2. TreeMap是一个红黑树数据结构,每个键值对作为红黑树的一个节点。
  3. TreeMap存储键值对时,需要根据Key对节点进行排序。
  4. 因此TreeMap可以保证所有键值对处于有序窗台。同样,TreeMap也有两种排序方式:自然排序、定制排序

1.1.4.4. WeakHashMap

  1. WeakHashMap是Map的实现类
  2. WeakHashMap与HashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的"强引用",这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。
  3. WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对

1.1.4.5. IdentityHashMap

IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等

1.1.4.6. EnumMap

EnumMap是一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)


最后放一张长图,各位可以在卫生间的时候学习~:


版权申明:未经作者同意,禁止转载。

Java·Collection内部细剖相关推荐

  1. java打印版本兼容_打印class文件的Java编译器内部的版本号

    当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误. 错误信息如下 : Unsupported major.minor version 5 ...

  2. Java Review - Java进程内部的消息中间件_Event Bus设计模式

    文章目录 概述 EventBus架构类图 Code Bus接口 (定义注册topic以及发送event接口) 自定义注解-回调方法及topic 同步EventBus 异步EventBus Subscr ...

  3. java构造函数内部调用_具有内部类构造函数参数的Java Reflection奇数

    java构造函数内部调用 关于Java内部类 Java允许成员类(在其他类内定义的类),局部类(在语句块内定义的类)和匿名类(无名称的类): class Outer {Object anonymous ...

  4. 2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型

    2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型 Collection集合 java.util.coLlection接口 所有单列集合的最 ...

  5. java内部错误2203_Win7系统安装Java出现内部错误2203怎么办

    大家都知道Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言,专业电脑人员都会安装Java.有朋友在Win7 32位系统安装Java程序的时候出现错误,提示"内部错误2203&qu ...

  6. Java - Collection

    Collection层次结构 Collection [plain] view plaincopy print? 子接口 Set,List 集合中只能放置对象的引用,不能放置原生数据类型, 我们需要使用 ...

  7. Java Collection类型的forEach方法

    countryList是一个List接口,扩展自Collection: 后者又扩展自Iteratable, forEach就是Iterable提供的方法. forEach接受的方法参数为Consume ...

  8. 设计: ListView 接口,and the missing read-only interfaces in java collection framework

    Java的集合框架以其成功易用的设计征服了很多人(包括我),并且教科书式的诠释了泛型的应用方式. 我也是被 Joshua Bloch 的书引领入门,从中得益良多.我当然不会认为自己在设计上比他懂得更多 ...

  9. java collection 遍历_Java for循环对集合的遍历

    原标题:Java for循环对集合的遍历 Java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合 ...

最新文章

  1. 放弃在每日站会上按成员逐个发言
  2. 【转载】DotNet 资源大全中文版
  3. 生成朋友圈转发点赞截图的小工具
  4. Linux的find -print 和 -print0区别:换行不换行
  5. 图像灰度变换及图像数组操作
  6. 今年双11,阿里业务100%上云
  7. centos 6.5装mysql 5.7,centos 6.5装mysql5.7
  8. control的用法及短语_九上U5(control)微课详解与精练
  9. Layui自定义表单校验规则
  10. 算法笔记和上机实战训练指南(附下载)
  11. 第7周 文件和数据格式化
  12. qq飞车手游忘记哪个区了服务器也没显示,qq飞车手游怎么找回以前玩的区 | 手游网游页游攻略大全...
  13. Netlimiter 3.0 注册码
  14. 网站源码、模板分享(前端)
  15. 你应该学点哲学的20个理由:不为拥有深奥的思想,只为更好地生活
  16. 机器学习(2)——周志华
  17. 案例:三个和尚(升级版)
  18. 常见3D游戏物理引擎总结
  19. RCLAMP0544T 国产替代上海雷卯ULC0544T
  20. 命令之 dirname

热门文章

  1. 本周大新闻|John Carmack从Meta离职,OPPO发布双目AR一体机仅38g
  2. js check共通方法
  3. C语言8大经典排序算法(1)
  4. mysql删除字段语句
  5. iOS平台的应用程序调试与分析(openssh + gdb)
  6. 搬砖的开始 HFSS入门 T型波导的内场分析
  7. 字节跳动CEO 张一鸣卧底公司群2天,怒斥员工摸鱼
  8. 关于idea的浏览器图标消失
  9. VScode使用SSH连接Linux(Ubuntu)系统程序开发,详细教程
  10. 为了吾王哪个服务器稳定,为了吾王全职业解析 职业定位及特点讲解