Java集合学习1:Collection集合、List
【摘要】
什么是集合
概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能。
和数组的区别
数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型
进行集合接...
什么是集合
概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能。
和数组的区别
数组长度固定,集合长度不固定
数组可以存储基本类型和引用类型,集合只能存储引用类型
进行集合接口的学习时候,多看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)