Java基础篇——集合浅谈
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10703558.html,否则将追究法律责任!!!
Set(基于Map来实现的,不细说)
HashSet(不重复、无序、非线程安全的集合)
底层实现,源码如下:
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { static final long serialVersionUID = -5024744406713321676L;
//卖个关子,这里为啥要用transient关键字? 评论区见哦!
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object(); public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
...
}
不用多说,是不没想到,原来HashSet是基于HashMap实现的,元素都存到HashMap键值对的Key上面,而Value时有一个统一的值private static final Object PRESENT = new Object();
注意:
- 对于HashSet中保存的对象,主要要正确重写equals方法和hashCode方法,以保证放入Set对象的唯一性
- HashSet没有提供get()方法,愿意是同HashMap一样,Set内部是无序的,只能通过迭代的方式获得
TreeSet(不重复、有序、非线程安全的集合)
底层实现,源码如下:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable { private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
} public TreeSet() {
this(new TreeMap<E,Object>());
}
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
}
我去,又是这个尿性,基于TreeMap来实现的
注意:
- 首先要正确重写equals方法和hashCode方法,以保证放入Set对象的唯一性
- 需要实现Comparable接口,从而实现有序存储
LinkedHashSet(不重复、位置有序、非线程安全的集合)
底层实现,源码如下:
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable { private static final long serialVersionUID = -2851667679971038690L; public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
public LinkedHashSet() {
super(16, .75f, true);
}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
}
都是super,实现了把HashSet中预留的构造方法启用了,因而可以实现有序插入(LinkedHashMap再谈究竟)
注意:
- 首先要正确重写equals方法和hashCode方法,以保证放入Set对象的唯一性
- 内部实现了有序插入,所以使用时不需要考虑
Map
HashMap(无序、线程不安全)
Jdk1.7数据存储结构(采用数组+链表)


Jdk1.8数据存储结构(采用数组+链表+红黑树)

注意:在链表长度大于8后,查询复杂度由O(n)变为O(logn),将链表存储转换成红黑树存储(也就是TreeMap)
红黑树R-B Tree简介(本质其实是2-3-4树):

二叉树特性:
(1)左字数上所有的节点的值都小于或等于他的根节点上的值
(2)右子树上所有节点的值均大于或等于他的根节点的值
(3)左、右子树也分别为二叉树
红黑树特点(一种平衡二叉树):
(1)每个结点要么是红的要么是黑的。
(2)根结点是黑的。
(3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
(4)如果一个结点是红的,那么它的两个儿子都是黑的。
(5)对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点
节点操作:
(1)左旋
(2)右旋
(3)变色
TreeMap(有序、线程不安全)
- 底层就是红黑二叉树
LinkedHashMap(有序、线程不安全)
底层实现,源码如下:
static class Entry<K,V> extends HashMap.Node<K,V> {
//这里维护了一个before和after的Entry, 见名思意, 就是每个Entry<K,V>都维护它的上一个元素和下一个元素的关系。这也是LinkedHashMap有序的关键所在。
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
LinkedHashMap是继承HashMap, 也就是说LinkedHashMap的结构也是和HashMap那样(数组+链表)
注意:LinkedHashMap分为插入的顺序排列和访问的顺序排列两种方式,通过accessOrder参数来控制
Hashtable(线程安全)
- 底层数据结构同HashMap。线程安全,效率低,没什么卵用,需要使用线程安全的Map可以使用ConcurrentHashMap
List
ArrayList(位置有序、可重复、线程不安全)
- 底层数据结构是数组,查询快
LinkedList(有序、线程不安全)
- 底层数据结构是双向链表,查询慢,增删快
Vector(有序、线程安全)
- 底层数据结构是数组,查询快,增删慢
并发集合
ConcurrentHashMap(线程安全)
- 利用了锁分段的思想提高了并发度,把Map分成了N个Segment,每个Segment相当于HashTable
CopyOnWriteArrayList(线程安全)
- 读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
Queue
非阻塞队列
- PriorityQueue :实质上维护了一个有序列表
- ConcurrentLinkedQueue :基于链接节点的、线程安全的队列
阻塞队列
- ArrayBlockingQueue :一个由数组支持的有界队列。
- LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
- PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
- DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
- SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
总结
- 本来想详细的总结一下各种集合的使用和底层实现,但发现说来说去还是数据结构的事,你要能把数组、链表、二叉树、红黑树等数据结构弄明白,这些所谓的集合也就是不同的实现而已。
- 以后有机会还是直接来搞数据结构、算法吧!
个人博客地址:
csdn:https://blog.csdn.net/tiantuo6513
cnblogs:https://www.cnblogs.com/baixianlong
segmentfault:https://segmentfault.com/u/baixianlong
github:https://github.com/xianlongbai
Java基础篇——集合浅谈的更多相关文章
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
- 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!
前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...
- Java基础篇(JVM)——类加载机制
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...
- Java基础篇(JVM)——字节码详解
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- java基础篇---I/O技术(三)
接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...
随机推荐
- tomcat服务器怎样远程调试
适合windows系统 1.首先tomcat/bin目录下startup.bat打开最前面添加以下代码: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Dj ...
- 理解 Linux 的虚拟内存
前言 前不久组内又有一次我比较期待的分享:”Linux 的虚拟内存”.是某天晚上加班时,我们讨论虚拟内存的概念时,leader 发现几位同事对虚拟内存认识不清后,特意给这位同学挑选的主题(笑). 我之 ...
- Javascript高级编程学习笔记(70)—— 事件(14)内存和性能
由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...
- h5面试题
一.匿名函数实现阶乘第一种写法: 43 > F = fun(Func, 1) -> 1;43 > (Func, N) -> N * Func(Func, N - 1) end. ...
- 简单的ld链接脚本学习
一. 链接脚本的整体认识 什么是链接文件呢?作用是什么呢? 当编写了多个C文件时,我们将他们编译链接成一个可执行的文件,此时就需要用到链接脚本文件(ld).ld脚本主要功能就是:将多个目标文件(.o) ...
- Robot Framework - 一些练习
01 - 安装Robot Framework TA环境 根据系统请选择对应的版本包来安装,下面是以Win7-64bit系统为例,来说明如何搭建一个可以运行练习三test case的RF TA环境. 1 ...
- aaa配置(第十三组)
拓扑 网络情况 A PING B A PING C PC-B PING PC-C 2.R1的配置 a.console线 R1(config)#username admin1 password Admi ...
- python multiprocessing深度解析
在写python多线程代码的时候,会用到multiprocessing这个包,这篇文章总结了一些这个包在多进程管理方面的一些原理和代码分析. 1. 问题一:是否需要显式调用pool的close和joi ...
- sql server 性能调优之 资源等待PAGELATCH
一.概述 在前几章介绍过 sql server 性能调优资源等待之PAGEIOLATCH,PAGEIOLATCH是出现在sql server要和磁盘作交互的时候,所以加个IO两个字.这次来介绍PAGE ...
- casbin的分析
casbin的分析 问题 一般的项目中,都会有权限认证模块,用来控制不同的角色,可以访问的功能.比较出名的权限控制模型有ACL和RABC.如果每个项目中,都重新实现权限控制模块,这样操作会比较繁琐,希 ...