与collection的继承图谱
![](https://i-blog.csdnimg.cn/blog_migrate/561f41f2837f51cc3d6c708385d3e9f0.png)
由图可知,集合vector,ArrayList ,LinkedList 都继承于父类AbstractList,并实现了list,间接实现了Collection,因此Collection中的方法所有的实现类都可以使用。
回顾Collection中的方法
增:add() addAll()
删:remove() removeAll()
改: 没有
查: contains(Object) containsAll(Object)
其它 size() isEmpty() iterator() toArray() (转成Object类型数组) toArray(T[]) (转成指定类型数组) clear() equals() hashCode() retainAll()
List中新增的方法
分析:list是接口,不能创建实例,只能通过实现类对其方法进行展示,ArrayList和vector,底层都是Object[] elementData;数组进行存储,而ArrayList完全是对数组不可变性的替代,
而数组最本质的特点就是有下标,因此查询和删除的效率比较高,但是增加和删除的效率比较低,因为下标,所以List接口中增加了许多与下标相关的方法。
List特点
有序:添加元素按照索引
不唯一:元素可以重复
List除了Collection中的方法新增加的方法
public class Test01 {
@Test
public void test02() {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("李四");
List<String> newList = new ArrayList<>();
newList.add("妲己");
newList.add("安琪拉");
newList.add("妲己");
//指定的位置插入集合
list.addAll(1, newList);
System.out.println("list = " + list);
int index = list.indexOf("妲己");
System.out.println("index = " + index);
获取指定元素最后一次出现的下标 没有数据返回-1
int index1 = list.lastIndexOf("妲己");
System.out.println("index1 = " + index1);
}
@Test
public void test01(){
List <String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("李四");
System.out.println("list = " + list);
list.add(1, "李白");
list.remove(2);
list.set(3, "武则天");
list.contains("武则天");
String s = list.get(3);
System.out.println("s = " + s);
}
}
增 1> add(index,ele) 在指定位置新增数据
addAll(index,newList) 指定的位置插入集合
删 2> remove(index) 删除指定下标的数据
改 3> set(index,ele) 修改/设置 指定下标的数据
查 4> contains(ele) 判断指定元素是否存在于集合内
containsAll() 判断一个集合中是否包含其他集合中的所有元素
get(index) 获取指定下标的数据
indexOf(ele); 获取第一次出现的下标 没有数据返回-1
lastIndexOf(ele); 获取指定元素最后一次出现的下标 没有数据返回-1
subList(int,int) 指定一个集合的子集合,从起始下标到结束下标
遍历 5> itetator()
listIterator() 可以倒叙遍历(list接口独有的)
排序方法 6> sort() 排序 如果是自定义类型一定要指明排序规则
12个 几乎都与下标有关系
List的所有遍历
public class BianLi {
//成员变量
List<String> list = new ArrayList<>();
@Before
public void test00(){
list.add("张三");//0
list.add("李四");//1
list.add("王五");//2
list.add("赵六");//3
list.add("安琪拉");//4
System.out.println("Before 执行了 ");
}
@Test
public void test06(){
//开发中的遍历方式
list.forEach(System.out::println);
}
@Test
public void test05(){
/*
list.listIterator(index);
从前向后遍历: 从指定的下标开始 向后一直到结束
从后向前遍历: 从指定下标-1 开始 向前一直到结束
*/
//可以直接将游标定位到指定位置
ListIterator<String> listIterator = list.listIterator(5);
/*
//可以将游标定位到最后
while (listIterator.hasNext()){
String next = listIterator.next();
System.out.println("next = " + next);
}*/
while (listIterator.hasPrevious()){
String previous = listIterator.previous();
System.out.println("previous = " + previous);
}
}
@Test
public void test04(){
// ListIterator 专门用于遍历 List接口下的集合
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()){
//获取当前元素的前一个元素的下标
int previousIndex = listIterator.previousIndex();
String next = listIterator.next();
//获取当前元素的后一个元素的下标
int nextIndex = listIterator.nextIndex();
System.out.println(previousIndex + " <-----ele = " + next + "--> "+nextIndex);
}
System.out.println("-------------------------------");
判断光标前是否有数据
while (listIterator.hasPrevious()){
String ele = listIterator.previous();
int previousIndex = listIterator.previousIndex();
System.out.println("ele = " + ele);
}
}
@Test
public void test03(){
//方式三 list有下标 普通遍历
for (int index = 0; index < list.size(); index++) {
String ele = list.get(index);
System.out.println("普通for遍历 = " + ele);
}
}
@Test
public void test02(){
//方式二 迭代器遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String ele = iterator.next();
System.out.println("迭代器遍历 = " + ele);
}
}
@Test
public void test01(){
//list遍历方式一
for (String s : list) {
System.out.println("增强for循环 = " + s);
}
}
}