Java集合-01
一、集合的分类
主要分为两种
单值集合:Collection
双值集合: Map
二、Collection
1. Collection接口的实现类有List和Set两种;
2. List中的元素是有序、可重复的; Set中的元素是无序、不可重复的(有序与无序指的是插入顺序与取出顺序是否一致)
3. Collection接口没有直接的实现类,是通过他的子接口List和Set去实现的
4. Collection接口遍历元素的方式
(1)迭代器遍历
(2)增强for循环
(3)普通for循环
所有实现了Collection接口的集合类都有一个iterator() 方法,这个方法用来返回迭代器对象Iterator,即:
List list = new ArratList();
list.add("aaaa");
//开始遍历
Iterator it = list.iterator();
//list集合由于是Collection接口的实现类,所以具有该iterator()方法,调用该方法会返回一个Iterator迭代器对象
if(it.hasNext()){
Object str = it.next();
}
或者:
while (iterator.hasNext()) {//判断是否还有数据
// 返回下一个元素,类型是 Object
Object obj = iterator.next();
System.out.println("obj=" + obj);
}
List集合
public class ListExercise {
@SuppressWarnings({"all"})
public static void main(String[] args) {
/*
添加 10 个以上的元素(比如 String "hello" ),在 2 号位插入一个元素"韩顺平教育",
获得第 5 个元素,删除第 6 个元素,修改第 7 个元素,在使用迭代器遍历集合,
要求:使用 List 的实现类 ArrayList 完成。
*/
List list = new ArrayList();
for (int i = 0; i < 12; i++) {
list.add("hello" + i);
}
System.out.println("list=" + list);
//在 2 号位插入一个元素"韩顺平教育"
list.add(1, "韩顺平教育");
System.out.println("list=" + list);
//获得第 5 个元素
System.out.println("第五个元素=" + list.get(4));
//删除第 6 个元素
list.remove(5);
System.out.println("list=" + list);
//修改第 7 个元素
list.set(6, "三国演义");
System.out.println("list=" + list);
//在使用迭代器遍历集合
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println("obj=" + obj);
}
}
//集合排序
public static void sort(List list) {
int listSize = list.size();
for (int i = 0; i < listSize - 1; i++) {
for (int j = 0; j < listSize - 1 - i; j++) {
//取出对象 Book
Book book1 = (Book) list.get(j);
Book book2 = (Book) list.get(j + 1);
if (book1.getPrice() > book2.getPrice()) {//交换
list.set(j, book2);
list.set(j + 1, book1);
}
}
}
}
三、ArrayList解读
1. ArrayList底层是由数组组成的,可以为多个null ,ArrayList基本上等同于Vector,但ArrayList是线程不安全的。
2. ArrayList扩容机制:
①ArrayList 通过数组实现,一旦我们实例化 ArrayList 无参数构造函数默认为数组初始化长度为 10
②初始化时,如果是有参构造,则第一次初始化为当前已构造中指定好的长度,当再次扩容时,则直接扩容为当前的1.5倍
③add 方法底层实现如果增加的元素个数超过了 10 个,那么 ArrayList 底层会新生成一个数组,长度为原数组的 1.5 倍+1,然后将原数组的内容复制到新数组当中,并且后续增加
的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。是一旦数组超出长度,就开始扩容数组。
扩容数组调用的方法
Arrays.copyOf(objArr, objArr.length + 1);
四、Vector解读
1. Vector是线程安全的,底层也维护了一个Object类型的数组
2. Vector 类的操作方法都带有synchronized ,即Vector是线程安全的。
2.1 //下面这个方法就添加数据到 vector 集合
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
五、ArrayList与Vector集合的区别
七、LinkedList集合解读
1. LinkedList底层是一个双向链表,这条链表是有多个Node节点组成的,每个Node节点又维护了三个属性,即:prev/item/next; prev执行前一个Node,item是当前的Node,next指向下一个Node,以此来构成一条双向链表。
有两个特殊的Node节点,即首节点first和尾节点last
2. LinkedList允许重复,且有序,但线程不是安全的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)