Java集合类包位于java.util下,有很多常用的数据结构:数组、链表、队列、栈、哈希表等等。了解不同的集合类的特性在开发过程中是比较重要的,感谢@兰亭风雨的专栏分析,这里我也根据自己的理解做轻度的总结,不再进行分析,因为上面的博客分析已经相当优秀。


List接口实现,一般常用的为ArrayList和LinkedList,还有不太常用的Vector,Stack。比如JDK文档声明

Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非Stack类。例如:

Deque<Integer> stack = new ArrayDeque<Integer>();

对ArrayList和Vector进行一个比较:

  • ArrayList非线程安全,Vector是线程安全的,想要使用线程安全的ArrayList类可以Collections.synchronizedList()进行包裹返回线程安全的对象,或者使用CopyOnWriteArrayList
  • 因为ArrayList和Vector基于数组实现,默认大小为10,所以需要有扩容操作,ArrayList的扩容是1.5倍+1或者所需大小,Vector是2倍
  • 都大量使用了Arrays.copyof()和System.arraycopy()进行复制,native方法,拥有数组操作的优点与不足

ArrayList和LinkedList:

  • LinkedList基于双向链表实现,按Index访问时会有一个加速操作,非线程安全
  • LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用
  • LinkedList无参构造方法直接建立一个仅包含head节点的空链表
  • 两个都允许Null值

Map接口实现类HashMap和HashTable:

Hash表的解决hash值冲突的常用方法有两种,一种是拉链法也就是每个hash值对应一个链表,另一种是线性探测法。

  • HashMap和HashTable处理冲突的方式是拉链法
  • HashMap非线程安全,HashTable线程安全
  • HashMap初始容量是16,加载因子是0.75,扩容后也必须为2的整数次幂;HashTable是11,且不为2的整数次幂
  • Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
  • HashMap可以为Null,HashTable不能为Null
  • Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,HashMap中通过h&(length-1)的方法来代替取模,同样实现了均匀的散列,但效率要高很多,这也是HashMap对Hashtable的一个改进。

TreeMap:

  • 基于2-3平衡树的红黑树来实现,最下面会对红黑树做一个简单的介绍
  • TreeMap的key不能为null,排序时要实现Comparable接口,HashMap要求重写hashCode方法和equals方法来确保没有重复的key
  • TreeMap的查询、插入、删除效率均没有HashMap高,一般只有要对key排序时才使用TreeMap

红黑树介绍:

红黑树是一种特殊的2-3平衡树,它可以保证所有的黑色边到根节点的距离相等。红黑树是有序的二叉树,通过左旋转、右旋转、变色等操作,使树基本保持平衡状态,防止出现一边倒的情况,它具有下面的性质:

  • 每个节点都只能是红色或者黑色
  • 根节点是黑色
  • 每个叶节点(NIL节点,注nil 节点就是空节点,在红黑树的实现中,nil 节点代替二叉树中的NULL)是黑色的。
  • 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

针对Java集合类的小总结的更多相关文章

  1. Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP)

    Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP) “微服务架构”的话题非常之火,很多朋友都在小窗我,说怎么做服务化?解答“怎么做”之前,先得了解“为什么做”. 画外音:做 ...

  2. Java集合类操作优化经验总结

    本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList.ArrayList.Vector.Stack.Hashtable.HashMap.Weak ...

  3. 一招破解 Java 集合类面试题

    今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...

  4. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  5. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

  6. Java集合类: Set、List、Map、Queue使用

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

  7. 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理

    本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...

  8. java集合类(六)About Queue

    接上篇“java集合类(五)About Map” 终于来到了java集合类的尾声,太兴奋了,不是因为可以休息一阵了,而是因为又到了开启新知识的时刻,大家一起加油打气!!Come on...Fighti ...

  9. java集合类(五)About Map

    接上篇“java集合类(四)About Set” 这次学完Map之后,就剩队列的知识,之后有关java集合类的学习就将告一段落,之后可能会有java连接数据库,I/O,多线程,网络编程或Android ...

随机推荐

  1. HTTP六大请求

    标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD 6.Options 但其实我们大部分情况下只用到了GET和POST.如果想设计一个符合RE ...

  2. FVWM_SMALLEST_CONFIG

    ... # ----------------------------------------------------------------- # HANDBOOK: # http://yaoqian ...

  3. Python脚本轻松实现批量图片重命名

    ************************************************************************** 摘要:网上爬取的图片名字很混乱,格式也比较多,需要 ...

  4. C#比较两个日期的大小

    DateTime dt1 = DateTime.Parse("2006-04-01"); DateTime dt2 = DateTime.Parse("2006-05-0 ...

  5. VIM编辑器进阶配置

    vim自定义设置        可以选择需要的功能添加至 ~/.vimrc 打开注释使之生效. " 让 vim 关闭所有扩展的功能,尽量模拟 vi 的行为. set nocompatible ...

  6. Vuex篇

    [Vuex篇] vuex源码你学会了吗? 我来免费教你!~ 1.vuex是什么?  Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的 ...

  7. python-Request模块使用

    request 允许发送HTTP/1.1的请求,并为我们封装了更多的方法让我们不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码.Keep-alive 和 HTTP 连接池的功 ...

  8. Use on Git

    Preface            The document is about to introduce some specialties on PLM development and mainte ...

  9. JS点击2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 使用自己的Python函数处理Protobuf中的字符串编码

    我目前所在的项目是一个老项目,里面的字符串编码有点乱,数据库中有些是GB2312,有些是UTF8:代码中有些是GBK,有些是UTF8,代码中转来转去,经常是不太清楚当前这个字符串是什么编码,由于是老项 ...