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协议 ...
随机推荐
- 如何利用EL表达式获取list,map,对象等值
<%@ page import="com.hopetesting.domain.User" %><%@ page import="java.util.* ...
- 捷码:重塑DevOps,打造更流畅紧密的开发与服务交付业务链
捷码Gemcoder 1周前如果有机会安排一场行业吐槽大会,熟悉软件开发.交付.服务业务各环节的业内人士,对开发中的各种扯皮.交付反反复复.运维服务中的提心吊胆,往往会有很多深刻的体验和刻骨铭心的案例 ...
- VUE3 之 template 语法
1. 概述 老话说的好:干一行,爱一行,踏实工作才是真正快乐的源泉. 言归正传,今天继续聊 VUE3 的话题,今天聊聊 template 语法. 闲话不多说,直接上代码. 2. template 语法 ...
- 学Java,Java书籍的最佳阅读顺序
疫情以来,好久没出差了,今天出差去趟上海,早上 4 点多就起床了,到机场天都没亮.到登机口离起飞还一小时,趁着等飞机的时间,抓紧码字,把这篇文章收个尾. 今天和大家说说学 Java 的读书路线.路线中 ...
- [BUUCTF]PWN——gyctf_2020_borrowstack
gyctf_2020_borrowstack 附件 步骤: 例行检查,64位程序,开启NX保护 本地运行一下程序,看看大概的情况 64位ida载入,直接从main函数开始看程序, buf可以溢出0x1 ...
- 【WP】攻防世界-杂项-Misc
长期更新一波 攻防世界 的杂项题解 这东西主要靠积累吧 攻防世界:https://adworld.xctf.org.cn 因为攻防世界的题目顺序经常变化,我也不改序号了,顺着之前写的位置往下写,推荐使 ...
- 【Redis的那些事 · 上篇】Redis的介绍、五种数据结构演示和分布式锁
Redis是什么 Redis,全称是Remote Dictionary Service,翻译过来就是,远程字典服务. redis属于nosql非关系型数据库.Nosql常见的数据关系,基本上是以key ...
- LuoguP7859 [COCI2015-2016#2] GEPPETTO 题解
Content 有 \(n\) 个数 \(1\sim n\).你需要在其中选若干个数.但是还有 \(m\) 个限制,第 \(i\) 个限制格式为 \(a_i\) 不能和 \(b_i\) 一起选.问你一 ...
- java数据类型:集合存储元素类型限制<泛型> ;自定义类指定泛型<T> 以及限制用法;派生子类泛型<T> super(泛型内参数); 泛型通配符?以及?限制用法
问题背景 Java 集合有个缺点,把一个对象"丢进"集合里之后,集合就会"忘记"这个对象的数据类型,当再次取出该对象时 该对象的编译类型就变Object类型(其 ...
- C++之去重
note 今天刷题,忘了去重复库函数,于是手写了一个. 前提: 必须保证数组是有序的. 源码 template <typename T> void unique_arr(T arr[], ...