前面的话
博客主页:hyhWTX的博客主页
欢迎关注🖱点赞🎀收藏⭐留言✒
本文由hyhWTX原创,csdn首发!
二十三.List集合
一.List接口
java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List接口的特点:
- 它是一个元素存有序的集合。例如,存元素的顺序是11、22、33,那么在集合中的元素存储就是按照11、22、33的顺序存储的。
- 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
- 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复元素。
源码示例:
package Day12.List;
/**
* @author hyhWTX
* @version 1.0
* @ClassName ArraylistDemo
* @date 2022年07月08日 13:39
* @Description: Arraylist集合的特点
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* list接口中常有的索引的方法(特有)
* public void add(int index. E element): 将指定的元素,添加到该集合中的指定位置上。
*
* public E get (int index):返回集合中指定位置的元索。
*
* public E remove(int index):移除列表中指定位置的元素。返回的是被移除的元素。
*
* public E set(int index,E element):用指定元素昔换集合中指定位置的元素,返回值的更新前的元素。
*
* 注意:
* 操作索引的时候,一定要防止索引越界异常。
* IndexOutOfBoundsException: 集合一般情况下会有这个错误
*
*
*/
public class ArraylistDemo {
public static void main(String[] args) {
//创建一个list集合
List<String> list = new ArrayList<>();
//使用add方法往集合中添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("a");
//打印输出集合
System.out.println(list);//[a, b, c, d, a],不死地址,重写了Srtring方法
//在c和d之间添加元素
list.add(3,"666");
System.out.println(list);
//移除元素
String removeEE = list.remove(2);
System.out.println("移除的元素是:"+removeEE);
System.out.println(list);
//替换元素
String setE = list.set(4, "A");
System.out.println(list);
//便利list
//使用普通的循环
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
System.out.println("=================");
//使用迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
System.out.println("==================");
//使用增强for
for (String s : list) {
System.out.println(s);
}
list.get(5);//IndexOutOfBoundsException: Index: 5,
//越界异常
}
}
二.List的子类
ArrayList集合:
java.util.ArrayList集合数据存储的结构是数组结构,元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据,遍历数据,所以ArrayList是最常用的集合。
注意:很多开发时候的对于ArrayList的完成需求的用法是不严谨不被提倡的。
LinkedList集合:
java.util.LinkedList集合数据存储的结构是链表结构,方便元素添加、删除集合。
LinkedList是一个双向链表。
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量对于首尾操作的方法,这些方法了解即可。
源码实例:
package Day12.List;
/**
* @author hyhWTX
* @version 1.0
* @ClassName LinkedListDemo
* @date 2022年07月08日 16:28
* @Description: LinkedList集合的特点
*/
import java.util.LinkedList;
/**
* 特点:
* 1.底层是一个链表结构的,查询慢,增删快
* 2.里面包含了大量的操作首尾元素的方法
* 注意:使用LinkedList集合特有的方法,不能使用多态
*
* - public void addFirst(E e):将指定元素插入此列表的开头。
* - public void addLast(E e):将指定元素插入此列表的结尾。
* - public E getFirst():返回此列表的第一个元素
* - public E getLast():返回此列表的最后一个元素。。
* - public E removeFirst():移除并返回此列表的第一个元素。
* - public E removeLast():移除并返回此列表的最后一个元素
* - public E pop():从此列表所表示的堆栈处弹出一个元素。
* - public void push(E e):将元素推入此列表所表示的堆栈。
* - public boolean isEmpty():如果列表不包含元素,则返回true
*/
public class LinkedListDemo {
public static void main(String[] args) {
show01();
show02();
show03();
}
private static void show01(){
//创建LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add方法向集合中添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);
//public void addFirst(E e):将指定元素插入此列表的开头。
//linked.addFirst("www");
linked.push("www");
System.out.println(linked);
// public void addLast(E e):将指定元素插入此列表的结尾。等价于addFirst方法
linked.addLast("mmm");
System.out.println(linked);
}
// - public E getFirst():返回此列表的第一个元素
// - public E getLast():返回此列表的最后一个元素。。
private static void show02() {
//创建LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add方法向集合中添加元素
linked.add("a");
linked.add("b");
linked.add("c");
//linked.clear();//清空元素,NoSuchElementException会报列表为空的异常
if (!linked.isEmpty()) {//判断列表是否为空,为空不执行,不为空执行
String first = linked.getFirst();
System.out.println(first);
String last = linked.getLast();
System.out.println(last);
}
}
private static void show03() {
//创建LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add方法向集合中添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);
String f = linked.removeFirst();
System.out.println("移除的第一个元素为:"+f);
String last = linked.removeLast();
System.out.println("移除的最后一个元素为:"+last);
System.out.println(linked);
}
}
Vector集合
-
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
Vector
类实现了可扩展的对象数组。像数组一样,它包含可以使用整数索引访问的组件。但是,Vector
的大小可以根据需要增长或缩小,以适应在创建Vector
之后添加和删除项目。每个向量尝试通过维护
capacity
和capacityIncrement
优化存储capacityIncrement
。capacity
总是至少与矢量大小一样大; 通常较大,因为当向量中添加组分时,向量的存储空间大小capacityIncrement
。 应用程序可以在插入大量组件之前增加向量的容量; 这减少了增量重新分配的数量。The iterators returned by this class’s个
iterator
和listIterator
方法是快速失败的 :如果向量在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身remove
种或add
方法,迭代器都将抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。 由elements
返回的Enumerations
不是故障快速的。请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入
ConcurrentModificationException
。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。从Java 2平台v1.2,这个类被改造为实现
List
接口,使其成为成员Java Collections Framework 。 与新集合实现不同,Vector
是同步的。 如果不需要线程安全的实现,建议使用ArrayList
代替Vector
。