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天前
|
存储 API Kotlin
Kotlin中的List集合
Kotlin中的List集合
12 2
|
1天前
|
存储 缓存 安全
Java List操作详解及常用方法
Java List操作详解及常用方法
|
2天前
|
存储 Dart
Dart中的集合类型:List(数组/列表)
Dart中的集合类型:List(数组/列表)
6 0
|
3天前
|
存储 设计模式 并行计算
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
CopyOnWriteArrayList:深入理解Java中的线程安全List原理和应用
|
3天前
|
并行计算 Java API
Java List集合取交集的八种不同实现方式
Java List集合取交集的八种不同实现方式
|
Java
Java中List排序的3种方法!(5)
Java中List排序的3种方法!(5)
324 0
Java中List排序的3种方法!(5)
|
Java
Java中List排序的3种方法!(4)
Java中List排序的3种方法!(4)
193 0
Java中List排序的3种方法!(4)
|
Java
Java中List排序的3种方法!(3)
Java中List排序的3种方法!(3)
325 0
Java中List排序的3种方法!(3)
|
Java
Java中List排序的3种方法!(2)
Java中List排序的3种方法!(2)
143 0
Java中List排序的3种方法!(2)
|
Java
Java中List排序的3种方法!(1)
Java中List排序的3种方法!(1)
380 0
Java中List排序的3种方法!(1)