List单列集合
1463字约5分钟
2025-09-23
集合
单列集合
两个重要的子接口(List,Set),实现的子类都是单列集合
单列集合
- 有些Collection的现实类,可以存放重复的元素,有些则不可以
- 有些Collection的实现类,有些是有序的(List),有些是无序的(Set)
- Collection接口没有直接的实现子类,是通过子接口
Set
和List
来实现的 - List相当于是数组的加强版,List中的元素可以存放多种类型的数据
ArrayList
、Vector
和LinkedList
使用的方法差不多
常用方法
添加(add)
List list = new ArrayList();
// 添加单个元素
list.add("zhangsan");
list.add(20);
list.add(true);
list.add("java");
System.out.println(list); // [zhangsan, 20, true, java]
输出对应的元素
System.out.println(list.get(1)); // 20
删除(remove)
// 删除
list.remove(0); // 删除第一个元素
list.remove(true); // 删除输入的元素
System.out.println(list); // [20, java]
判断元素是否存在(contains)
// 查找元素是否存在
System.out.println(list.contains("java")); // true
System.out.println(list.contains(20)); // true
查看元素个数(size)
// 查看集合元素个数
System.out.println(list.size()); // 2
判断集合是否为空(isEmpty)
// 判断集合是否为空
System.out.println(list.isEmpty()); // false
清空集合(clear)
// 清空集合
list.clear();
System.out.println("list = " + list); // list = []
添加多个元素(addAll)
// 添加多个元素
ArrayList arlist = new ArrayList();
arlist.add("sanguo");
arlist.add("xiyou");
list.addAll(arlist);
System.out.println(list); // [sanguo, xiyou]
查看两个集合是否相同(containsAll)
// 查看两个集合的元素是否相同
System.out.println(list.containsAll(arlist)); // true
删除多个元素(removeAll)
// 删除多个元素
// 删掉arlist部分的元素
list.add("xin");
list.removeAll(arlist);
System.out.println(list); // [xin]
插入元素
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
// 插入单个元素
list.add(1, "wangmazi");
System.out.println(list); // [zhangsan, wangmazi, lisi]
// 插入多个元素
List list1 = new ArrayList();
list1.add("zhao");
list1.add("qian");
list.addAll(1, list1);
System.out.println(list); // [zhangsan, zhao, qian, wangmazi, lisi]
返回查找对象的下标值
// 返回查找对象首次出现的下标值
System.out.println(list.indexOf("zhao")); // 1
// 返回查找对象最后一次出现的下标值
list.add("zhao");
System.out.println(list.lastIndexOf("zhao")); // 5
替换元素
// 替换对应的元素,并返回替换的元素值
System.out.println(list.set(0, "java")); // zhangsan
System.out.println(list); // [java, qian, wangmazi, lisi, zhao]
查看某段元素
// 返回对应区间的元素
// 返回索引为 [0,2) 的值
List list2 = list.subList(0, 2);
System.out.println(list2); // [java, qian]
迭代器遍历
遍历前要先创建对应的迭代器
然后在使用hasNext()
方法对集合元素进行判断,判断元素是否存在
next()
:如下一个元素不存在,还执意使用该方法,则会报错
重新遍历元素:重新执行迭代器即可
itit
快捷键:快速生成循环代码(while(iterator.hasNext())
)
Collection list = new ArrayList();
list.add(new people("zhangsan", 20));
list.add(new people("lisi", 30));
System.out.println(list);
// 迭代器
// 每执行一遍迭代器,下标就会被重置
Iterator iterator = list.iterator();
// 判断集合中下一个元素是否存在
// hasNext:判断下一个元素是否存在
// 存在则返回true
// 不存在则返回false
while(iterator.hasNext()) {
// 每执行一次,下标都会往下移动一次
// 并且返回对应的元素
// 使用前需使用hasNext()方法对集合元素进行判断,是否存在
Object next = iterator.next();
// 输出元素
System.out.println(next);
}
// 增强for
// 可以在不写迭代器的情况下遍历集合元素
for (Object i : list) {
System.out.println(i);
}
// 原理:代码底层调用了迭代器
ArrayList和Vector的区别
ArrayList和LinkedList的区别
注意点
- 集合元素可以为
null
ArrayList
是利用数组来存储的ArrayList
基本等同于Vector
,但是ArrayList
有线程安全问题(但效率高),所以在多线程的情况下不建议使用(多线程的情况下建议使用Vector
)LinkedList
底层实现了双向链表和双端队列的特点,可以添加任何元素,但线程不安全
双向链表
package com.mao.ListDemo;
public class List04 {
public static void main(String[] args) {
Node tom = new Node("tom");
Node java = new Node("java");
Node python = new Node("python");
// tom --> java --> python
tom.next = java;
java.next = python;
// python --> java --> tom
python.prev = java;
java.prev = tom;
// first and last
Node first = tom;
Node last = python;
while (true) {
if (first == null) {
break;
}
System.out.println(first);
// 下一个结点
first = first.next;
}
Node zhangsan = new Node("zhangsan");
// 在java和python中间插入zhangsan对象
// 从新指向
java.next = zhangsan;
zhangsan.next = python;
python.prev = zhangsan;
zhangsan.prev = java;
while (true) {
if (last == null) {
break;
}
System.out.println(last);
// 上一个结点
last = last.prev;
}
}
}
// 双向链表的一个结点
class Node {
public Object item; // 存放数据
public Node next; // 指向后一个结点
public Node prev; // 指向前一个结点
public Node(Object name) {
this.item = name;
}
public String toString() {
return "" + item;
}
}
// 运行结果
tom
java
python
python
zhangsan
java
tom
练习
题目:要求使用集合,列出书名以及对应的价格
并且要以价格由低到高的方式进行排序
package com.mao.ListDemo;
import java.util.ArrayList;
import java.util.List;
public class List03 {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Book("sanguo", 20));
list.add(new Book("xiyou", 30));
list.add(new Book("honglou", 10));
siz(list);
for (Object i : list) {
System.out.println(i);
}
}
// 重点部分
public static void siz(List list) {
// 获取集合元素数量
int num = list.size();
for (int i = 0; i < num - 1; i++) {
for (int j = 0; j < num - 1 - i; j++) {
// 将集合强制转换为Book类型,方便调用book对象里面的属性
Book book1 = (Book)list.get(j);
Book book2 = (Book)list.get(j + 1);
if (book1.getMonet() > book2.getMonet()) {
list.set(j, book2);
list.set(j + 1, book1);
}
}
}
}
}
class Book {
String name;
double money;
public Book(String name, double money) {
this.name = name;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMonet() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String toString() {
return "书名:" + name + "\t" + "价格:" + money;
}
}
// 运行结果
书名:honglou 价格:10.0
书名:sanguo 价格:20.0
书名:xiyou 价格:30.0