java.util中提供了三种常用的集合类,列表List、集合Map和字典Set。这些集合类相较于数组有更多功能,并且都可以通过Iterator(迭代器)来访问。
在这篇博客中,首先来介绍一下列表List。
List与数组类似,按顺序存储元素,但可以方便地增加和删除元素。List可以由数组(ArrayList)或链表(LinkedList)来实现。ArrayList方便查找元素,但是不方便增加/删除元素;LinkedList方便增加/删除元素,但不方便查找元素。一般使用ArrayList,但也要具体情况具体分析。
定义
List的定义方法有很多,在这里我只介绍两种,其他的方式可以参考Java 中初始化 List 集合的 6 种方式! 。
第一种常规方式,比较繁琐。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for(int item : list){
System.out.println(item);
}
}
}
第二种方式,借助Arrays工具类。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for(int item : list){
System.out.println(item);
}
}
}
查找
遍历
首先考虑遍历List,有两种方法。第一种方法是for循环+下标,第二种方法是使用Iterator(迭代器)。
第一种方法,有点类似于数组的操作,使用get函数。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
}
}
第二种方法,也有两种不同的写法。
第一种写法上面已经展示过了,for循环+Iterator。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for(int item : list){
System.out.println(item);
}
}
}
第二种写法,使用Iterator的hasNext函数和next函数。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for(Iterator it = list.iterator(); it.hasNext();){
System.out.println(it.next());
}
}
}
总的来说,用Iterator要比用下标更快一些。此外,如果用for循环+下标的方式,在List删除元素时会有一些问题,具体可见List中remove()方法的注意事项。
元素与下标互查
其次考虑根据下标查找List中的元素,以及根据元素查找其在List中的下标。
对于第一个问题,在上面已经展示过了,使用get函数。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
int index = 1;
int item = list.get(index);
System.out.println(item);
}
}
对于第二个问题,List有一个String中同名的函数,indexOf函数。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
int item = 3;
int index = list.indexOf(item);
System.out.println(index);
}
}
修改
List要修改元素很简单,使用一个get函数相对应的函数,set函数。set函数对指定的下标进行修改。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.set(0, 666);
for(int item : list){
System.out.println(item);
}
}
}
增加
List要增加元素同样很简单,使用一个set函数类似的函数,add函数。add函数对指定的下标进行增加。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.add(0, 666);
for(int item : list){
System.out.println(item);
}
}
}
删除
List可以按下标删除元素,或者直接删除某个元素。
如果是按下标删除元素,那么返回值为被删除的元素。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.remove(1);
for(int item : list){
System.out.println(item);
}
}
}
如果是按元素删除,那么返回值为true/false,表示是否已删除。值得注意的是,当List为int型时,如果直接将元素传入remove函数,会被当作下标处理。需要将元素进行显式类型转换。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.remove((Integer) 1);
for(int item : list){
System.out.println(item);
}
}
}
在删除元素之前,可以先判断List中是否包含该元素。与String类似,可以用contains函数。
import java.util.*;
public class Main
{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
if(list.contains((Integer) 1)) {
list.remove((Integer) 1);
}
for(int item : list){
System.out.println(item);
}
}
}
参考: