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

news2024/11/20 4:19:34

# 精辟总结

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

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> {
    
    ......
    @Override
    public 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>() {
    @Override
    public 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.coloradmin.cn/o/1282791.html

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

相关文章

python flask Jinja2模板学习

分类很好的一篇文章 Jinja2模板语法 Jinja2里常见的三种定界符&#xff1a; (1) 语句 {% ... %}(2) 表达式 {{ ... }}(3) 注释 {# ... #} {%set adazhaung%} 语句设置变量{{a}} 表达式{% if 2>1 %}控制语句以{%endif%}结尾 Jinja2支持使用“.”获取变量的属…

Python异常处理【侯小啾Python基础领航计划 系列(二十六)】

Python异常处理【侯小啾Python基础领航计划 系列(二十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

Tenda 路由器 uploadWewifiPic后台RCE漏洞复现

0x01 产品简介 腾达路由器是一款高效实用的路由器,致力于为家庭用户提供舒适、便捷、自然的智慧家庭体验。简单便捷的部署在家庭中,彻底解决家庭用户的网络接入问题。 0x02 漏洞概述 腾达路由器后台 uploadWewifiPic 路由存在命令执行漏洞,攻击者可利用漏洞执行任意命令获取…

汽车电子 -- 毫米波雷达

参看&#xff1a;自动驾驶感知——毫米波雷达 一、雷达分类 二、毫米波雷达信号频段 三、车载毫米波雷达的重要参数 常见参数 探测距离 &#xff08;车辆0.5m ~ 200m 行人0.5m ~ 70m&#xff09;距离向精度 &#xff08;0.15 m&#xff09;距离向分辨率 ( 0.5 m)测速范围…

施密特触发器

1、作用 简单来说&#xff0c;施密特触发器可以将模拟信号转变成数字信号 2、为什么不使用比较器将模拟信号转变成数字信号 当输入电平高于参考电压时&#xff0c;输出高电平&#xff1b;输入电压低于参考电压时&#xff0c;输出低电平。这样比较器也可以实现模拟信号转换成数…

CTF特训日记day3

复现一下RWCTF5th shellfind题目 题目描述如下&#xff1a; Hello Hacker. You dont know me, but I know you. I want to play a game. Heres what happens if you lose. The device you are watching is hooked into your Saturday and Sunday. When the timer in the back …

C++ Primer 第十六章 模板与泛型编程 重点解读

文章目录 1 定义模板1.1 类模板成员函数的实例化&#xff1a;1.2 在类代码内简化模板类名的使用&#xff1a;1.3 令模板自己的类型参数成为友元&#xff08;C11&#xff09;1.4 模板类型别名1.4.1 typedef1.4.2 为模板定义类型别名(C11) 1.5 函数模板与类模板的区别1.6 使用类的…

如何撰写How-To文章:7个高效步骤(新手SEOer向导)

How-To类型的文章在各种领域都非常受欢迎&#xff0c;因为它们直接回应了读者的需求和问题。因此&#xff0c;很多网站也会针对一些信息型的关键词写很多How-To文章吸引流量。 “How-To”类文章也是我最喜欢的一种内容类型。因为它比起其他大部分内容类型来讲要容易写很多。 …

java开发之个微机器人的实现

简要描述&#xff1a; 二次登录 请求URL&#xff1a; http://域名地址/secondLogin 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wcId…

Vue框架学习笔记——列表渲染:v-for

文章目录 前文提要代码正文 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 代码正文 <body><div id"box"><ul><li v-for"(p,index)…

印刷生产ERP有哪些?印刷生产ERP系统哪一个好用

印刷生产行业发展历史悠久&#xff0c;不同规模的印刷生产工厂有差异化的经营策略和管理侧重点&#xff0c;同时在日常经营过程中也会遇到多样化的管理难题。 有些企业在车间排期、库存盘点、生产流程优化、资源整合、成本核算等方面存在不少管理问题。同时也有不少印刷生产企…

Java异常机制入门详解(上)

Java异常机制入门详解 基础知识 什么是异常&#xff1f; 在Java语言中&#xff0c;异常就是代表程序出现的问题。异常的引入不是让我们以后不出异常&#xff0c;而是程序出了异常之后&#xff0c;该如何处理。如如下两段代码&#xff0c;会各抛出一个异常&#xff1a; int[…

ssrf介绍、相关php函数及demo演示

SSRF系列 危害&#xff08;利用&#xff09; 漏洞判断 回显 延时 DNS请求 相关函数

W11+Ipv6+可道云+PHPstudy实现私人云盘搭建

W11Ipv6可道云PHPstudy实现私人云盘搭建 一、搭建原因二、搭建过程软件选择服务器环境管理软件私人云盘 可道云搭建小皮面板搭建 三、相关配置程序开机自启远程关机远程开机 四、相关参考 一、搭建原因 工位电脑上一些文件想备份到家里电脑&#xff0c;购买NAS又有点多余&…

如何使用内网穿透工具实现公网访问GeoServe Web管理界面

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址6. 结语 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除…

【AntDB 数据库】国产数据库发展之信创政策的加持

由于我国在信息技术领域起步较晚&#xff0c;国内大量的市场份额被国际IT巨头占据&#xff0c;甚至长期处于被垄断的地位&#xff0c;这也给了某些国家妄图通过挑起科技、贸易摩擦制衡我国发展的机会。为了解决可能存在的安全风险&#xff0c;在重要信息系统、关键基础设施中使…

云原生之深入解析Kubernetes策略引擎对比:OPA/Gatekeeper与Kyverno

一、前言 ① Kubernetes 策略 Kubernetes 的 Pod Security Policy&#xff0c;正如其名字所暗示的&#xff0c;仅是针对 Pod 工作的&#xff0c;是一种用来验证和控制 Pod 及其属性的机制。另外 PSP 只能屏蔽非法 Pod 的创建&#xff0c;无法执行任何补救/纠正措施。而 Gatek…

Redis持久化及常见问题解决

持久化缓存雪崩缓存穿透缓存击穿缓存预热 持久化 Redis的储存形式&#xff1a;一份在内存、一份在磁盘。内存的是最新的&#xff1b;磁盘里的会隔一段时间更新。 Redis持久化方式&#xff1a; RDB:快照方式&#xff1b;将某⼀个时刻的内存数据&#xff0c;以⼆进制的⽅式写⼊…

Hana Studio打开BW失败

Hana Studio打开BW失败 JCo initialization failed with java.lang.UnsatisfiedLinkError: D:\ycy\BW培训\HANA\configuration\org.eclipse.osgi\357\0.cp\lib\sapjco3.dll: Can’t find dependent libraries 这个提示应该是VC版本问题&#xff0c;按如下链接中的地址下载安装…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …