前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java集合学习1:Collection集合、List

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

作者头像
程序员洲洲
发布2024-06-07 08:53:16
790
发布2024-06-07 08:53:16
举报
文章被收录于专栏:项目文章

什么是集合

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

和数组的区别

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

进行集合接口的学习时候,多看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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是集合
  • 和数组的区别
  • Collection体系集合
    • Collection实践
      • 集合遍历
        • Collection:保存信息
        • List子接口
          • list子接口的使用
            • list的遍历1:for遍历
              • lisit的遍历2:使用增强for
                • list的遍历3:使用迭代器
                  • list的遍历4:列表迭代器
                    • list案例
                    • List实现类
                      • ArrayList
                        • Vector
                          • LinkedList
                          • ArrayList
                            • 使用
                              • 源码分析
                                • 扩容总结
                                • Vector使用
                                  • vector遍历
                                  • LinkedList
                                    • 使用
                                      • 源码分析
                                      相关产品与服务
                                      容器服务
                                      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档