9.集合类Collection:

JAVA的Collection集合类总结

​ collection集合类是一种存储方式,相较于数组更有优势:
可以改变长度,可以存放多个类型的数据。

​ 集合分为 单列集合双列集合,Collection接口的2个重要子接口,List 和 Set,都是单列(一次存放一个数据)。而Map是双列,一次存放两个数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhoqzOz0-1678803899866)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220210211015301.png)]集合类


一. 遍历集合的方式

1.1 迭代器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fn4b0UBM-1678803899867)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220513095208372.png)]

​ 注意,用完后要重置迭代器:

iterator = col.iterator();

1.2 增强for

​ 底层仍是迭代器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHPCf3qU-1678803899868)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220513095325283.png)]

二. List及其子类

特点:

​ 存储数据都是**有序有索引的允许元素重复**,可以存入null

​ 只是子类的实现方法不同。

2.1 List

​ 单列的List**允许重复**,通过add方法来加入元素,也可以add固定位置加入元素。

​ 通过set索引位置元素,可以改变元素、remove可以删除。

List list = new ArrayList();
list.add("name1");
list.add("name2");
list.add(1,"name3");//是从1位置将元素插入,原来1位置的元素顺移
list.set(0,"set");

2.2 ArrayList(底层:可变数组)

允许元素重复。

​ List的子接口,特点:内存大小超过界限会自动增大。

​ 初创ArrayList对象时,初始容量为0,放进元素后变为10,超出后,容量变为1.5倍数。如果规定了大小,则超出后为规定大小的1.5倍

ArrayList arrayList = new ArrayList();
for (int i = 1; i <= 10; i++) {
            arrayList.add(i);
        }
        arrayList.add("wtf");

在这里插入图片描述
​ 此外,Vector与ArrayList用法类似。

2.3 LinkedList(底层:双向链表)

​ 特点:类似于链表,插入、删除速度快访问慢

​ 其各类方法:

(43条消息) Java中的LinkedList的方法的应用_K.Sun的博客-CSDN博客_java linkedlist方法

​ 此外,LinkedList可以与Deque实现为栈。

三. Set及其子类

特点:

无序(输入和输出顺序不一定同),没有索引不可重复元素(没有null)

3.1 无索引

​ Set并没有get方法,那么如何取出特定索引位置的值呢?

set.toArray()[Index] //输出Index位置的元素

3.2 不可重复

​ Set以及HashSet不可以放置相同元素:

​ 输出(存入相同元素),会输出**false**。

​ 存入相同元素,则直接**无效**,相当于没存。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUEQwhyS-1678803899869)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220513105736816.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85Lh4OLa-1678803899869)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220513105750828.png)]

注意:

​ add的底层是map.put实现的,比较的是新加入的元素与所有已加入元素的哈希地址,比如上面的AA在常量池中具有相同的地址,也就有相同的哈希值了。

​ 因此,如果加入两个内容相同的new对象,虽然内容同,但地址显然是不同的,这种情况下,虽然内容重复却仍会被加入,比如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eE4d7LNc-1678803899870)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220513110237183.png)]
​ 如果想避免这类情况,可以在相应的HHH类里使用ALT+INSERT来**重写**equals和hashCode,即,当某自定义成员相同时判定为同样的hashcode,那么就“重复”了。

3.3 hashset的使用方法以及api

可以用于重复元素的判别,因为对象.add(元素)如果重复会出false

其他api:

add(): 添加元素,重复则添加失败。

size():返回Set集合中的元素个数。

remove() : 能够删除set中的任意元素,直接remove(想删除的对象)。删除成功返回true,否则返回false。

isEmpty():如果Set不包含元素,则返回 true ,否则返回false。

clear(): 移除此Set中的所有元素。

contains(指定元素):如果Set包含指定的元素,则返回 true,否则返回false。

3.4 TreeSet

​ 红黑树部分略。

四. Map及子类

无序不可重复

​ 作为双列集合,其存放的数据是key-value一对数据,其key不允许重复,如果重复则会覆盖其value的值。

4.1 HashMap

(1)HashMap的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p32dQ6mW-1678803899870)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220514164639402.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4WyFnC6w-1678803899871)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220514164659729.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q9ycJ09s-1678803899871)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220514164719290.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJzAsLJR-1678803899871)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220514165816761.png)]#### 	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EyhnXLV-1678803899872)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\1676212611608.png)]
ch.getOrDefault(ch, 0) //getOrDefault要么返回ch的value,如果没有ch,则返回默认的0

(2)HashMap存放数据

​ 不同的key值要经过hash(key)运算变为哈希值,通过哈希值来确定这对k-v键值对存放在hashMap的位置。

​ 那么会分为以下几种情况:

1. 不同key:

​ 一般有不同的hashcode,位置不同则直接存入即可。

​ 若key不同但hashcode转换出来恰好相同,则会出现哈希冲突,则将加入的元素形成链表排在后面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkuwSulx-1678803899872)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220515220533651.png)]

2. 相同key:

​ 显然会计算出相同的hashcode,则直接在此位置赋新value的值(所以value相同时,相当于没变)。

所以是否会形成链表,核心是看key是不是相同

(3)HashMap的遍历
Map map = new HashMap();
方法1:增强for

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzUxGZ8a-1678803899872)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220515220729385.png)]

方法2:迭代器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0k5iyptF-1678803899873)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220515220930258.png)]

方法3:entrySet

​ 首先,Map的entrySet()方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gqBrw4Nh-1678803899873)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\image-20220515221234688.png)]

​ 返回的是Map.Entry键值对类型的结果,其是整体是Set类集合。也就是说一个Set里存了一堆Entry键值对。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zmymkX6J-1678803899874)(C:\Users\69373\AppData\Roaming\Typora\typora-user-images\1675521005456.png)]

Set set1 = map.entrySet();	//调用entrySet方法

​ 然后采用增强for循环

for (Object entry : set1) {
    Map.Entry m = (Map.Entry)entry;
    System.out.println(m.getKey() + "+" + m.getValue());
}

注意:这里相当于Object entry指向entrySet()所返回的每一个Map.Entry类的键值对对象,父类(Object)对象无法调用子类(Map.Entry)的独有方法,因此要向下转型后再调用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好奇的7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值