说明:
List是Collection的子接口,所以Collection中定义的那些方法List都能用
又因为List中的元素是有序的,所以List增加了有关索引的方法,这是Collection当中没有的,因为Collection还要兼顾Set,Set中又没有索引。
注意:ArrayList是典型的数组替换结构,凡是以前用数组的地方,全部可以替换成ArrayList,包括项目当中
索引和数组中的规定一样,因为底层就是用数组实现的,仍然从0开始
常用方法:
1)void add(int index, Object ele):在index位置插入ele元素
2)boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
3)Object get(int index):获取指定index位置的元素
4)int indexOf(Object obj):返回obj在集合中首次出现的位置 ,如果没有就返回-1
5)int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置 ,如果没有就返回-1
6)Object remove(int index):移除指定index位置的元素,并返回此元素
注意:Collection中的remove是删除某个元素,这里是方法的重载而不是方法的重写 ,因为方法名一样,但形参类型不一样,在List中也可以按照对象去删除
7)Object set(int index, Object ele):设置指定index位置的元素为ele
8)List subList(int fromIndex, int toIndex):返回从[fromIndex到toIndex )位置的子集合,本身的list没有变化
public class Test{
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
list.add(new Person("Tom",12));
list.add(456);
System.out.println(list);//[123, 456, AA, Person [name=Tom, age=12], 456]
//void add(int index, Object ele)
list.add(1, "BB");
System.out.println(list);//[123, BB, 456, AA, Person [name=Tom, age=12], 456]
//boolean addAll(int index, Collection eles)
List list1=Arrays.asList(1,2,3);
list.addAll(list1);
//list.add(list1);//不会报错,是把list1整体当做一个元素,此时如果调用size方法结果为7
//System.out.println(list);//[123, BB, 456, AA, Person [name=Tom, age=12], 456, [1, 2, 3]]
System.out.println(list);//[123, BB, 456, AA, Person [name=Tom, age=12], 456, 1, 2, 3]
System.out.println(list.size());//9
int index=list.indexOf("AA");
System.out.println(index);//3
Object obj=list.remove(0);
System.out.println(obj);//123
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
List遍历的方式
1)Iterator迭代器方式
2)增强for循环
3)普通的循环也可以,因为有索引
ArrayList list=new ArrayList();
list.add(123);
list.add(456);
list.add("AA");
//方式一
Iterator iterator=list.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
//方式二
for(Object obj:list) {
System.out.println(obj);
}
//方式三
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
remove的一个问题:
public class Test{
public static void main(String[] args) {
List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);//[1, 2]
}
public static void updateList(List list) {
list.remove(2);
}
}
public class Test{
public static void main(String[] args) {
List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);//[1, 3]
}
public static void updateList(List list) {
list.remove(new Integer(2));
}
}
第一种情况下调用的是List中的remove方法,第二种情况下调用的是Collection中的remove方法,
add(1),会进行自动装箱操作,所以第一种情况下是删掉索引值为2的元素,remove(2)中的2不会进行自动装箱,因为有一种remove方法的参数就是int类型,不会去进行自动装箱,所以这里的2是指索引值,第二种情况下就是包装类,就是删除指定的元素