0
点赞
收藏
分享

微信扫一扫

Java集合学习1:Collection集合、List


什么是集合

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

和数组的区别

数组长度固定,集合长度不固定
数组可以存储基本类型和引用类型,集合只能存储引用类型

进行集合接口的学习时候,多看JDK的API。里面有很多方法,可以自己研究。

Collection体系集合

Java集合学习1:Collection集合、List_迭代器


Java集合学习1:Collection集合、List_java_02


iterator()是collection的元素上进行迭代的迭代器。

Collection实践

1、添加元素
2、删除元素
3、遍历元素
4、判断

  • 首先创建一个集合,并添加元素。
  • 删除元素、与清空元素

Java集合学习1:Collection集合、List_ci_03

  • 判断集合是否包含这个元素

集合遍历

  • 使用增强for(增强for不需要下标,普通for需要下标,但是collection是没有下标的)
  • 两种方法:
  • 第一种:增强for
  • 第二种:迭代器 Iterator,对collection的迭代器(迭代就是循环或者遍历)
  • Java集合学习1:Collection集合、List_数组_04

  • 通过上面的三个方法实现集合的遍历迭代。
  • 增强for的代码如下:
  • Java集合学习1:Collection集合、List_java_05

  • 迭代器代码如下:
  • Java集合学习1:Collection集合、List_ci_06

  • 迭代过程当中,是不允许使用collection的删除方法的。
  • Java集合学习1:Collection集合、List_迭代器_07

  • 迭代器要求在迭代过程中,不可以使用集合的其他方法来并发修改。
    如果想删除的话,那么就可以用迭代器自己的方法,改成it.remove()就可以了。

Collection:保存信息

Java集合学习1:Collection集合、List_list_08

Java集合学习1:Collection集合、List_java_09

  • 注意删除collection中的对象remove时候是不会删除是s1本身的,因为集合中存的是地址。
  • s1本身是在堆中的。
  • 增强for中用一个强转换。
  • Java集合学习1:Collection集合、List_ci_10


  • Java集合学习1:Collection集合、List_list_11

  • 注意这里判断是否包含中(new。。)是行不通的。
List子接口

特点:有序的、有下标、元素可以重复。

Java集合学习1:Collection集合、List_list_12

  • list中多了两个迭代器。
  • Java集合学习1:Collection集合、List_数组_13

list子接口的使用

Java集合学习1:Collection集合、List_数组_14

list的遍历1:for遍历

Java集合学习1:Collection集合、List_list_15

lisit的遍历2:使用增强for

Java集合学习1:Collection集合、List_ci_16

list的遍历3:使用迭代器

Java集合学习1:Collection集合、List_java_17

list的遍历4:列表迭代器

Java集合学习1:Collection集合、List_ci_18


Java集合学习1:Collection集合、List_ci_19

list案例

Java集合学习1:Collection集合、List_ci_20

  • 注意这里的20不是基本类型的20.而是Interger类型的20.因为集合是不能装基本类型的,所以被进行了自动装箱。
  • 同时注意remove(20)是删除第20个位置的,而不是删除20这个对象。
  • 如果一定想使用20来删除,需要装箱来删除。list.remove(new Integer(20));就可以做到了。
  • 而这里之所以能使用new来删除,是因为整数缓冲的原因。
    关于整数缓冲是因为自动装箱自动为-127-127准备了自动装箱,地址是一样的,直接进行已经有的对象进行了复用。
List实现类

ArrayList

数组结构实现,查询快,增删慢。
运行效率快,但是线程不安全。

Vector

数组结构实现,查询快,增删慢。
运行效率慢,线程安全。

LinkedList

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

ArrayList

使用

Java集合学习1:Collection集合、List_迭代器_21


Java集合学习1:Collection集合、List_迭代器_22


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

Java集合学习1:Collection集合、List_数组_23


Java集合学习1:Collection集合、List_迭代器_24

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

  • 进行迭代代码如下
  • 使用迭代器:

Java集合学习1:Collection集合、List_ci_25

  • 使用列表迭代器

Java集合学习1:Collection集合、List_迭代器_26


Java集合学习1:Collection集合、List_ci_27


Java集合学习1:Collection集合、List_迭代器_28


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

源码分析

  • 默认容量大小 DEFAULT_CAPACITY = 10
  • 存放元素的数组 elementData
  • 实际的元素个数 size

Java集合学习1:Collection集合、List_ci_29


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

Java集合学习1:Collection集合、List_迭代器_30


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

Java集合学习1:Collection集合、List_迭代器_31


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

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

Java集合学习1:Collection集合、List_迭代器_32


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

grow代码是核心。

Java集合学习1:Collection集合、List_java_33


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

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

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

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

Java集合学习1:Collection集合、List_数组_34


于是elementdata就变成了15.

扩容总结

每次扩容为原来的1.5倍。

Vector使用

jdk1.0已经使用了。

也是list的一个接口。

  • 重要的:elements(枚举器)

Java集合学习1:Collection集合、List_ci_35


Java集合学习1:Collection集合、List_ci_36

  • remove(int index)删除
  • clear()清除

vector遍历

  • 使用枚举器

Java集合学习1:Collection集合、List_list_37

  • 判断:vector.contains("")
  • 判断:vector.isEmpty()
LinkedList

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

使用

Java集合学习1:Collection集合、List_迭代器_38

  • 删除 remove() 清除 clear()
  • 遍历
  • for遍历、增强for

Java集合学习1:Collection集合、List_java_39


Java集合学习1:Collection集合、List_java_40


Java集合学习1:Collection集合、List_list_41

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

Java集合学习1:Collection集合、List_迭代器_42

  • 判断是否存在:contains(s)
  • 获取位置 indexOf (x)

源码分析

Java集合学习1:Collection集合、List_数组_43


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

Java集合学习1:Collection集合、List_ci_44


进入到linklast的代码。

Java集合学习1:Collection集合、List_迭代器_45


Java集合学习1:Collection集合、List_list_46


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

然后创建了newnode。

Java集合学习1:Collection集合、List_迭代器_47


Java集合学习1:Collection集合、List_ci_48




举报

相关推荐

0 条评论