List
1.集合的体系
-------|Collection:单例集合的根接口。
------------|List:如果是实现了List接口的集合类,具备的特点:有序,可重复。
------------|Set:如果是实现了Set接口的集合类,具备的特点:无序,不可重复。
有序:集合的有序不是指自然顺序,而是指添加进去的顺序与元素出来的顺序是一致的。
栗子如下:
public class Demo1 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小张");
list.add("小李");
list.add("小王");
list.add("小赵");
list.add("小赵"); //有序可重复
System.out.println("集合的元素:"+list); //按照添加的顺序进行输出,有序
}
}
2.List接口中特有的方法(Collection中的方法都具备):
(1)添加
add(int index,E element):把元素添加到集合中指定索引的位置上。
addAll(int index,Collecion c):把list1的元素添加到list集合指定索引的位置上。
栗子如下:
public class Demo2 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小娃");
list.add("小胜");
list.add("小铁"); //把元素添加到集合的末尾处
list.add(1, "小能");
System.out.println("集合的元素:"+list);
List list1 = new ArrayList();
list1.add("小样");
list1.add("小四");
list.addAll(1, list1); //把list1的元素添加到list集合指定索引的位置上
System.out.println("集合的元素:"+list);
}
}
(2)获取
get(int index):根据索引值获取集合的元素。
indexOf(object o):找出指定元素第一次出现在集合中的索引值。
lastIndexOf(object o):找出指定元素最后一次出行在集合中的索引值。
subList(int fromIndex, int toIndex):指定开始与结束的索引值截取集合中的元素。
栗子如下:
public class Demo3 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小娃");
list.add("小胜");
list.add("小铁");
list.add("小丹");
System.out.println("get方法获取元素:"+list.get(1)); //根据指定的索引值获取集合中的元素
for(int i=0; i<list.size(); i++){
System.out.print(list.get(i) + " ");
}
System.out.println();
System.out.println("找出指定元素第一次出现在集合中的索引值:"+list.indexOf("小铁"));
System.out.println("找出指定元素最后一次出现在集合中的索引值:"+list.lastIndexOf("小铁"));
List subList = list.subList(1, 4); //指定开始与结束的索引值截取集合中的元素
System.out.println("子集合的元素:"+subList);
}
}
(3)修改
set(int index, E element):使用指定的元素替换指定索引值位置的元素。
public class Demo4 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小娃");
list.add("小胜");
list.add("小单");
list.set(1, "小四"); //使用指定的元素替换指定索引位置的元素
System.out.println("集合的元素:"+list);
}
}
(4)迭代
ListIterator():返回的是一个ListIterator迭代器对象。
ListIterator特有的方法:
hasPrevious();
previous();
add(E e);
set(E e);
public class Demo5 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小张");
list.add("小赵");
list.add("小王");
list.add("小刘");
ListIterator it = list.listIterator();
System.out.println("有上一个元素吗?"+it.hasPrevious()); //false
//System.out.println("获取上一个元素:"+it.previous()); //报错,此时指针在第一个位置
it.next();
System.out.println("获取上一个元素:"+it.previous()); //先向上移动一个单位,再获取元素
//死循环
/*while(it.hasNext()){
it.next(); //先取再移
System.out.println("元素:"+it.previous()); //先移再取
}*/
//遍历
while (it.hasNext()){
it.next();
}
while(it.hasPrevious()){
System.out.print(it.previous() + " "); //倒着遍历
}
System.out.println();
it.add("小样"); //必须有指针指向时才可以添加
it.next();
it.set("小能"); //替换当前指针指向的元素
System.out.println("集合的元素:"+list);
}
}
练习:使用四种方式遍历集合的元素
方式一:使用get方式遍历
方式二:使用迭代器正序遍历
方式三:使用迭代器逆序遍历
方式四:使用toArray数组
public class Demo6 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小三");
list.add("小四");
list.add("小五");
list.add("小六");
System.out.println("集合的元素:"+list);
//方式一:使用get遍历
for(int i=0; i<list.size(); i++){
System.out.print(list.get(i) + " ");
}
System.out.println();
//方式二:使用迭代器正序遍历
ListIterator it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
//方式三:使用迭代器倒序遍历
while(it.hasNext()){
it.next();
}
while(it.hasPrevious()){
System.out.print(it.previous() + " ");
}
System.out.println();
//方式四:使用toArray数组
Object[] objArr = list.toArray();
for(int i=0; i<objArr.length; i++){
System.out.print(objArr[i] + " ");
}
}
}
2.迭代器在遍历元素的时候要注意的事项:
(1)在迭代器迭代(遍历)元素的过程中,不允许使用集合对象改变集合中的元素个数(如:list.add(“aa”);list.remove(“aa”)),如果需要增加或删除,只能使用迭代器的方法进行操作。如果使用集合对象的方法改变集合中的元素个数,就会出现ConcurrentModificationException异常
public class Demo7 {
public static void main(String[] args){
List list = new ArrayList();
list.add("小三");
list.add("小四");
list.add("小五");
//获取到迭代器
ListIterator it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
it.add("aa"); //把元素添加到当前指针指向的后一个位置
}
System.out.println();
System.out.println("集合的元素:"+list);
}
}
(2)迭代元素的过程中:迭代器一旦创建到使用结束的时段。即list.add不能出现在获取迭代器语句(ListIterator it = list.listIterator();)和it.next()语句之间。