Java集合学习1:Collection集合、List(二)

简介: 概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能。

List实现类


ArrayList

数组结构实现,查询快,增删慢。

运行效率快,但是线程不安全。


Vector

数组结构实现,查询快,增删慢。

运行效率慢,线程安全。


LinkedList

链表结构实现 ,增删快,查询慢。


ArrayList

使用

0604a5f6bdf26e302750e6e8e47c2ce7_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_12,color_FFFFFF,t_70,g_se,x_16.png


这样进行删除是行不通的,因为他是进行equals进行比较,equals比较的是地址,一比较发现地址不一样。如果非要进行这样删除,那就重写equals的方法就可以了。(前面的tostring已经重写了)

4720f1a8d08aa7e8f3e6ae913ce3d587_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_18,color_FFFFFF,t_70,g_se,x_16.png


44b51e6559bbe1b5291cbc6faba30838_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_13,color_FFFFFF,t_70,g_se,x_16.png

这个时候进行重写后重新运行,发现已经进行删除了。


进行迭代代码如下

使用迭代器:

e697c973c824c3ef247001b66576ee33_215b2d5632714cbbba6b32a5132b1415.png


使用列表迭代器

30507d4fe0d21348610528ebde37e509_496aaaa4395245f0b6c8d302051ea1cd.png

1a944ac925ab02bb89c8c4997b86c264_446da1a84041408697e073e98f44654f.png

3cbb5af647fb984fadc30dd1d72ac566_2bcfdef56589406293a409ccdf8943ba.png


indexof里面也调用了equals方法的。


源码分析


默认容量大小 DEFAULT_CAPACITY = 10

存放元素的数组 elementData

实际的元素个数 size

a7c6cc2c717fa1a85bf6ca036558e912_2ae2643b931a4d6b84be13e8d1b817d9.png

也就是说,默认的情况下,没有向集合添加任何元素的时候,是0,容量和size都是0。(只有开始添加了才认为是10)

e0f1b2c60d4c4221273beff2141d8466_944895d278694e82b872a6c875201fc1.png


ensureeCapacityInternal 增长修改个数。这个时候 最开始size是0.

71d1effac17bccd0e998d6d809460a6b_f04e3e9ba8e14f1c813b080e6c5af471.png

如果if里面成立的,那么就去一个比较大的,即size+1等1,肯定是小于10的,于是让其mincapacity等于10,即改为默认容量10了。

然后跳转到下一步ensureExplicitCapacity中,接着看这个源代码

0ef0dc5c0b248c3671937777a986db27_06a63435a3624cb09e31b4df6a653366.png

10-0>0成立,然后进入到grow,然后就是数组进行扩容的代码了。

grow代码是核心。

eb4888155fe4b37bf8f1ded3f75cc9db_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_12,color_FFFFFF,t_70,g_se,x_16.png

oldcapacity是0,然后右移一位,还是0.(右移一位相当于除以2)

然后0-10小于0,然后赋值给newcapacity为10了。

然后就给elementdata赋值了10.所以添加第一个元素的时候,就是容量变成10了。

如果第11个加进来,一切按照刚刚的流程进来,然后在grow进行第二次变化。

61d30d088155e62dadb4c25d179e0775_840599a113364f3abb3dbf9f4058e8c5.png

于是elementdata就变成了15.


扩容总结


每次扩容为原来的1.5倍。


Vector使用


jdk1.0已经使用了。


也是list的一个接口。


重要的:elements(枚举器)

939815e3ab6ad0d69d7cdb79135f4483_b709f7d072634457854d4b338dced03d.png

02188acf5c3358345622c8687ccab0c7_6fa1f04aa55e42a9a39402bbed72293b.png

remove(int index)删除

clear()清除

vector遍历


使用枚举器

ca5862856fc0d58a76304d16791628a0_4736e84bc17a4ec2a288116341815b5b.png


判断:vector.contains("")

判断:vector.isEmpty()

LinkedList


链表结构,双向链表,增删快,查询慢。


使用

51d2065d9dca7a4630b62528a0efd083_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_10,color_FFFFFF,t_70,g_se,x_16.png


删除 remove() 清除 clear()

遍历

for遍历、增强for

774fb4886dda04376d1a931b859eb701_24b9addbc53f4c84be0cd5004163c91b.png

fea984dc589277e2dcf4cb340161635d_2e293f19e5c64a179a12950b9ee026d5.png

list的迭代器要更强一点,有前后方向可以选择的。

85a29ff59b54c92f9dbbbff649cb071d_694f07a35a904cf0a46830c5769d1f37.png

判断是否存在:contains(s)

获取位置 indexOf (x)

源码分析


79b2a7a99a3bf9827b3c99edd3589537_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_11,color_FFFFFF,t_70,g_se,x_16.png

first指向第一个元素 size是大小 last指向最后一个元素

e533960639c6afa15a128a8d3706920d_820f03ebef8043cc9e9e830115985496.png

进入到linklast的代码。

8c0175b1d1dc1b8fd7a1de9fc2bde7e4_bd6f0e8477de4971979658a0856dd4f9.png

8c0175b1d1dc1b8fd7a1de9fc2bde7e4_bd6f0e8477de4971979658a0856dd4f9.png


创建 了一个l局部变量,l等于last,l其实也是空null。

然后创建了newnode。

201f2402c9c7f7625f07a32b1f7c1d4a_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_8,color_FFFFFF,t_70,g_se,x_16.png

542b59a6d1506b8a3756983d90d72129_watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572R5LqL6ZqP6aOOMjAxNw==,size_9,color_FFFFFF,t_70,g_se,x_16.png

相关文章
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
98 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
65 5
|
1月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
45 0
|
2月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
39 0
|
6月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1024 1
|
5月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
5月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法