当前位置: 首页 > news >正文

java集合详解

集合概念

对象的容器,实现了对对象的常用操作,类似数组功能。


区别:
数组长度固定,集合长度不固定
数组可以包含基本数据类型和对象,集合只能包含对象
数组可以直接访问元素,集合需要通过迭代器或别的方式访问

collection接口

List接口的特点:
有序、有下标、元素可重复

Set接口的特点:
无序、无下标、元素不能重复

Map是键值对集合:
键、值之间的音声。key无序唯一,value不要求有序,允许重复。
没有集成collection,给出键元素,就能返回值对象。
TreeMap、.HashMap、.HashTable、.LinkedHashMap、.ConcurrentHashMap

collection父接口

特点:代表一组任意类型的对象,无序、无下标、不能重复。

集合的遍历:
增强for
迭代器遍历(只能使用迭代器的删除方法)
stream API 
 

迭代器:
hasNext() 存在下一个元素
next() 获取下一个元素
remove()删除当前元素

迭代器并发修改异常:
迭代器在迭代过程中不能使用collection的其它方法进行,可以使用迭代器remove方法删除

Collections和Collection的区别

Collection是ava集合框架中的一个接口,它是所有集合类的基础接口。它定义了一组通用的操作和方法,如添加、删除、遍历等,用于操作和管理一组对象。Collection接口有许多实现类,如List、Set和Queues等。
Collections(注意有一个s)是ava提供的一个工具类,位于java.util包中。它提供了一系列静态方法,用于对集合进行操作和算法。Collections类中的方法包括排序、查找、替换、反转、随机化等等。这些方法可以对实现了Collection接口的集合进行操作,如List和Set。

list接口与实现类

list接口使用

有序,有下标,元素可以重复 (有序可以使用for遍历)

除了集合都有的方法外,有特有的方法:

list中的iterator--列表迭代器

可以向前/向后遍历,添加或修改,删除元素

实现类

Arraylist

ArrayList扩容机制

创建ArrayList时可以指定容量;或者是默认的10;元素达到容量时,会触发扩容:
新建一个数组,容量是前一个的1.5倍
元素的复制,新元素的添加
原数组引用指向新数组
 

ArrayList的remove操作
时间复杂度O(n),删除元素后,后续元素会向前移动

ArrayList线程不安全,怎么变成线程安全

collections类的synchronizedList方法
CopyOnWriteArrayList类代替ArrayList
Vector替换
 

Vector

线程安全,运行效率相对较低

LinkedList

双向链表

泛型和工具类

set接口与实现类

hashset

treeset

comparable接口实现

map接口与实现类

hashmap,LinkedHashMao,TreeMap

线程安全的Map集合:Hashtable,ConcurrentHashMap

map快速遍历

for-each循环和entrySet方法

迭代器:

lamda表达式

streamAPI

HashMap HashTable ConcurrentHashMap区别

HashMap

HashMap扩容机制

创建时可以指定初始容量,默认是16
负载因子,默认是0.75
扩容机制:新容量默认是旧的两倍(减少计算操作,元素不用计算新的hashcode就能得到新位置)
遍历数组中所有的节点,重新插入到新数组中
使用新数组替换旧数组

解决hash冲突

链接法:使用链表或别的数据结构来存储冲突的键值对,存放在同一个哈希桶里
开放寻址法:再哈希表中找到另一个可用的位置来存储:线性探测,二次探测等
再哈希法:发生冲突时,使用另一个哈希函数再次计算键的哈希值
哈希桶扩容:哈希冲突过多时,可以动态扩大哈希桶数量

hashmap不是线程安全,hashtable线程安全

put过程

一般使用string作key

string对象不可变

hashmap和hashtable

HashTable实现

ConcurrentHashMap

实现

特性细节
结构数组 + 链表 + 红黑树
锁机制CAS(无锁感知)+ 必要时同步锁
扩容策略原子性扩容,利用CAS控制扩容竞争
冲突处理链表转树(当碰撞链长到一定阈值时)
线程安全通过CAS和小粒度锁保证多线程安全
性能特点高读多写少场景表现优异,避免全局锁隔离带来的瓶颈

主要使用机制

put操作:

http://www.dtcms.com/a/265574.html

相关文章:

  • 论文阅读笔记——Autoregressive Image Generation without Vector Quantization
  • 当材料研发遇上「数字集装箱」:Docker如何让科研效率「开挂」?
  • 【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能
  • AES密码算法的C语言实现(带测试)
  • 经典灰狼算法+编码器+双向长短期记忆神经网络,GWO-Transformer-BiLSTM多变量回归预测,作者:机器学习之心!
  • 【TTS】2024-2025年主流开源TTS模型的综合对比分析
  • 仿星露谷物语开发总结VIP(Unity高级编程知识)
  • RabbitMQ 通过HTTP API删除队列命令
  • 【RK3568+PG2L50H开发板实验例程】Linux部分/FPGA FSPI 通信案例
  • 【机器学习深度学习】什么是下游任务模型?
  • laravel基础:php artisan make:model Flight --all 详解
  • 【PaddleOCR】OCR文本检测与文本识别数据集整理,持续更新......
  • 【QT】QWidget控件详解 || 常用的API
  • 蓝桥杯C++组算法知识点整理 · 考前突击(中)【小白适用】
  • Java调用百度地图天气查询服务获取当前和未来天气-以贵州省榕江县为例
  • 【字节跳动】数据挖掘面试题0006:SVM(支持向量机)详细原理
  • JVM类加载过程
  • 车载电子电气架构 --- 从车窗演进看车联网的需求、发展与选择
  • 2025年游戏鼠标推荐,游戏鼠标推荐,打CSGO(罗技、雷蛇、卓威、ROG、漫步者、赛睿、达尔优)
  • 前端-HTML-day2
  • 从生活实例看:点积、内积和矩阵乘法如何玩转机器学习
  • 物联网MQTT协议与实践:从零到精通的硬核指南
  • I/O 进程 7.2
  • Mysql锁机制与优化实践以及MVCC底层原理剖析
  • TensorFlow 安装使用教程
  • 6. 常见K线形态(楔形与旗形)
  • Laravel8中调取腾讯云文字识别OCR
  • 中文语境下的视频生成革命:百度 MuseSteamer 的“产品级落地”启示录
  • 手机内存融合是什么意思
  • Redis 的特性、工作机制与性能优化全解(含搭建实战教程)