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

举报
bdi洲 发表于 2022/05/20 00:18:00 2022/05/20
【摘要】 什么是集合 概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能。 和数组的区别 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 进行集合接...

什么是集合

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

和数组的区别

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

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

Collection体系集合

在这里插入图片描述
在这里插入图片描述
iterator()是collection的元素上进行迭代的迭代器。

Collection实践

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

  • 首先创建一个集合,并添加元素。
  • 在这里插入图片描述
  • 删除元素、与清空元素

在这里插入图片描述

  • 判断集合是否包含这个元素
  • 在这里插入图片描述

集合遍历

  • 使用增强for(增强for不需要下标,普通for需要下标,但是collection是没有下标的)
  • 两种方法:
  • 第一种:增强for
  • 第二种:迭代器 Iterator,对collection的迭代器(迭代就是循环或者遍历)
  • 在这里插入图片描述
    通过上面的三个方法实现集合的遍历迭代。
  • 增强for的代码如下:
  • 在这里插入图片描述
  • 迭代器代码如下:
  • 在这里插入图片描述
    迭代过程当中,是不允许使用collection的删除方法的。
    在这里插入图片描述
    迭代器要求在迭代过程中,不可以使用集合的其他方法来并发修改。
    如果想删除的话,那么就可以用迭代器自己的方法,改成it.remove()就可以了。

Collection:保存信息

在这里插入图片描述

在这里插入图片描述

  • 注意删除collection中的对象remove时候是不会删除是s1本身的,因为集合中存的是地址。
  • s1本身是在堆中的。
  • 增强for中用一个强转换。
    在这里插入图片描述
    在这里插入图片描述
    注意这里判断是否包含中(new。。)是行不通的。

List子接口

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

在这里插入图片描述

  • list中多了两个迭代器。
  • 在这里插入图片描述

list子接口的使用

在这里插入图片描述

list的遍历1:for遍历

在这里插入图片描述

lisit的遍历2:使用增强for

在这里插入图片描述

list的遍历3:使用迭代器

在这里插入图片描述

list的遍历4:列表迭代器

在这里插入图片描述
在这里插入图片描述

list案例

在这里插入图片描述

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

List实现类

ArrayList

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

Vector

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

LinkedList

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

ArrayList

使用

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

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

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

在这里插入图片描述

  • 使用列表迭代器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
indexof里面也调用了equals方法的。

源码分析

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

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

在这里插入图片描述
ensureeCapacityInternal 增长修改个数。这个时候 最开始size是0.
在这里插入图片描述
如果if里面成立的,那么就去一个比较大的,即size+1等1,肯定是小于10的,于是让其mincapacity等于10,即改为默认容量10了。
然后跳转到下一步ensureExplicitCapacity中,接着看这个源代码
在这里插入图片描述
10-0>0成立,然后进入到grow,然后就是数组进行扩容的代码了。
grow代码是核心。
在这里插入图片描述
oldcapacity是0,然后右移一位,还是0.(右移一位相当于除以2)
然后0-10小于0,然后赋值给newcapacity为10了。
然后就给elementdata赋值了10.所以添加第一个元素的时候,就是容量变成10了。
如果第11个加进来,一切按照刚刚的流程进来,然后在grow进行第二次变化。
在这里插入图片描述
于是elementdata就变成了15.

扩容总结

每次扩容为原来的1.5倍。

Vector使用

jdk1.0已经使用了。

也是list的一个接口。

  • 重要的:elements(枚举器)

在这里插入图片描述
在这里插入图片描述

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

vector遍历

  • 使用枚举器

在这里插入图片描述

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

LinkedList

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

使用

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

源码分析

在这里插入图片描述
first指向第一个元素 size是大小 last指向最后一个元素

在这里插入图片描述
进入到linklast的代码。

在这里插入图片描述
在这里插入图片描述
创建 了一个l局部变量,l等于last,l其实也是空null。
然后创建了newnode。
在这里插入图片描述
在这里插入图片描述

文章来源: blog.csdn.net,作者:洲的学习笔记,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_51484460/article/details/120774853

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。