提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
今天学习了集合的List集合、ArrayList集合、链表记录一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、List集合
1.1、List集合和Set集合的区别
List集合和Set集合都是Collection类的接口。但是List集合和Set集合有着各自的优缺点。下面我就通过表格形式总结一下。
List集合 | Set集合 |
---|---|
有序的 | 无序的 |
可重复的 | 去重的 |
可根据索引进行操作的 | 不可根据索引进行操作的 |
1.2、List集合的使用
这是创建一个int类型的list集合。
List<Integer> list = new ArrayList<>();
在list集合中许多方法。记录几个常见的方法。
of方法:可以创建一个list集合。
//of方法
System.out.println(List.of(1, 4, 6, 8, 10));
System.out.println(list1);
System.out.println("------------------------------");
注意:of创建的list集合不能修改
remove方法:删除list集合中的元素。如果list集合是int类型的那么输入1就删除下标为1的元素,而不是数字1
//remove
list.remove(1);
1.3、List迭代器
当使用list集合想遍历整个集合的元素,我们知道有三种方法:
1、for
2、foreach
3、迭代器
但只有使用for循环才能时候才能在某些条件下,对list集合做一些添加和删除操作。为什么foreach和迭代器不行呢?因为foreach和迭代器底层代码都是一样的都是通过迭代器实现。在迭代器使用的时候,会先遍历整个list集合给出一个数记录整个集合的元素个数,在进行添加后迭代器发现遍历的个数与之前记录的数不一致就会抛出
ConcurrentModificationException的异常。这个异常的意思就是当这种修改是不允许的时,检测到对象的并发修改的方法可能会抛出此异常。`
此时就有了List迭代器解决此问题。给出一实例代码供参考。
示例代码如下:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("钢铁侠");
list.add("小蜘蛛");
list.add("美队");
list.add("黑寡妇");
list.add("黑豹");
list.add("灭霸");
while (lis.hasNext()){
if ("灭霸".equals(lis.next())){
lis.add("惊奇队长");
}
}
System.out.println(list);
}
输出结果如下:
二、ArrayList集合
ArrayList:有序的,可以根据索引进行操作的,可以存储重复数据,实现所有可选列表操作,并允许所有元素,包括null 。
优点:查询效率较高,增删效率较低。
遍历方式:常见的三种集合遍历方式+list迭代器
扩容机制:当ArrayList空间不够,可以进行扩容。扩容机制扩容到原来的1.5倍。
示例代码如下:
public class Class_07_ArrayList {
public static void main(String[] args) {
List<Phone> list = new ArrayList<>();
Phone p = new Phone(1000, "Vivo", 99, 5000);
Phone p2 = new Phone(1001, "华为Mate40Pro", 100, 6999);
Phone p3 = new Phone(1003, "华为Mate40", 101, 5999);
list.add(new Phone(1000, "Vivo", 99, 5000));
list.add(new Phone(1001, "华为Mate40Pro", 100, 6999));
list.add(new Phone(1003, "华为Mate40", 101, 5999));
System.out.println(list.indexOf(new Phone(1001, "华为Mate40Pro", 100, 6999)));
for (Phone e : list) {
System.out.println(e);
}
System.out.println("===========================");
System.out.println(list.size());
}
}
class Phone {
private int id;
private String name;
private int num;
private double price;
public Phone() {
}
public Phone(int id, String name, int num, double price) {
this.id = id;
this.name = name;
this.num = num;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "phone{" +
"id=" + id +
", name='" + name + '\'' +
", num=" + num +
", price=" + price +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Phone phone = (Phone) o;
return id == phone.id && num == phone.num && Double.compare(phone.price, price) == 0 && Objects.equals(name, phone.name);
}
}
输出结果如下:
三、链表
单链表:
单链表下一个没用地址指向null。
双链表:
双链表的头部可以指向尾部,形成闭环。
总结
今天学习了一些集合的不同类型,以及常用的方法,需要加强联系。明天再见!