集合Collection下面有两大子体系,List和Set,他们都是Collection接口的子接口。
- List:是有序的collection,这里的有序是指存入的顺序(qwer顺序存入,取出顺序也是qwer),所以List接口和它的子类都有索引(角标)。并且List中元素可以重复。
- set:无序的collection,元素不能重复。
List常见方法
List继承了Collection接口,所以Collection接口包含的方法List中都有,但是还有一些List特有的方法,这些方法有一个共性的特点就是可以操作角标。
1. 添加
void add(index, element):在列表的指定位置添加元素
boolean addAll(index, collection):在列表的指定位置添加Collection集合的所有元素。
2. 删除
Object remove(int index):一处列表中指定位置的元素。
3. 修改
E set(int index, E element):用指定元素替换列表中指定位置的元素,返回以前在指定位置的元素
4. 获取
Object get(int index):返回列表中指定位置的元素
int indexOf(Object o):返回列表中第一次出现指定元素的索引,如果此列表不包含指定元素,返回-1
int lastIndexOf(Object o):返回列表中最后一次出现指定元素的索引,如果不包含指定元素,返回-1
List subList(int fromIndex, int toIndex):返回fromIndex(包括)和toIndex(不包括)之间的视图。
例:
//注意:List在java中的java.awt和java.util包中都有这个名字,注意不要导错包
List li = new ArrayList();
li.add("abc1");
li.add("abc2");
li.add("abc3");
li.add("abc4");
System.out.println(li);
li.add(1, "abc5");
System.out.println(li);
System.out.println(li.remove(1));
System.out.println(li);
System.out.println(li.set(1, "abc6"));
System.out.println(li);
System.out.println("--------------------");
System.out.println(li.get(2));
System.out.println(li.indexOf("abc6"));
System.out.println(li.subList(1, 2));
输出结果:
[abc1, abc2, abc3, abc4]
[abc1, abc5, abc2, abc3, abc4]
abc5
[abc1, abc2, abc3, abc4]
abc2
[abc1, abc6, abc3, abc4]
abc3
1
[abc6]
ListIterator迭代器
从Collection集合中继承的迭代器Iterator
List li = new ArrayList();
li.add("abc1");
li.add("abc2");
li.add("abc3");
li.add("abc4");
Iterator it = li.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
输出结果:
abc1
abc2
abc3
abc4
List集合特有的列表迭代器:ListIterator
//需求:如果迭代到abc2,就添加一个abc9,否则就打印出来
List i = new ArrayList();
i.add("abc1");
i.add("abc2");
i.add("abc3");
i.add("abc4");
Iterator it = i.iterator();
while(it.hasNext()){
Object obj = it.next();//add方法参数是Object类型的,不论传入什么类型的对象,都会类型提升为Object
if(obj.equals("abc2")){//使用Object中的equals方法,比较的是字符串常量地址值,字符串常量存在常量池中,如果要使用相同的字符串常量,会直接使用常量池中现有的字符串,不会新建
i.add("abc9");
}
else{
System.out.println(obj);
}
}
输出结果:
Exception in thread “main” java.util.ConcurrentModificationException
当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
因为在建立迭代器的时候集合中有4个对象,在使用迭代器过程中调用List集合的add方法增加一个对象,迭代器是不知道的。所以如果想要增加对象,需要使用迭代器来增加,但是Iterator迭代器并没有增加对象的方法,但是ListIterator列表迭代器中包含此方法。修改代码如下:
List i = new ArrayList();
i.add("abc1");
i.add("abc2");
i.add("abc3");
i.add("abc4");
ListIterator li = i.listIterator();
while(li.hasNext()){
Object obj = li.next();
if(obj.equals("abc2")){
li.add("abc9");
}
else{
System.out.println(obj);
}
}
System.out.println(i);
输出结果:
abc1
abc3
abc4
[abc1, abc2, abc9, abc3, abc4]
boolean hasPrevious():逆向遍历
E previous():返回列表中的前一个元素