Java集合(已重写-废弃了)

# 精辟总结

其实各种八股文资料,他也就是围绕着核心知识展开提问的,你只要根据八股文把核心知识提炼出来,形成核心知识体系!

Java集合那是重点中的重点。最基本的概念要懂,核心的概念,那要滚瓜烂熟。

Java集合俩大接口:Collection(子接口List、Set、Queue)、Map

掌握四个接口以及每个接口的重要实现类,再加上一些细节点。

有些压根就是看一下,但是重点就是那几个!!写下来,不断回看。

# 总述对比

0、为啥要使用集合?

  • 使用数组存储对象不灵活。使用集合存储数据大小可变、支持泛型、存在内建算法等,方便。

1、List、Set、Queue、Map区别?

  • List存储元素有序可重复;
  • Set存储元素不可重复;
  • Queue存储元素有序可重复;
  • Map存储元素key有序不可重复,Value有序可重复,一个键可映射对应多个值。

2、集合底层数据结构说说

  • List:ArrayList,Vector底层数据结构是Object[]数组;LinkedList是双向链表
  • Set:HashSet基于HashMap实现,底层是HashMap存数据;LinkedHashSet基于LinkedHashMap实现;TreeSet底层红黑树
  • Queue:PriorityQueue是Object[]数组实现小顶堆;ArrayDeque为可扩容动态数组
  • Map:HashMap为数组+链表/红黑树;LinkedHashMap继承HashMap,在此基础上增加了一条双向链表。

3、怎么选择合适的集合?

  • 进行键值对存储,选用Map接口下集合

需要排序选择TreeMap,不需要就选HashMap,要求保证线程安全选ConcurrentHashMap

  • 只存储元素值,选用Collection接口下集合

要求元素唯一(不可重复)选择Set接口下集合,TreeSet、HashSet,不要求就选ArrayList、LinkedList等

# List

List  = ArrayList + LinkedList

## ArrayList简述

  1. ArrayList基于动态数组实现,根据实际存储的元素动态的扩容缩容;
  2. 允许使用泛型确保类型安全;
  3. 存储任意类型对象(包括null值),基本数据类型要使用对应的包装类(eg.Integer、Double);
  4. 支持插入删除遍历等操作(eg. add()、remove());
  5. 创建不需要指定大小

## ArrayList扩容机制

新容量 = 旧容量 * 1.5

触发扩容 -> 新开1.5倍容量 -> 复制 -> 清空原空间 -> 扩容中检查是否超出最大容量限制

## ArrayList插入删除时间复杂度

分析时间复杂度,注意要分类讨论!

插入:

头插元素后移O(n);尾插不扩容O(1),扩容O(n);指定位插O(n)

删除:

头删前移O(n);尾删O(1);指定删O(n)

## LinkedList为啥不能实现RandomAccess接口?

randomaccess接口是标记接口,表明实现该接口的类支持随机访问(通过索引快速访问元素),

LinkedList底层数据接口是双向链表,内存地址不连续只能通过指针索引,不能随机访问,所以不能实现randomaccess接口。

## ArrayList与LinkedList区别

  1. 线程安全:ArrayList与LinkedList都是非同步的,即不保证线程安全;
  2. 底层数据结构:ArrayList底层是Object[]数组,LinkedList底层是双向链表;
  3. 快速访问:ArrayList支持,而LinkedList不支持;
  4. 内存占用:ArrayList内存浪费在List列表尾部预留一定的容量;LinkedList空间花费主要在每一个元素都要存放前驱后继;
  5. 插入删除:ArrayList数组存储,插入删除时间复杂度受位置影响;LinkedList链表存储,头部插入删除不受位置影响,指定位置插入删除需要定位后再操作。

# Set

## HashSet如何检查重复

HashSet底层数据结构是哈希表(基于HashMap实现)查重时:

  1. 比较哈希码:先计算该元素的哈希码,并查找哈希表中是否存在相同的哈希码;
  2. equals方法比较:若存在相同哈希码,调用equals方法,返回true代表已存在不添加,否则就添加

HashSet添加元素条件:哈希码不同;哈希码相同但equals方法返回false

## Comparable与Comparator区别

实现Comparable接口要重写CompareTo(Object obj)方法,由自定义类内部实现排序方法;

实现Comaprator接口要重写Compare(Object obj1 , Object obj2)方法,由外部定义实现排序

重写Comparable接口的CompareTo方法:

public  class Person implements Comparable<Person> {......@Overridepublic int compareTo(Person o) {if (this.age > o.getAge()) {return 1;}if (this.age < o.getAge()) {return -1;}return 0;}
}

重写Compare:

Collections.sort(arrayList);// 定制排序的用法
Collections.sort(arrayList, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}
});

# Map

Map = HashMap + TreeMap + ConcurrentHashMap

## hash表基础

计算数组下标:

  1. 计算Key的哈希码 hashcode = hsahCode(Key)
  2. 计算数组下标 index = hashcode & (Entry.length - 1) || 取余 index = hashcode % (length-1)

