Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】
1.ArrayList
(1)底层是由动态数组实现的【使用了List接口】。
(2)动态数组是长度不固定,随着数据的增多而变长。
(3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会创建新的数组,新数组长度是当前数组的1.5倍,然后当前数组的元素复制到新的数组后,当前数组的内存被释放。
(4)存储和删除的效率比较低,但是查询的效率非常高。
(5)没有锁,因此是线程不安全的,因此是非同步的。
2.LinkedList
(1)底层是由双向链表的数据结构实现的【使用了List接口】,
因此存储和删除的效率非常高,但是查询需要从头按顺序找,因此效率比较低。
(2)即便使用了二分查找【分两半查找,先判断index是在链表的哪一半,然后再去对应区域查找,这样最多只要遍历链表的一半节点即可找到】,但速度远比arraylist慢得多
(3)没有锁,因此是线程不安全的,因此是非同步的。
3.hash table
(1)哈希表,也叫散列表,是根据关键码值直接访问的数据结构。
(2)通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。
(3)那么这个映射函数叫做散列函数,存放记录的数组叫做散列表。
4.HashMap
(1)键值都允许为null,是哈希表的Map接口实现,没有锁,因此是线程不安全的,是非同步的。
(2)底层是使用动态数组【使用Node[] ,不使用Entry[]存储键值对】和单向链表 组合实现的,也就是说,底层是节点数组,每个数组元素内部装有单向链表,
当链表长度大于一定值时,链表会转换成红黑树【jdk1.8后才有红黑树】,这样可以减少链表查询时间。
(3)动态的节点数组在扩容时,会新建一个数组,并把当前数据元素赋值到新数组中,这个过程很耗性能。
(4)存入数据时【也就是要存入一个Node对象】,会根据key的hash算法来决定存在数组
【Node[]】中的哪个位置,在该位置上【也就是在这个数组元素上】,再根据equals方法来决定存储在该位置链表的哪个位置。
(5)读取数据时【也就是取出一个Node对象】,会根据key的hash算法来找到其在数组中的存储位置,然后使用equals方法,从该位置的链表中找到该Node。
5.Hashtable
(1)键值都不允许为null,是哈希表的Map接口实现,线程安全,因为使用了同步锁synchronized,因此每次线程操作表时,会加锁,其他线程需要等待。
(2)底层是使用动态数组【Entry[],即键值对对象数组】和单向链表 组合实现的【与HashMap类似】,
也就是说,底层是Entry数组,每个数组元素内部装有单向链表。
(3)【存储数据和读取数据与HashMap十分类似】
存入数据时【也就是要存入一个Entry对象】,会根据key的hash算法来决定存在数组
【Entry[]】中的哪个位置,在该位置上【也就是在这个数组元素上】,再根据equals方法来决定存储在该位置链表的哪个位置。
读取数据时【也就是取出一个Entry对象】,会根据key的hash算法来找到其在数组中的存储位置,然后使用equals方法,从该位置的链表中找到该Entry。
(4)总体来说,与HashMap十分相似,区别在于线程是否安全、键值是否允许为null、
底层数组类型具体是什么、链表是否会转换成红黑树。
(5)注意Hashtable与hash table 单词写法,两个不是一个东西。
6.ConcurrentHashMap
(1)是线程安全的,内部分多个段,每个段其实就是个小的Hashtable也就是说,
每次线程操作段都要加锁,但是不同段互不影响,因此,如果是多线程操作不同的段,
则允许并发操作,此外,允许并发查询同一个段的内容,查询不需要加锁,
如果是对段做写操作则会加锁,线程同步阻塞。
(2)因为段使用了Hashtable,因此底层数组类型也是Entry[],具体的底部存储和读取实现也是与Hashtable相同。
7.hash code
(1)译为 哈希值 ,
(2)对象 相等则 哈希值 一定相等,
(3)但 哈希值 相等,对象 不一定相等。
8.HashSet
(1)意为哈希集合,HashSet实现 Set接口 。
(2)底层是使用HashMap来存储数据的,各个操作实际上是调用了HashMap的方法来完成,因此HashSet元素是无序的。
(3)存储在HashSet的元素,实际上,将会存在HashMap的key里面,而值为一个固定的值【是什么无关紧要,但是必须统一固定】,每次添加新元素时,
将会调用HashMap的put()方法,既然值时固定的,那么如果key已经存在,则HashMap不会再新建重复的元素,这就是HashSet存储数据不可重复的原因。
9.LinkedHashMap
(1)继承于HashMap,因此有HashMap的特点,非同步、允许键值为null等。
(2)通过重写HashMap相关方法,重新定义了数组中保存的元素Entry,每个元素除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。
10.LinkedHashSet
(1)意为 线性哈希集合。
(2)LinkedHashSet底层使用LinkedHashMap来保存所有元素。
(3)继承了HashSet,其所有的方法操作上又与HashSet相同。
Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】的更多相关文章
- List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...
- java面试-CAS底层原理
一.CAS是什么? 比较并交换,它是一条CPU并发原语. CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什 ...
- 理解java容器底层原理--手动实现LinkedList
Node java 中的 LIinkedList 的数据结构是链表,而链表中每一个元素是节点. 我们先定义一下节点: package com.xzlf.collection; public class ...
- java容器类1:Collection,List,ArrayList,LinkedList深入解读
1. Iterable 与 Iterator Iterable 是个接口,实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符 ...
- Java 注解及其底层原理
目录 什么是注解? 注解的分类 Java自带的标准注解 元注解 @Retention @Documented @Target @Inherited @Repeatable 自定义注解 自定义注解的读取 ...
- [Java] I/O底层原理之二:网络IO及网络编程
首先我们来看一下当访问一个域名时它的过程 查找 DNS 首先,浏览器检查缓存中有没有 浏览器缓存中没有,则查找操作系统中有没有配置这个对应关系 如果操作系统中也没有,则去 DNS 查找,即发送DNS报 ...
- [Java] I/O底层原理之一:字符流、字节流及其源码分析
关于 I/O 的类可以分为四种: 关于字节的操作:InputStream 和 OutPutStream: 关于字符的操作:Writer 和 Reader: 关于磁盘的操作:File: 关于网络的操作: ...
- 基于JAVA Socket的底层原理分析及工具实现
前言 在工作开始之前,我们先来了解一下Socket 所谓Socket,又被称作套接字,它是一个抽象层,简单来说就是存在于不同平台(os)的公共接口.学过网络的同学可以把它理解为基于传输TCP/IP协议 ...
随机推荐
- 【C/C++】散列/算法笔记4.2
先说一下我自己的理解. 我先给你N组数据,这个N组里可能有重复的! 然后我们先统计好了N组里面的独立的每个对应的出现了几次(相当于map,然后每项属性有出现了多少次的),用的是数组下标对应 现在我们给 ...
- 转:Java多线程基础问题
如果你即将去一家从事大型系统研发的公司进行Java面试,不可避免的会有多线程相关的问题.下面是一些针对初学者或者新手的问题,如果你已经具备良好的基础,那么你可以跳过本文,直接尝试针对进阶水平的Java ...
- 『学了就忘』Linux系统管理 — 84、Linux中进程的管理
目录 1.Linux系统中的信号 2.杀掉进程的命令 (1)kill命令 (2)killall命令 (3)pkill命令 1.Linux系统中的信号 Linux系统中可以识别的信号较多,我们可以使用命 ...
- [BUUCTF]REVERSE——firmware
firmware 附件 步骤: 检查文件没有看出什么,ida载入一堆乱码,看了其他师傅的wp才知道要先binwalk对文件进行提取 120200.squashfs这是一个linux的压缩文件 我们需要 ...
- Windows 10 彻底关闭 Antimalware Service Executable 降低内存占用
概述 最近给内网的一台电脑安装 Windows 10 专业版系统,由于此电脑不会涉及到不安全因素,所以杀毒软件非必须. 以最大限度节省系统资源考虑,默认安装的 Micoroft Defender 占用 ...
- CF205A Little Elephant and Rozdil 题解
Content 有一头小象住在 \(\texttt{Rozdil}\) 小镇里,它想去其他的小镇旅行. 这个国家一共有 \(n\) 个小镇,第 \(i\) 个小镇距离 \(\texttt{Rozdil ...
- 几个主流TCP/IP协议栈介绍
我们知道TCP IP协议栈内包括了诸多协议.那么对于这当中的协议的功能以及作用,我们来具体了解一下吧.现在让我们做一个盘点,帮助大家总结一下,还望对大家能够有所帮助. 1.BSD TCP IP协议栈 ...
- .net Core 使用 iTextSharp 生成PDF 简单示例
在 Nuget 中导入需要的插件: 实现的代码: 1 [HttpGet, Route("CreatePdf")] 2 public Response CreatePdf() 3 { ...
- vue-子组件创建/注册/使用流程
流程分为三步 非单文件组件:(实际不用,因为很麻烦,框架都是多文件组件) 局部注册 1.创建一个组件 const school = Vue.extend({ // 传入配置对象 // 子组件配置对象不 ...
- c++设计模式概述之适配器
类写的不规范(应该屏蔽类的拷贝构造函数和运算符=).少写点代码,缩短篇幅,重在理解. 实际中可不要这样做. 类比生活中的手机,pad等电源适配器. 简单来讲: 将原本 不匹配 的两者 变的匹配 ...