Java 集合之List
一、集合常用API
1.添加相关的方法
add(E e) 确保此collection包含指定的元素(可选操作)
addAll(Collection<? extends E> c) 将指定集合中的元素都添加到此集合中(可选操作)
2.删除相关的方法
clear() 移除这个集合中所有的元素(可选操作)
remove(Object o) 从此集合中移除指定元素的单个存在实例(可选操作)
removeAll(Collection<?> c) 移除此集合中那些也包含在指定集合中的所有元素(可选操作)
3.判断相关的方法
contains(Object o) 如果此collection包含指定的元素,则返回true。
containsAll(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回true。
isEmpty() 如果此集合不包含元素,则返回true。
4.数组的转换相关方法
toArray() 返回此集合中所有元素的数组
二、List集合
List简介
List是有序的集合,就像数组一样。而List可以理解为是一个长度可变的数组,而且提供了丰富的API。List集合底层就是数组。
public static void main(String[] args) {
//创建一个List的集合
List list = new ArrayList();
//向末尾添加元素
list.add("张三");//0
list.add("李四");//1
list.add("王五");//2
System.out.println(list);
//我们在1处的索引位置来插入元素,我们插入一个元素,该索引后面的元素都会向后一位
list.add(1,"晁盖");
System.out.println(list);
//创建一个集合
List list1 = new ArrayList();
list1.add("一");
list1.add("二");
list1.add("三");
list.addAll(list1);
System.out.println(list);
}
List迭代器Listlterator
jdk1.8文档下的方法
Iterator<E> iterator() 返回在此collection 的元素上进行迭代的迭代器。
通过ListIterator的方式遍历
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("张三");//0
list.add("李四");//1
list.add("赵六");//2
list.add("王五");//3
list.add("赵六");//4
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()){
//获得迭代的元素
String str = (String) listIterator.next();
if ("赵六".equals(str)){
//不能在一边遍历的时候一边操作集合,这样会有多线程的并发问题
//list.add("任七")这个是不行的
//迭代器可以给我们提供了一个add方法让我们避免并发问题,但是添加的时候本次遍历不生效
listIterator.add("任七");
}
System.out.println(str);
}
System.out.println(list);
}
使用for循环来动态的遍历List集合
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("张三");//0
list.add("李四");//1
list.add("赵六");//2
list.add("王五");//3
list.add("赵六");//4
for (int i=0;i<list.size();i++){
//根据索引来获得对应的元素
String str = (String) list.get(i);
if ("赵六".equals(str)){
list.add("任七"); //加在末尾
}
System.out.println(str);
}
System.out.println(list);
}
、
List中元素是可以重复的
三、List实现类
ArrayList
特点
- ArrayaList的底层是数组的原理
- ArrayList中的元素可以重复
- ArrayList是有序的集合,长度不固定
- ArrayList不是线程安全的集合,适合不要求线程安全的需求来实现
- 效率高,性能高
- 如果线程要是同步的话,性能就会贬低
长度变化:
-
初始容量:当你创建一个
ArrayList
时,如果没有指定初始容量,它通常有一个默认的容量大小(在 Java 8 中,默认为 10)。如果你知道将要存储的元素数量,可以在创建时指定一个初始容量。 -
添加元素:当你向
ArrayList
添加元素时,如果添加后元素数量超过了当前容量,ArrayList
会自动进行扩容。扩容过程通常包括以下步骤:- 计算新的容量:通常是当前容量的1.5倍,加上1(以保持整数)。
- 创建一个新的数组,其大小等于新计算出的容量。
- 将旧数组中的所有元素复制到新数组中。
- 将新数组赋值给
ArrayList
的内部数组引用。
LinkedList
特点
1.LinkedList也不是线程安全的
2.底层结构是链表实现
3.有序集合,更适合做增删改的业务场景
链表:存储了元素和前后的地址
LinkedList是链表为原理,添加修改删除的效率高
Vector
Vector底层也是数组,是线程安全的
public static void main(String[] args) {
Vector v = new Vector();
v.add("张三");
v.add("李四");
v.add("王五");
Object o = v.get(1);
System.out.println(o);
System.out.println("------------------------------------");
for (int i = 0;i<v.size();i++){
Object o1 = v.get(i);
System.out.println(o1);
}
System.out.println("------------------------------------");
Enumeration elements = v.elements();
while (elements.hasMoreElements()){
Object o1 = elements.nextElement();
System.out.println(o1);
}
//while (elements.hasMoreElements()) 这是一个while循环,它会一直执行,直到elements中没有更多的元素。hasMoreElements()方法是Enumeration接口的一部分,用于检查是否还有更多的元素可以遍历。
//Object o1 = elements.nextElement(); 这行代码调用nextElement()方法,它会返回Enumeration中的下一个元素。每次调用nextElement()时,都会返回序列中的下一个元素,并将内部指针向前移动。
}