前面我们学习了什么是Collection以及集合的一些方法,这些方法基本上我们都有用代码去测试过。现在,我们来学习Collection这个根接口下的第一个子接口,叫List,Set接口我们后续学习。
打开API,搜索List,找到java.util包下的List。我们可以发现List的父接口是Collection,而且List接口下的方法有很多和Collection集合里的方法是重复的,下面我们列举几个不一样的方法来测试学习下。
1.void add(int index, E element)
我们之前学习过Collections的add()方法,当时里面的参数是泛型,表示任何对象都可以添加进入集合,而且返回值是布尔型。现在我们学习的这个添加方法是在指定的索引对应位置插入元素,元素类型是可以任意对象,注意返回类型是void。注意,使用这个方法可能出现索引越界异常。
package list;
import java.util.ArrayList;
import java.util.List;
public class Demo1_List {
public static void main(String[] args) {
List li = new ArrayList();
// 添加元素,使用add()
li.add("a");
li.add("b");
li.add("c");
li.add("d");
//使用add(index E),在指定索引位置插入元素
li.add(2, "y");
System.out.println(li);
}
}
输出:[a, b, y, c, d]
由于我们需要把y插入到索引为2的位置,索引是从0开始的,所以输出结果是[a, b, y, c, d],下面来举例一个由于索引没有控制好造成越界异常的例子。
package list;
import java.util.ArrayList;
import java.util.List;
public class Demo1_List {
public static void main(String[] args) {
List li = new ArrayList();
// 添加元素,使用add()
li.add("a");
li.add("b");
li.add("c");
li.add("d");
//使用add(index E),在指定索引位置插入元素
li.add(8, "x");
System.out.println(li);
}
}
运行之后,会报异常: java.lang.IndexOutOfBoundsException,只要插入的索引小于等于集合的size(),也就是最多在末尾元素插入一个新元素,再往后插入就出索引越界异常。
2. E remove(int index)
这个方法和上面介绍的根据索引添加元素刚好相反,是根据索引删除元素,返回的是被删除的元素。
package list;
import java.util.ArrayList;
import java.util.List;
public class Demo1_List {
public static void main(String[] args) {
List li = new ArrayList();
// 添加元素,使用add()
li.add("a");
li.add("b");
li.add("c");
li.add("d");
//根据指定索引删除元素
Object ob1 = li.remove(1); //通过索引删除元素,将被删除的元素返回
System.out.println(ob1);
System.out.println(li);
}
}
运行:
b
[a, c, d]
3.E get(int index)根据索引返回元素,类型是任意对象。
import java.util.List;
public class Demo1_List {
public static void main(String[] args) {
List li = new ArrayList();
// 添加元素,使用add()
li.add("a");
li.add("b");
li.add("c");
li.add("d");
//根据指定索引返回元素
Object ob1 = li.get(2);
System.out.println(ob1);
}
}
输出:c
通过索引来获取元素,这个很容易让我们想起查字典的场景,还有一种场景也可以利用这个方法,那就是遍历索引元素。自己写一个for循环,然后通过get(Index)方法来遍历List集合元素。
4.set(int index , E element)
这个方法是将指定位置的元素进行修改值。
package list;
import java.util.ArrayList;
import java.util.List;
public class Demo1_List {
public static void main(String[] args) {
List li = new ArrayList();
// 添加元素,使用add()
li.add("a");
li.add("b");
li.add("c");
li.add("d");
//将索引为2的元素修改成X
li.set(2, "x");
System.out.println(li);
}
}
运行输出:[a, b, x, d]
5.用List方法遍历自定义对象
这里继续利用到前面的Student.java
package list;
import java.util.ArrayList;
import java.util.List;
import collection.Student;
public class Demo1_List {
public static void main(String[] args) {
List li = new ArrayList();
// 添加元素,使用add()
li.add(new Student("张三", 23));
li.add(new Student("李四", 24));
li.add(new Student("王五", 25));
li.add(new Student("刘六", 26));
li.add(new Student("小七", 27));
// 通过get(index)遍历
for(int i=0; i<li.size(); i++) {
//将Object对象向下转型为Student对象
Student s = (Student)li.get(i);
//拿到学生姓名和年龄
System.out.println("Name: "+s.getName()+"...Age: "+ s.getAge());
}
}
}
输出:
Name: 张三...Age: 23
Name: 李四...Age: 24
Name: 王五...Age: 25
Name: 刘六...Age: 26
Name: 小七...Age: 27