左侧一维数组,数组元素内容是指向另一个链式数组的指针。绿色部分是<Key,Value>,绿色部分右侧的白色部分是指向下一对键值对的指针。

hash表的工作原理:

  1. 先根据给定的key和散列算法hash()得到具体的散列值hashcode,也就是对应的数组下标。
  2. 根据数组下标得到此下标里存储的指针,若指针为空,则不存在这样的键值对,否则根据此指针得到此链式数组。(此链式数组里存放的均为一对对<Key,Value>)。
  3. 遍历此链式数组,分别取出Key与给定的Key比较,若找到与给定key相等的Key,即在此hash表中存在此要查找的<Key,Value>键值对,此后便可以对此键值对进行相关操作;若找不到,即为不存在此 键值对。

## HashMap底层实现

HashMap基于哈希表的Map接口实现,存储键值对,支持快速插入删除查找;底层数据结构为数组 + 链表/红黑树

具体实现:

put()插入值:jdk1.8之前,底层为数组+链表。HashMap通过hashcode经过扰动函数处理得到hash值,再通过(Entry.length - 1)&hash得到元素存放位置,如果该位置存在元素,就判断该元素与要存入的元素的Key和哈希码hashcode是否相同,相同则直接覆盖,不相同,则通过拉链法解决哈希冲突;

jdk1.8之后,变化就是优化了解决哈希冲突,当链表长度大于阈值(8)这时会判断若当前数组长度小于64先进行数组扩容,不然就将链表转换成红黑树以减少搜索时间。

链表法:将链表和数组结合。创建一个链表数组,数组中每一格就是一个链表,若遇到哈希冲突,就将冲突的值加到链表中即可。

get()取出值也是类似的过程。

 

## ConcurrentHashMap底层原理

1、整体架构:与HashMap相同 数组 + 链表/红黑树

2、基本功能:在HashMap基础上增加了并发安全,并发安全的实现是通过对Node节点加锁来保证数据更新的安全性

性能优化:为了平衡并发性能与数据安全性,jdk1.8之前锁的粒度是segment,jdk1.8之后锁的粒度为Node节点,缩小锁的范围提高并发性能,引入多线程并发扩容

(多线程并发扩容:多个线程对原数组进行分片,分片后每个线程负责一个分片的数据迁移,从而提升扩容效率)

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

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

相关文章

【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

基于计算机视觉的摄像头测距技术 文章目录 基于计算机视觉的摄像头测距技术导读引入技术实现原理技术实现细节Python-opencv实现方案获取目标轮廓步骤 1&#xff1a;图像处理步骤 2&#xff1a;找到轮廓步骤完整代码 计算图像距离前置技术背景与原理步骤 1&#xff1a;定义距离…

