Java集合笔记

集合选择的取舍:

1、如果希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据?

用ArrayList 集合(有序、可重复、有索引),底层基于数组的。(常用)

2、如果希望记住元素的添加顺序,且增删首尾数据的情况较多?

用LinkedList集合(有序、可重复、有索引),底层基于双链表实现的。

3.如果不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快?

用HashSet 集合(无序,不重复,无索引),底层基于哈希表实现的。(常用)

4.如果希望记住元素的添加顺序,也没有重复元素需要存储,且希望增删改查都快?

用LinkedHashSet集合(有序,不重复,无索引),底层基于哈希表和双链表。

5.如果要对元素进行排序,也没有重复元素需要存储?且希望增删改查都快?

用TreeSet集合,基于红黑树实现。

实际上, ArrayList和HashSet足够满足大部分需求。

集合的思想:

空间和时间的置换,要么牺牲更多的内存换取性能 ,要么使用少量的内存提供少量的功能。

在Java中集合有两类,一类是记录单个数据的collection,另一类是记录两列数据的map。

collection衍生出多个集合类,如list、queue、set,他们都拥有collection的增删改查的方法。

所以准确来说,真正意义上Java中拥有本质区别的集合有:

list、queue、set和map

注意:queue底层是linkedlist

Collection:

collection及其衍生类拥有三种遍历方式:

迭代器、增强for、lambda遍历

在遍历并删除的场景中会出现并发问题,其解决办法:

若支持索引,则将i--和i++结合使用。

若不支持索引,则使用迭代器的删除方法。

若使用增强for和lambda方式,则会导致并发异常。

List:

list又叫列表,它最常用的实现有两种:linkedlist和arraylist。list及其实现类都具有共同的特点:有序、可为null、可重复

Arraylist:

底层是数组,意味着它拥有数组一切特性,如易于下标查找,不适合频繁增删操作。

Linkedlist:

底层是双向链表,首尾操作速度极快, 由于这个特性,经常用来做栈和队列。易于增加和删除元素,但不善于查找,因为它是通过头节点遍历来查找的。

Set:

set的常用方法基本上还是collection提供,几乎没有自己新增的功能。set及其实现类共同的特点:不允许重复、无索引,所以在插入数据时,相同的数据会默认只插入一次。

由于set都是不允许重复的,其原理就是比较hash值和equal值,如果想实现自定义对象不重复存入,需要重写这两个方法。

Hashset:

特点:无序、不重复、无索引

底层使用哈希表。在jdk1.8之后使用数组+链表+红黑树实现,增删改查的性能非常高。

LinkedHashset:

特点:有序、不重复、无索引

与hashset的底层几乎相同,但它给每个节点加入了一个双链表来记录顺序。

TreeSet:

特点:可排序、不重复、无索引

treeset是必须要排序的(默认生序),所以无法比较大小的自定义对象是会报错的!解决方法是重新定义比较方法:

1.重写自定义的对象的compareTo方法。

2.在实现TreeSet对象时传入comparator对象。

Map:

Map与Set的特点完全相同,有Hashmap、LinkedHashmap、Treemap

Map的遍历方法:

1.调用ketSet方法获取key集合,再遍历

2.调用entrySet方法获取元素为Map.Entry的集合,调用getkey和getvalue方法遍历

3.调用forEach传入匿名内部类重写accept方法

相关推荐
金銀銅鐵2 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手2 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck4 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428044 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
小成202303202654 小时前
C++~07补充
开发语言·c++
考虑考虑5 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔5 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n5 小时前
【JUC】四种内存屏障示例
java·1024程序员节
解决小子5 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统