Java八股:Java中的各种list,有什么区别?list和set有何种区别?

Java八股:Java中的各种list,有什么区别?list和set有何种区别?

Java 中 List 的几种实现

List 是 有序、可重复 的集合接口
常见实现:ArrayList、LinkedList、Vector、Stack、CopyOnWriteArrayList

ArrayList

底层结构

  • 动态数组
  • 初始容量:10
  • 扩容机制
新容量 = 旧容量 + 旧容量 / 2 (1.5 倍)

时间复杂度

操作复杂度说明
随机访问 get(i)O(1)数组下标
尾部 addO(1) 均摊扩容时 O(n)
中间插入/删除O(n)元素整体移动

线程安全

  • 非线程安全
解决方案:Collections.synchronizedList;CopyOnWriteArrayList

LinkedList

底层结构

  • 双向链表
  • 每个节点:prev | item | next

时间复杂度

操作复杂度说明
get(i)O(n)要遍历
头/尾插入删除O(1)指针操作
中间插入O(n)找位置

Vector

底层结构

-动态数组(和 ArrayList 类似)

关键区别

  • 线程安全
  • 方法都加了 synchronized

问题

  • 性能差(锁太重)
  • 已被淘汰

Stack

继承关系

StackextendsVector

特点

  • 后进先出(LIFO)
  • 线程安全(继承 Vector)

CopyOnWriteArrayList(并发重点)

底层思想

  • 写时复制

特点

方面说明
线程安全
读性能非常高
写性能较差(复制数组)
迭代不会抛 ConcurrentModificationException

对比总结

实现底层线程安全适合场景
ArrayList动态数组查询多
LinkedList双向链表头尾操作多
Vector动态数组淘汰
Stack淘汰
CopyOnWriteArrayList数组复制并发读多

面试常见问题

Q1:ArrayList 和 LinkedList 区别?

ArrayList:数组,查询快,插入慢
LinkedList:链表,头尾操作快,随机访问慢

Q2:为什么 ArrayList 不是线程安全?

add / remove 过程中可能发生:
扩容
覆盖
数据丢失

Q3:CopyOnWriteArrayList 为什么读快?

读操作不加锁
始终读的是稳定数组快照

Q4:为什么不推荐 Vector / Stack?

synchronized 粒度太大
性能差
有更好的并发方案

总结

ArrayList 查得快,LinkedList 插得快(头尾),
并发读多用 CopyOnWrite,Vector Stack 已淘汰

一、关于List和Set

List vs Set

对比点ListSet
是否有序✅ 有序(按插入顺序)❌ 大多无序(LinkedHashSet 例外)
是否允许重复✅ 允许❌ 不允许
是否有下标✅ 有(get(i)❌ 没有
常见实现ArrayListLinkedListHashSetLinkedHashSetTreeSet
典型用途保存“有顺序、可重复”的数据保存“去重”的数据

一句话记忆:

List = 有顺序 + 可重复
Set = 去重

二、List

什么是List?

  • 像数组的升级版
  • 能按顺序存
  • 能存重复元素
  • 能通过下标访问
List<Integer> list =newArrayList<>(); list.add(10); list.add(10); list.add(20);System.out.println(list);// [10, 10, 20]System.out.println(list.get(1));// 10

三、Set

什么是Set?

  • 天然去重
  • 关心你插入顺序
  • 没有下标
Set<Integer> set =newHashSet<>(); set.add(10); set.add(10); set.add(20);System.out.println(set);// [10, 20]

Set 是怎么判断“重复”的?

靠 hashCode() + equals()

  1. 先算 hashCode
  2. 再用 equals 比较

四、List vs Set 核心区别

List 和 Set 都是 Collection 的子接口,主要区别在于是否允许重复和是否有顺序。List 允许重复元素并且有下标,适合顺序存储;Set 不允许重复元素,主要用于去重。

五、一句话总结

List:顺序 + 重复 + 下标
Set:去重 + 无下标 + 基于 equals/hashCode

Read more

Python 高效实现 Word 转 PDF:告别 Office 依赖

在工作中,经常会遇到需要把 Word 文档转换成 PDF 的情况。比如生成报表、分发文档、或者做归档保存,PDF 格式在排版和跨平台显示上更稳定。 传统的做法往往依赖 Microsoft Office 或 LibreOffice 等软件来完成转换,但在自动化环境(如服务器、Docker 容器、Linux 系统)中,这类方式会遇到一些限制:需要额外安装软件、依赖复杂,甚至存在兼容性问题。 因此,很多开发者更希望使用无依赖的 Python 库来完成转换。本文将介绍如何借助 Spire.Doc for Python库,在不依赖 Office 的情况下,实现 doc 转 pdf、docx 转 pdf,并支持批量转换与多种转换设置。 一、安装

By Ne0inhk
Python 爬虫项目实战(一):爬取某云热歌榜歌曲

Python 爬虫项目实战(一):爬取某云热歌榜歌曲

前言 网络爬虫(Web Crawler),也称为网页蜘蛛(Web Spider)或网页机器人(Web Bot),是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓取等。 爬虫的基本原理 1. 种子 URL:爬虫从一个或多个种子 URL 开始,这些 URL 是起点。 2. 发送请求:爬虫向这些种子 URL 发送 HTTP 请求,通常是 GET 请求。 3. 获取响应:服务器返回网页的 HTML 内容作为响应。 4. 解析内容:爬虫解析 HTML 内容,提取所需的数据(如文本、链接、图片等)。 5. 提取链接:

By Ne0inhk
Python从0到100完整学习指南(必看导航)

Python从0到100完整学习指南(必看导航)

前言:零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者! 【优惠信息】 • 新专栏订阅前1000名享9.9元优惠 • 订阅量破1000后价格上涨至19.9元 • 订阅本专栏可免费加入粉丝福利群,享受: - 所有问题解答 - 专属福利领取 欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程! 本文目录: * 一、Python基础与编程入门(第1-15篇) * 1.环境搭建与语法基础 * 2.数据结构基础篇 * 3.函数编程篇 * 二、面向对象与文件处理(第16-24篇) * 1.面向对象编程篇 * 2.标准库与文件处理篇 * 三、并发编程与网络爬虫(第25-39篇) * 1.并发编程基础篇

By Ne0inhk
【C++】深入解析AVL树:平衡搜索树的核心概念与实现

【C++】深入解析AVL树:平衡搜索树的核心概念与实现

【C++】深入解析AVL树:平衡搜索树的核心概念与实现 * 摘要 * 目录 * 一、AVL树的概念 * 二、AVL树的模拟实现 * 1. 节点结构体和树的类模板 * 2. 平衡因子的概念和实现 * 3. 插入 * 4. 旋转操作 * 4.1 右单旋 * 4.2 左单旋 * 4.3 左右双旋 * 4.4 右左双旋 * 三、AVL树的平衡检测 * 总结 摘要 本文深入解析了AVL树的核心概念与实现,包括节点结构设计、平衡因子定义及其更新机制、插入操作的自下而上平衡调整策略,以及四种旋转方式(左单旋、右单旋、左右双旋、右左双旋)对保持树平衡的重要作用。同时,提供了AVL树高度计算与平衡检测的实现方法,确保每个节点的平衡因子正确维护,从而保证树在插入操作后的高效性与稳定性。通过本文内容,读者可以系统掌握AVL树的原理、实现与调试技巧,

By Ne0inhk