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. linux进阶之路(一):linux入门

    Linux:开源.免费得开源系统.具有高效性.稳定性.安全性.处理多并发. Linux的发行版本:基于Linux,不同的安装软件 CentOS(RedHat开源版本) RedHat Ubuntu Su ...

  3. pair的用法

    如何定义?(初始化) 1. pair<int,int>p; 2.定义即初始化,也可以这个样子 pair<,); 里面的类型还可以是string,double等. 3.还可以这样子初始 ...

  4. 51nod1787最大子方阵

    51nod1787最大子方阵 我在51nod上面切的第一道题 我在51nod上面切的第一道8级题 我在51nod上面切的第一道8级题的一血 题目大意 有一个n*m的矩阵,矩阵中的每一个元素是'X'或者 ...

  5. flink收藏博客

    1.https://blog.csdn.net/liguohuabigdata/article/category/7279020 2.http://wuchong.me 3.https://www.j ...

  6. PostgreSQL——服务器配置_{postgresql.conf}

    一.设置参数 所有参数名称都是不区分大小写的 值为字符串时,需要单引号 值为数值时不需要单引号,但带单位时,需要单引号 配置文件(如:postgresql.conf.postgresql.auto.c ...

  7. strcmp 和 strcoll的区别

    功能和strcmp类似,用法也一样.   特别注意:strcoll()会依环境变量LC_COLLATE所指定的文字排列次序来比较s1和s2 字符串.   strcmp是根据ASCII来比较2个串的.  ...

  8. java-day02

    数据类型自动转换 要求:数据范围从小到大 数据类型强制类型转换 格式:范围小的数据类型 范围小的变量名 = (范围小的数据类型)原范围大的数据 注意事项: 1.可以会造成数据溢出或者是精度损失. 2. ...

  9. (数据科学学习手札58)在R中处理有缺失值数据的高级方法

    一.简介 在实际工作中,遇到数据中带有缺失值是非常常见的现象,简单粗暴的做法如直接删除包含缺失值的记录.删除缺失值比例过大的变量.用0填充缺失值等,但这些做法会很大程度上影响原始数据的分布或者浪费来之 ...

  10. JS window对象取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间。

    取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间. 语法: clearInterval(id_of_setInterv ...