针对Java集合类的小总结
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集合类的小总结的更多相关文章
- Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP)
Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP) “微服务架构”的话题非常之火,很多朋友都在小窗我,说怎么做服务化?解答“怎么做”之前,先得了解“为什么做”. 画外音:做 ...
- Java集合类操作优化经验总结
本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList.ArrayList.Vector.Stack.Hashtable.HashMap.Weak ...
- 一招破解 Java 集合类面试题
今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...
- 【转载】Java集合类Array、List、Map区别和联系
Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...
- Java集合类: Set、List、Map、Queue使用场景梳理
本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...
- Java集合类: Set、List、Map、Queue使用
目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...
- 基础知识《六》---Java集合类: Set、List、Map、Queue使用场景梳理
本文转载自LittleHann 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F% ...
- java集合类(六)About Queue
接上篇“java集合类(五)About Map” 终于来到了java集合类的尾声,太兴奋了,不是因为可以休息一阵了,而是因为又到了开启新知识的时刻,大家一起加油打气!!Come on...Fighti ...
- java集合类(五)About Map
接上篇“java集合类(四)About Set” 这次学完Map之后,就剩队列的知识,之后有关java集合类的学习就将告一段落,之后可能会有java连接数据库,I/O,多线程,网络编程或Android ...
随机推荐
- docker swarm集群挂载宿主机目录
创建DOCKER集群,挂载宿主机目录src:宿主机目录,dst:容器目录 docker service create --name testrd --detach=false --mount type ...
- 数据挖掘 FP-tree算法C++实现及源码
FP-growth挖掘算法 步骤一 扫描数据库,扫描数据库一次,得到频繁1-项集,把项按支持度递减排序,再一次扫描数据库,建立FP-tree 步骤二 对每个项,生成它的 条件模式库 步骤三 用条件模式 ...
- 6.1_springboot2.x分布式-整合SpringCloud
1.SpringCloud简介 Spring Cloud是一个分布式的整体解决方案.Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性t ...
- extend java vm memory parameter in pom.xml
<project> [...] <build> [...] <plugins> <plugin> <groupId>org.apache.m ...
- tomcat访问控制及站点部署
访问控制: 在访问tomcat服务器状态时,出现403错误. 解决方法: [root@localhost ~]# vim /usr/local/tomcat8/conf/tomcat-users.xm ...
- 文件上传到ftp服务工具类
直接引用此java工具类就好 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep ...
- linux redis的启动---后台启动
1.启动redis服务: redis-server 如果想要开启后台进程: 1.找到redis.conf里边的 把no 改为yes. 2.redis-server redis.conf(这个是针对两个 ...
- html中没有不能随意嵌套的标签
在HTML里有几个元素是比较特别的:<ul>.<ol>.<dl>.<table>,它们的子一层必须是指定元素,<ul>.<ol> ...
- ES6点点点运算符
1. rest(可变)参数 * 用来取代arguments 但比arguments灵活,只能是最后部分形参参数 function add(...values) { let sum = ; for(va ...
- $.extend() $.fn.extend()
(非原创)jQuery为开发插件提拱了两个方法,分别是:jQuery.fn.extend();jQuery.extend();虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便 ...