List接口介绍
特点:
有序:有序(元素存入集合的顺序和取出的顺序一致)。List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。
可重复:List允许加入重复的元素。跟确切地讲,List通常允许满足e1.equals(e2)的元素重复加入容器。
List的常用方法
除了Collection接口中的方法,List多了一些根顺序(索引)有关的方法
方法 | 说明 |
---|---|
void add(int index, Object element) | 在指定位置插入元素,以前元素全部后移一位 |
Object set(int index, Object element) | 修改指定位置的元素 |
Object get(int index) | 返回指定位置的元素 |
Object remove(int index) | 删除指定位置的元素,后面的元素全部前移一位 |
int indexOf(Object o) | 返回第一个匹配元素的索引,如果没有该元素,返回-1 |
int lastIndexOf(Object) | 返回最后一个匹配元素的索引,如果没有该元素,返回-1 |
ArrayList容器类
ArrayList是List接口的实现类。是List存储特征的具体实现。
ArrayList底层是用数组实现的存储。特点:查询效率高,增删效率低,在多线程的情况下线程不安全。
添加元素
例:
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
// 实例化ArrayList容器
List<String> list = new ArrayList<>();
// 添加元素
boolean flag = list.add("wuhu qifei");
System.out.println(flag);
// 索引位置不能大于容器内元素个数
// 可以游戏祖玛来理解
list.add(1,"cyc");
}
}
获取元素
E get(int index)
返回此列表中指定位置的元素
参数:index,返回的元素的索引
异常:IndexOutofBoundsException,如果索引超出范围会抛出异常(index < 0 或index >= size())
示例代码(部分):
// 通过指定索引位置获取元素
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
// 通过循环获取容器中所有元素
// size(),返回容器中个数
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
替换元素
E set(int index, E element)
取代在指定位置上的元素在这个列表指定的元素
参数:
index,要取代元素的索引
element,要替换进去的元素
结果:
修改指定位置的元素并将修改前的元素返回。
示例代码(部分):
String val = list.set(0,"world");
System.out.println(val);
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
删除元素
根据索引删除元素
E remove(int index)
删除指定位置的元素
参数:
index,要删除元素的索引
返回值,返回被删除的元素
示例代码(部分):
String string1 = list.remove(1);
System.out.println(string1);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
删除指定元素
删除给定的对象
boolean remove(Object o)
参数:
Object o,指定的对象
返回值,返回bool类型,true删除成功,false删除失败
示例代码(部分):
boolean flagA = list.remove("world");
System.out.println(flagA);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
清空容器
删除容器中所有元素
void clear()
示例代码(部分):
list.clear();
System.out.println(list.size());
判断容器是否为空
boolean isEmpty()
如果容器为空,返回true,如果容器不为空,返回false
示例代码(部分):
boolean flagB = list.isEmpty();
System.out.println(flagB);
list.add("1234");
flagB = list.isEmpty();
System.out.println(flagB);
判断容器中是否包含指定元素
boolean contain(Object o)
判断Object o是否在容器内,如果是则返回true,如果不是则返回false
示例代码(部分):
boolean flagC = list.contains("1234");
System.out.println(flagC);
flagC = list.contains("1");
查找元素的位置
查找元素第一次出现的位置
int indexOf(Object o)
查找Object o对象,若查到则返回该元素第一次出现的位置索引号,若查找不到该元素则返回-1。
示例代码(部分):
int index1 = list.indexOf("1234");
System.out.println(index1);
查找元素最后一次出现的位置
int lastIndexOf(Object o)
查找Object o对象,若查到则返回该元素最后一次出现的位置索引号,若查找不到该元素则返回-1。
示例代码(部分):
list.add("gugugu");
list.add("1234");
int lastIndex = list.lastIndexOf("1234");
System.out.println(lastIndex);
将单例集合转换成数组
转换为Object数组
Object[] toArray()
无参数,返回一个Object数组
示例代码(部分):
// 将ArrayList转换为Object类型数组
// 但是不能将转换的数组整体进行强制类型转换
Object[] arry = list.toArray();
for (int i = 0; i < arry.length; i++) {
String str = (String)arry[i];
System.out.println(str);
}
转换泛型类型数组
<T> T[] toArray(T[] a)
示例代码(部分):
// 将单例集合转换为指定类型的数组
String[] arry2 = list.toArray(new String[list.size()]);
for (int i = 0; i < arry2.length; i++) {
System.out.println(arry2[i]);
}
容器的并集操作
示例代码(部分):
List<String> list_1 = new ArrayList<>();
list_1.add("a");
list_1.add("b");
list_1.add("c");
List<String> list_2 = new ArrayList<>();
list_2.add("b");
list_2.add("c");
list_2.add("d");
boolean flagL = list_1.addAll(list_2);
System.out.println(flagL);
for (String str_test:list_1) {
System.out.println(str_test);
}
将容器合并,如果合并成功返回true,失败返回false。如果并入的容器(例如list_2)为空则不能合并,返回false,如果主容器(例如list_1)为空,仍能合并,且返回true。