[传智杯 #3 决赛] 面试

题目背景 disangan233 和 disangan333 去面试了&#xff0c;面试官给了一个问题&#xff0c;热心的你能帮帮他们吗&#xff1f; 题目描述 现在有 n 个服务器&#xff0c;服务器 i 最多能处理 ai​ 大小的数据。 接下来会有 k 条指令 bk​&#xff0c;指令 i 表示发送 bi​ …

海德汉(HEIDENHAIN)CNC数据采集(可免授权)

一&#xff0c;概述 海德汉 常见的系统一般有530、640系统&#xff0c;采集一般有两种方法&#xff1a; &#xff08;1&#xff09;购买海德汉官方的SDK&#xff0c;HeidenhainDNC COM Component&#xff0c;安装之后有相应的demo&#xff0c;支持的语言有C#、C/C。此方法还需…

面试篇之微服务(二)

目录 服务容灾 21.什么是服务雪崩&#xff1f; 22.什么是服务熔断&#xff1f;什么是服务降级&#xff1f; 什么是服务熔断&#xff1f; 什么是服务降级&#xff1f; 有哪些熔断降级方案实现&#xff1f; 23.Hystrix怎么实现服务容错&#xff1f; 24.Sentinel怎么实现限…

JSP格式化标签 parseDate将指定时间格式字符串转为真正的date对象

格式化标签最后一个就是 parseDate 作用 将一个日期/时间格式字符串 转为 真正的date时间类型 有点无语 这种 东西应该都是在java中去做的 而不是在java中 这个建议也是做个了解即可 作用不是那么大 基本语法如下 这里 我们 直接编写代码如下 <% page contentType"…

JSP格式化标签 parseNumber指定格式字符串转数字类型

好 我们继续来说格式化标签 parseNumber 它的作用是讲一个字符串 转换为指定格式的数值型 老实说 这东西 作为了解把 实际开发中都不是用得少 我建议还是在java端就处理好 不建议在jsp中高这种类型转换的操作 基本格式如下 这几个属性都是我们这几期jsp标签的老朋友了 我们…

【STM32】STM32学习笔记-新建工程(04)

00. 目录 文章目录 00. 目录01. 创建STM32工程02. STM32工程编译和下载03. LED测试04. 型号分类及缩写05. 工程结构06. 附录 01. 创建STM32工程 【STM32】STM32F103C8T6 创建工程模版详解(固件库) 02. STM32工程编译和下载 2.1 选择下载器位ST-Link Debugger 2.2 勾选上电…

认识成交量VOL,搞懂量价关系

一、认识成交量VOL 1、成交量VOL的含义 VOL是一个成交量指标&#xff0c;是指个股或者大盘一定时间内的成交数量&#xff0c;一般的炒股软件中都是指成交总手数&#xff08;1手100股&#xff09;。 成交量体现在炒股软件上就是一根竖着的柱子&#xff0c;成交量越大&#xff0c…

Redis常见类型

常用类型String字符串类型Hash字典类型List列表类型Set集合类型ZSet有序集合类型 Java程序操作Redis代码操作Redis 常用类型 String字符串类型 使用方式&#xff1a; 使用场景&#xff1a; Hash字典类型 字典类型(Hash) 又被成为散列类型或者是哈希表类型&#xff0c;它…

数据库-MySQL之数据库必知必会22-26章

第 22 章 使用视图 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。 使用视图 视图用CREATE VIEW语句来创建。 使用SHOW CREATE VIEW viewname&#xff1b;来查看创建视图的语句。 用DROP删除视图&#xff0c;其语法为DROP VIEW view…

开发猿的平平淡淡周末---2023/12/3

2023/12/3 天气晴 温度适宜 AM 早安八点多的世界&#xff0c;起来舒展了下腰&#xff0c;阳光依旧明媚&#xff0c;给平淡的生活带来了一丝暖意 日常操作&#xff0c;喂鸡&#xff0c;时政&#xff0c;洗漱&#xff0c;恰饭&#xff0c;肝会儿游戏 看会儿手机 ___看累…

数据结构 | 查漏补缺之ASL、

目录 ASL 情形之一&#xff1a;二分查找 线索二叉树 哈夫曼树 大根堆 邻接表&邻接矩阵 ASL 参考博文 关于ASL(平均查找长度)的简单总结_平均查找长度asl-CSDN博客 情形之一&#xff1a;二分查找 线索二叉树 参考博文 线索二叉树(线索链表遍历&#xff0c;二叉树…

Unity中Shader指令优化

文章目录 前言解析一下不同运算、条件、函数所需的指令数1、常数基本运算2、变量基本运算3、条件语句、循环 和 函数 前言 上一篇文章中&#xff0c;我们解析了Shader解析后的代码。我们在这篇文章中来看怎么实现Shader指令优化 Unity中Shader指令优化&#xff08;编译后指令…

【深度学习实验】图像处理(四):PIL——自定义图像数据增强操作(图像合成;图像融合(高斯掩码))

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. PIL基础操作2~4. 随机遮挡、随机擦除、线性混合5. 图像合成5.1 原理5.2 实现5.3 效果展示 6. 图像融合6.1 原理6.2 实现6.3 效果展示 一、实验介绍 在深度学习任务中&#xff0c…

MySQL进阶_EXPLAIN重点字段解析

文章目录 第一节.准备1.1 版本信息1.2 准备 第二节.type2.1 system2.2 const2.3 eq_ref2.4 ref2.5 ref_or_null2.6 index_merge2.7 unique_subquery2.8 range2.9 index2.10 all 第三节. Extra3.1 No tables used3.2 No tables used3.3 Using where3.4 No matching min/max row3…

【数据结构高阶】AVL树

上期博客我们讲解了set/multiset/map/multimap的使用&#xff0c;下面我们来深入到底层&#xff0c;讲解其内部结构&#xff1a; 目录 一、AVL树的概念 二、AVL树的实现 2.1 节点的定义 2.2 数据的插入 2.2.1 平衡因子的调整 2.2.1.1 调整平衡因子的规律 2.2.2 子树的旋…

JavaEE 多线程

JavaEE 多线程 文章目录 JavaEE 多线程引子多线程1. 特性2. Thread类2.1 概念2.2 Thread的常见构造方法2.3 Thread的几个常见属性2.4 启动一个线程2.5 中断一个线程2.6 等待一个线程2.7 获取当前线程引用2.8 休眠当前线程 3. 线程状态 引子 当进入多线程这一块内容时&#xff…

2023-12-03 LeetCode每日一题(可获得的最大点数)

2023-12-03每日一题 一、题目编号 1423. 可获得的最大点数二、题目链接 点击跳转到题目位置 三、题目描述 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#x…

使用OpenMVS重建模型

1、数据格式转换 首先将生成的稠密点云以及图片信息转换成openmvs支持的.mvs文件。在openmvs_sample中的bin文件内打开终端 作者&#xff1a;舞曲的小水瓶 https://www.bilibili.com/read/cv25019877/ 出处&#xff1a;bilibili interfaceCOLMAP.exe -i D:\desktop\test\toy\…

【Linux服务器Java环境搭建】05 Node JS安装及环境变量配置

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装&#xff08;JAVA环境安装&#xff09; 【Linux服…