List和Set
Collection有很多子接口,其中,最常用的就是List和Set。List和Set都是接口。List是列表,Set是集。
List是可重复的集合,可以通过索引值对元素进行操作。Set是不能重复的集合。
List
List使用
List的父接口是Collection,所以Collection中的方法List都能使用。现在来看看List特有的常见方法,这些方法有一个共性特点,就是都可以操作角标。
List特有的常见方法:
1) 添加
void add(int index, E element) 在指定位置插入指定元素
boolean addAll(int index, Collection<? extends E> c) 在指定位置插入指定集合中的元素
2) 删除
E remove(int index) 删除指定位置的元素,返回被删除的元素
3) 修改
E set(int index, E element) 修改指定位置的元素,返回被修改之前的元素
4) 获取
E get(int index) 获取指定位置的元素
int indexOf(Object o) 获取某个元素首次出现的索引
int lastIndexOf(Object o) 获取某个元素最后出现的索引
List<E> subList(int fromIndex, int toIndex) 获取子列表,从fromIndex(包含)到toIndex(不包含)的元素
package com.java.base;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ListDemo {
public static void main(String[] args) throws IOException {
List list = new ArrayList();
list.add("Hadoop");
list.add("Spark");
list.add("Flink");
//show01(list);
//show02(list);
//show03(list);
show04(list);
}
private static void show04(List list){
//ListIterator列表迭代器,List中特有的一种迭代方式
//ListIterator可以向任意一个方向开始遍历List,可以使用列表迭代器在迭代的同时操作list集合
ListIterator it = list.listIterator();
//从下一个方向开始遍历
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("Hadoop")){
it.add("Storm");
}
System.out.println(obj);
}
System.out.println("-------------------");
//从前一个方向开始遍历
while(it.hasPrevious()){
System.out.println(it.previous());
}
System.out.println(list);
}
private static void show03(List list){
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("Hadoop")){
list.add("Storm");
//Exception in thread "main" java.util.ConcurrentModificationException
//list/it同时操作集合产生的问题,解决的办法是可以用迭代器操作List集合中的元素
//Iterator不能做到,但是ListIterator可以做到
}
System.out.println(obj);
}
System.out.println(list);
}
private static void show02(List list){
//遍历List中元素方法一
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//List中可以使用get(index)方法获取指定位置的元素
System.out.println("get:"+list.get(0));
//遍历List中元素方法二
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
}
private static void show01(List list) {
// TODO Auto-generated method stub
System.out.println(list);
//在指定位置添加元素
list.add(1,"Storm");
//删除指定位置的元素,返回的是被删除的元素
System.out.println("remove:"+list.remove(1));
//修改,返回修改之前的元素
System.out.println("set:"+list.set(2, "Storm"));
//获取指定位置的元素
System.out.println("get:"+list.get(0));
//获取子列表
List list1 = list.subList(1, 3);
System.out.println("list1:"+list1);
System.out.println(list);
}
}
List接口中,子类有ArrayList、LinkedList。List接口中还有一个子类Vector。
Vector 类可以实现可增长的对象数组,它是同步的。从 Java 2 平台 v1.2 开始,此类改进为可以实现 List 接口,使它成为 Java Collections Framework (Java集合框架)的成员。增删,查询都很慢!现在
ArrayList是List 接口的大小可变数组的实现。它不是同步的,查询的速度快。ArrayList替代了Vector。
LinkedList与Vector 、ArrayList这两个类不同,它是List 接口的链接列表实现。它不是同步的。增删元素的速度很快。