Collection体系以及List和Set体系

本文详细介绍了Java集合框架中的List和Set两大体系,包括ArrayList、LinkedList、Vector的特性和用法,以及HashSet、LinkedHashSet和TreeSet的区别与应用场景。重点讨论了它们的底层实现、增删查改效率以及线程安全性。通过对不同集合的特点分析,帮助读者理解何时选择合适的集合类型。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

集合两大体系,本篇是关于Collection体系下的List和Set两个集合


一、Collection体系下的两个常用集合

1. List集合

①、定义

List集合是有序的,可以存储重复的数据
由于List集合是有序的,所以它可以通过下标指定获取的元素

②、List集合体系

ArrayList 底层使用数组
特点: 查询快,增删慢(数组有下标,所以查询快,数组增删会带动后续的元素移动,所以增删慢);线程不安全,效率高。

LinkedList 底层使用链表
特点: 查询慢,增删快(链表没有下标,查询从头开始一个个查找,所以慢,增删的话,只与前后两个元素有关,设置前后两个元素指向即可,所以增删快);线程不安全,效率高。

Vector 底层使用数组
特点: 查询快,增删慢;线程安全,效率低。

2. Set集合

①、定义

Set集合存取的元素是无序的,而且不允许存储重复的元素,当添加新元素时候,会先进行比较,若出现重复,则不添加,即添加失败。

②、应用场景

不需要集合中出现重复元素的时候,使用Set集合。
去重的时候,使用Set集合。

③、Set集合体系

HashSet 底层使用哈希表。(无序,不重复)
不重复:依赖于存储元素的类里面的hashCode和equals方法。

LinkedHashSet 底层使用链表和哈希表 (有序,不重复)
有序:链表保证有序(存入顺序就是存储顺序)
不重复:哈希表保证不重复

TreeSet 底层使用红黑树 (有序,不重复)
有序不重复:根据存储类实现Comparable接口后实现的compareTo方法,或者使用比较器Comparator重写compare方法。


二、List集合体系下常用集合

1、ArrayList集合

①、定义

List接口的实现类 – 常用
底层采用数组作为基础结构存储数据

②、初始容量以及扩容机制

无参构造的时候,默认的初始容量为10
有参构造的时候,参数就是指定的长度
当第一次向集合中添加元素的时候,容量设置为10,不是第一次后,当最小所需长度大于当前数组的长度,执行扩容,新容量为旧容量*1.5倍 + 1,再将新容量和最小所需容量比较获取最大值,再将值与最大容量比较,若大于最大容量则返回Integer的最大值,否则为使用当前容量进行扩容。

③、简单使用

// 无参构造 默认初始容量10
ArrayList list = new ArrayList();

// 有参构造 确定初始容量16
ArrayList list1 = new ArrayList(16);

// 添加新的元素
list.add("甘蔗");
list.add("甜菜");
list.add("甜杆");

// 获取集合长度
System.out.println(list.size());

// 向指定位置添加新的元素
list.add(0,"泡芙");
list.add(2,"蛋挞");

// 修改指定位置元素
list.set(1,"卷饼");

// 删除集合中指定的元素
boolean remove = list.remove("甘蔗"); //false

// 特定的删除
Object remove1 = list.remove(0); // 泡芙

// 遍历的方法
// 1. 普通的for循环
System.out.println("for循环:");
for (int i = 0; i < list.size(); i++) {
   
	System.out.println(list.get(i));
	// 卷饼 蛋挞 甜菜 甜杆
}

// 2. 使用forEach循环(增强for循环)
System.out.println("forEach()循环:");
for (Object o1 : list) {
   
	System.out.println(o1);
	// 卷饼 蛋挞 甜菜 甜杆
}

// 3. 使用迭代器
System.out.println("迭代器:");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
   
	System.out.println(iterator.next());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值