java学习——集合

1 集合体系结构

img

List系列集合:添加的元素有序、可重复、有索引

Set系列集合:添加的元素无序、不重复、无索引

2 单列集合

Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用

2.1 Collection集合

2.1.1 常用方法

在这里插入图片描述

注意事项:

1、添加元素add()

细节1:如果我们要往List系列集合中添加元素,那么方法永远返回true,因为List系列的是允许元素重复的

细节2:如果我们要往Set系列集合中添加元素,如果当前元素不存在,方法返回true,表示添加成功。如果当前要添加的元素存在,方法返回false,表示添加是失败。因为Set系列的集合不允许元素重复

2、删除元素remove()

细节:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除,只能通过元素的对象进行删除

3、判断元素是否包含contains()

细节:底层是依赖equals方法进行判断是否存在的,所以如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么javabean类中,一定要重写equals方法。

2.1.2 Collection的遍历方式
1 迭代器遍历

1)常用方法

代码实现遍历:

2)细节

1、当上面的循环结束之后,迭代器的指针已经指向了最后没有元素的位置,如果此时再次调用next方法,会报错NoSuchElementExcetion

2、迭代器遍历完毕,指针不会复位,如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象

3、循环中只能用一次next方法

4、迭代器遍历时,不能使用集合的方法进行增加或者删除。如果要进行删除,那么可以用迭代器提供的remove方法进行删除,如果要添加,暂时没有办法。

2 增强for遍历

所有的单列集合和数组才能用增强for进行遍历

3 Lambda表达式遍历

2.2 List集合

2.2.1 特点
  • 有序:存和取的元素顺序一致

  • 有索引:可以通过索引操作元素

  • 可重复:存储的元素可以重复

2.2.2 List集合的特有方法

注意事项:

1、添加元素add()

细节:原来索引上的元素会依次往后移

2、删除元素remove()

细节:List系列集合中的两个删除方法

1)直接删除元素 remove(Object o)

2)通过索引进行删除 remove(int index)

所以在调用方法的时候,方法会出现重载现象,此时会优先调用,实参跟形参类型一致的哪个方法

2.2.3 List集合的遍历方式
1 迭代器遍历
2 列表迭代器

获取一个列表迭代器的对象,里面的指针默认也是指向0索引的

额外添加了一个方法,在表里的过程中,可以添加元素

`Iterator<String> it = coll.iterator(); while (it.hasNext()){ String str = it.next();

if("bbb".equals(str)){

it.add("qqq")``}

System.*out*.println(str); `}``

3 增强for

4 Lambda表达式
5 普通for循环

size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素

for (int i = 0; i < list.size(); i++) { String s1 = list.get(i); System.*out*.println(s); }

5中遍历方式对比

迭代器遍历:在遍历的过程中需要删除元素

列表迭代器:在遍历的过程中需要添加元素

增强for遍历:仅仅想遍历

Lambda表达式:仅仅想遍历

普通for:如果遍历的时候想操作索引,可以用普通for

2.3 List集合的实现类

2.3.1 ArrayList实现类
1 ArrayList集合底层原理

1.创建ArrayList对象的时候,他在底层先创建了一个长度为0的数组。

数组名字:elementDate,定义变量size。

size这个变量有两层含义: ​ ①:元素的个数,也就是集合的长度 ​ ②:下一个元素的存入位置

2.添加第一个元素时,底层会创建一个新的长度为10的数组

3.存满时,会扩容1.5倍

4.如果一次添加多个元素,1.5倍还放不下,则创建数组的长度以实际为准

2 扩容机制

扩容时机一:

  1. 当存满时候,会创建一个新的数组,新数组的长度,是原来的1.5倍,也就是长度为15.再把所有的元素,全拷贝到新数组中。如果继续添加数据,这个长度为15的数组也满了,那么下次还会继续扩容,还是1.5倍。

扩容时机二:

  1. 一次性添加多个数据,扩容1.5倍不够,怎么办呀?

    如果一次添加多个元素,1.5倍放不下,那么新创建数组的长度以实际为准。

举个例子: 在一开始,如果默认的长度为10的数组已经装满了,在装满的情况下,我一次性要添加100个数据很显然,10扩容1.5倍,变成15,还是不够,

怎么办?

此时新数组的长度,就以实际情况为准,就是110

2.3.1 ArrayList实现类
1 特有方法
方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

2.4 Set集合

2.4.1 特点

无序:存取顺序不一致

不重复:没有去除重复

无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

2.4.2 Set集合的特有方法

添加元素add()

如果当前元素是第一次添加,那么可以添加成功,返回true

如果当前元素是第二次添加,那么添加失败,返回false

2.4.3 Set集合实现类

HashSet : 无序、不重复、无索引

LinkedHashSet : 有序、不重复、无索引

TreeSet : 可排序、不重复、无索引

2.4.4 Set集合的遍历方式

1 迭代器遍历

2 增强for

3 Lambda表达式

2.5 Set集合实现类

2.5.1 HashSet实现类
1 哈希值【理解】
  • 哈希值简介

    是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

  • 如何获取哈希值

    Object类中的public int hashCode():返回对象的哈希码值

  • 哈希值的特点

    • 同一个对象多次调用hashCode()方法返回的哈希值是相同的

    • 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象相同属性值的哈希值相同

2 存储元素

哈希链表

2.5.2 LinkedHashSet实现类

底层基于哈希表,使用双链表记录添加顺序

2.5.3 TreeSet实现类

可排序、不重复、无索引

可排序:

对于数值类型:Integer,Double,默认按照从小到大的顺序进行排序

对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值