Java开发之Java容器

#来自ゾフィー(佐菲)

1 总览

1.1 List

  • ArrayList: Object[]数组
  • Vector:Object[]数组
  • LinkedList: 双向链表,JDK1.6 之前为循环链表,JDK1.7 取消了循环

1.2 Set

  • HashSet:无序,唯一的,底层采用 HashMap 来保存元素
  • LinkedHashSet:LinkedHashSet 是 HashSet 的子类,其内部是通过 LinkedHashMap 来实现
  • TreeSet:有序,唯一的,红黑树(自平衡的排序二叉树)

1.3 Map

  • HashMap
    • JDK1.8之前 :由数组 + 链表组成的,数组是 HashMap`的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。
    • JDK1.8 以后:在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。
  • LinkedHashMap:继承自 HashMap,底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
  • Hashtable: 数组 + 链表组成的,线程安全。
  • TreeMap: 红黑树(自平衡的排序二叉树)。

2 List、Set、Map 区别?

  • List:存储的元素是有序的、可重复的。
  • Set: 存储的元素是无序的、不可重复的。
  • Map: 使用键值对(kye-value)存储,Key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。

3 ArrayList 和 Vector 区别?

  • ArrayList :底层使用 Object[ ] 存储,适用于查找工作,线程不安全 ;
  • Vector:底层使用 Object[ ] 存储,线程安全的。

4 ArrayList 和 LinkedList 区别?

  • 底层数据结构不同:ArrayList 底层采用 Object 数组,LinkedList 底层采用 双向链表
  • 效率不同:ArrayList 查找快,插入和删除慢,LinkedList 查找慢,插入和删除快。
  • 内存空间占用:ArrayList 主要空间开销在于需要在列表预留一定空间;而LinkedList主要空间开销在于需要存储结点信息以及结点指针信息。

5 HashSet、LinkedHashSet 和 TreeSet 区别?

  • HashSet:是 Set 接口的主要实现类 ,底层是 HashMap,线程不安全的,可以存储 null 值;
  • LinkedHashSet:HashSet的子类,能够按照添加的顺序遍历;
  • TreeSet:底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序;

6 HashMap 和 Hashtable 区别?

  • 线程安全:HashMap 是非线程安全的,Hashtable 是线程安全的(基本被淘汰,不建议使用)。

  • 对 Null key 和 Null value 的支持:HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个。HashTable 不允许有 null 键和 null 值,否则会抛出 NullPointerException。

  • 容量

    • HashMap 默认的初始化大小为 16 ,每次扩充,容量变为原来的 2 倍,如果指定初始容量,将其扩充为 2 的幂次方大小。
    • Hashtable 默认的初始大小为 11,每次扩充,容量变为原来的 2n+1,如果指定初始容量,直接使用给定的大小。
  • 底层数据结构:HashMap:JDK1.8 以后,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

    //使用 2 的幂次方作为哈希表的大小static final int tableSizeFor(int cap) {int n = cap - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;}

7 HashMap 的长度为什么是 2 的幂次方?

HashMap 为了存取高效,要尽量较少碰撞,就是要尽量把数据分配均匀,每个链表长度大致相同,这个实现就在把数据存到哪个链表中的算法,这个算法实际就是取模,hash % length。计算机中直接求余效率不如位移运算,源码中做了优化 hash & (length-1),hash % length == hash & (length-1) 的前提是 length 是 2 的 n 幂次方;

8 Comparable 和 Comparator 的区别?

8.1 Comparable(内部比较器)

Comparable 是排序接口。若实现了 Comparable 接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

package java.lang;
import java.util.*;
public interface Comparable<T> {public int compareTo(T o);
}

8.2 Comparator(外部比较器)

Comparator 是比较接口,如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现 Comparator 接口即可。可以通过实现Comparator 来新建一个比较器,然后通过这个比较器对类进行排序。该接口定义如下:

package java.util;
public interface Comparator<T> {//负数:o1 < o2//零:o1 = o2//正数: o1 > o2int compare(T o1, T o2);boolean equals(Object obj);
}

9 ArrayList 扩容?

调用 grow() -> 初始化为 10 -> 1.5 倍 扩容

private void grow(int minCapacity) {//oldCapacity:旧容量,newCapacity:新容量int oldCapacity = elementData.length;//将oldCapacity 右移一位,新容量更新为旧容量的 1.5 倍int newCapacity = oldCapacity + (oldCapacity >> 1);//检查新容量是否大于最小需求容量,若小于需求容量,新容量为最小需求容量if (newCapacity - minCapacity < 0)newCapacity = minCapacity;//检查新容量是否超出了最大容量,//超出,调用hugeCapacity()来比较minCapacity和 MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8)//如果 minCapacity 大于MAX_ARRAY_SIZE,则新容量则为Interger.MAX_VALUE,否则,新容量大小则为 MAX_ARRAY_SIZE。if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}//比较 minCapacity 和 MAX_ARRAY_SIZEprivate static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}

10 说说 ArrayList 源码中 ensureCapacity() 作用吧?

    //增加此 ArrayList 实例的容量,确保可以容纳由minimum capacity参数指定的元素数。public void ensureCapacity(int minCapacity) {int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)// any size if not default element table? 0// larger than default for default empty table. It's already// supposed to be at default size.: DEFAULT_CAPACITY;if (minCapacity > minExpand) {ensureExplicitCapacity(minCapacity);}}

11 HashMap 底层实现

源码一定要仔细看一遍。

1.7:数组 + 链表

1.8 :当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。

12 ConcurentHashMap 底层实现

源码一定要仔细看一遍。

1.7:Segment 数组结构和 HashEntry 数组结构组成,Segment 继承 ReentrantLock。

1.8:取消了 Segment 分段锁,采用 CAS 和 synchronized 来保证并发安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381362.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis 报CannotGetJdbcConnectionException

目录 报错起因 报错截图 运行环境 数据库配置 解决思路 报错起因 在web项目上拉取代码启动web服务抛CannotGetJdbcConnectionException。 报错截图 运行环境 windows idea maven tomcat springMVC mybatis 数据库配置 urlxxx driverClassNamexxx usernamexxx pass…

docker compose 容器 编排分组

遇到问题&#xff1a;执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下&#xff0c;但是都没有找到这样的一个方案&#xff1b; 最后发现&#xff0c;我执行docker compose up -d 命令所在…

【数据结构】二叉树OJ题_对称二叉树_另一棵的子树

对称二叉树 题目 101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2…

Linux文件和目录常用命令

1.操作命令 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 > 和 >> 管道 | 1.1 终端实用技巧 1>自动补全 在敲出 文件/目录/命令 的前几个字母之后&#xff0c;按下…

git实操之线上分支合并

线上分支合并 【 1 】本地dev分支合并到本地master上 # 本地dev分支合并到本地master上# 远程(线上)分支合并# 本地dev分支合并到本地master上# 远程(线上)分支合并#####本地和线上分支同步################ #### 远程创建分支&#xff0c;拉取到本地####-远程创建分支&#…

FPGA:频闪灯设计

1、需求 若在FPGA上实现LED灯一秒闪烁一次&#xff0c;先进行计算&#xff0c;1秒闪烁一次&#xff0c;即周期为1秒&#xff0c;开发板XC7A35TFFG-2的基本时钟输入由板载 50MHz 有源晶振提供&#xff0c;即频率为f 50MHz 。 则一个周期为 T 1 f 1 50 M H z 20 n s T\frac{…

git使用、git与idea结合、gitee、gitlab

本文章基于黑马程序javase模块中的"git"部分 先言:git在集成idea中,不同版本的idea中页面显示不同,操作时更注重基于选项的文字;git基于命令操作参考文档实现即可,idea工具继承使用重点掌握 1.git概述 git是目前世界上最先进的分布式文件版本控制系统 分布式:将…

FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发

在前面我们分析了接口的设计&#xff0c;那么我们接下来做接口的开发。 首先&#xff0c;我们先设计下pydantic用户参数的校验&#xff1a; """ -*- encodingutf-8 -*- Time: 2024/7/19 16:48 Author: lc Email: 15101006331163.com File: schemas.py "&…

基于单片机的智能医疗监护系统设计

1.简介 随着社会的发展&#xff0c;智能化电子设备成为了人们生活中不可或缺的一部分&#xff0c;尤其是在人们对于身心健康更加注重的今天&#xff0c;智能医疗监护系统应运而生。本套电子监护设备集体温测量、心电采集、心率监测、血氧监测于一体&#xff0c;带有语音播报模块…

Thinkphp开发文档二次整理版

基础部分 安装 环境要求 ​ *php>7.1.0 命令下载 通过Composer进行下载&#xff0c;操作步骤下载软件 phpstudy --->点击软件管理 --->安装Composer --->再点击网站 --->点击管理 --->点击Composer --->复制如下命令代码&#xff1a; ​ 稳定版&…

甄选范文“论面向方面的编程技术及其应”,软考高级论文,系统架构设计师论文

论文真题 针对应用开发所面临的规模不断扩大、复杂度不断提升的问题,面向方面的编程(Aspect Oriented Programming,AOP)技术提供了一种有效的程序开发方法。为了理解和完成一个复杂的程序,通常要把程序进行功能划分和封装。一般系统中的某些通用功能,如安全性、持续性、日…

构建高效Node.js中间层:探索请求合并转发的艺术

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【CSS盒模型&#xff1a;掌握网页布局的核心】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论✍ 引言&#x…

Java-Stream流

流 不同的数据有不同的方式得到其stream 单列集合&#xff1a;使用Collection中的默认方法&#xff1a;default Stream<E> stream双列集合&#xff1a;没有直接获取stream的方法&#xff0c;只能把他转化为单列集合数组&#xff1a;Arrays中的静态方法&#xff1a;publ…

SpringCloud的认识和初步搭建

目录 一.认识SpringCloud 二.SpringCloud的部署 2.1开发环境 2.2数据库的建立 2.3SpringCloud的部署 第一步&#xff1a; 创建Maven项目 第二步&#xff1a;完善pom文件 第三步&#xff1a;创建两个子项目 第四步&#xff1a;声明项目依赖以及构建插件 第五步&#xf…

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…

JVM基本知识——运行空间

JVM&#xff08;Java Virtual Machine&#xff09;即Java虚拟机&#xff0c;是负责读取java字节码&#xff0c;并在实际的硬件环境中运行。 JVM可以分为三部分&#xff1a;类装载器&#xff08;ClassLoader&#xff09;子系统、内存空间、执行引擎 内存空间&#xff08;运行时…

防火墙--双机热备

目录 双击热备作用 防火墙和路由器备份不同之处 如何连线 双机 热备 冷备 VRRP VGMP&#xff08;华为私有协议&#xff09; 场景解释 VGMP作用过程 主备的形成场景 接口故障的切换场景 整机故障 原主设备故障恢复的场景 如果没有开启抢占 如果开启了抢占 负载分…

Debian Linux下rclone挂载谷歌云盘碰到的坑

可能是明月好久没有使用境外服务器挂载境外的云盘缘故吧,今天一个代维客户需要他的Linux服务器挂载谷歌云盘好进行云备份,本来是个很简单的事儿,没想到在rclone连接谷歌云盘的时候卡壳了,可是把明月给难为坏了,搜索到的简体中文教程倒是很多,但没有一个提到这个“坑”,最…

MySQL学习记录 —— 이십삼 MySQL服务器文件系统(3)

文章目录 1、数据字典2、系统表各种系统表 Mysql Schema是⼀个系统库&#xff0c;表中存储了MySQL服务器运行时所需的信息。广义上&#xff0c;mysql schema包含存储MySQL程序基本数据的数据字典和用于其他操作目的的系统表。数据字典表和系统表位于数据目录下一个名为mysql.ib…

数据结构初阶(c语言)-双向链表

这里首先纠正上篇文章一个错误&#xff0c;链表的一个有效数据点应该称为结点而不是节点。 一&#xff0c;双向链表的概念与结构 1.1概念与结构示意图 我们所说的双向链表全称为带头双向循环链表&#xff0c;也就是说此链表带有哨兵位结点(不存放任何数据的结点&#xff0c;且…