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. 2、获取APP CPU占用率

    前面已经介绍过如何获取包名和主活动名.这里不再过多赘述.我们依旧采取两种方案实现APP CPU占有率 Windows下获取APP CPU占用率 adb shell "dumpsys cpui ...

  2. PAT_A1080#Graduate Admission

    Source: PAT A1080 Graduate Admission (30 分) Description: It is said that in 2011, there are about 10 ...

  3. PAT_A1024#Palindromic Number

    Source: PAT A1024 Palindromic Number (25 分) Description: A number that will be the same when it is w ...

  4. vacuumdb - 收集垃圾并且分析一个PostgreSQL 数据库

    SYNOPSIS vacuumdb [ connection-option...] [ --full | -f ] [ --verbose | -v ] [ --analyze | -z ] [ -- ...

  5. linux常用命令-4查看文件内容命令

    vi file #打开并浏览文件 grep str /tmp/test #在文件 ‘/tmp/test’ 中查找 “str” grep ^str /tmp/test #在文件 ‘/tmp/test’ ...

  6. eclipse创建MAVEN项目是出现Could not resolve archetype的解决办法

    eclipse第一次创建MAVEN项目时出现这个问题,查了很多文档改了没用,后来问了别人知道是maven中央仓库下载插件包失败就会报错. 解决办法: 用国内阿里云镜像会好很多 在settings.xm ...

  7. [转]Netty入门(最简单的Netty客户端/服务器程序)

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...

  8. windows 登陆服务器

    点击电脑的左下方开始,然后输入远字,如下图,就可以招到远程桌面了. 点击远程桌面就进入下图界面了.默认情况下,是在常规这个选项卡. 我们切换到显示,可以调节远程桌面的大小,一般我们设置成全屏显示.只要 ...

  9. Dart编程数字Number

    Dart数字可以分为: int - 任意大小的整数. int 数据类型用于表示整数. double -64位(双精度)浮点数,由IEEE 754标准规定. 在 double 数据类型用于表示小数 in ...

  10. thinkphp 表单合法性检测

    在处理表单提交的数据的时候,建议尽量采用Think\Model类提供的create方法首先进行数据创建,然后再写入数据库. 大理石平台厂家 create方法在创建数据的同时,可以进行更为安全的处理操作 ...