JAVA基础之List接口
个人理解:
list接口是Collection接口的子类,其继承了Collection接口的所有方法,但也有其独有的方法,不过在迭代的时候不要进行任何操作。牢记数据存储的四种结构:堆栈、队列、数组、链表,并指导其区别和适合用于什么场景下。特别注意的是LinedList接口中判断是否为空的时是判断的里面元素是否为空,只有当定义的时候(new)为Null才表示该集合不存在的,是空指针异常的。至于Vector集合,了解其被ArrayList代替了,其迭代方法(枚举:Enumeration)被Iterator代替。
一、List接口介绍:
1、List接口是Collection接口的子类;
2、它是一个元素存取有序的集合(不是正序和倒序的,是怎么存就怎么取);
3、它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组中的索引是一个道理);
4、集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素;
5、常用的子类有:ArrayList集合、LinkedList集合。
二、LIst集合中常用的方法:
import java.util.ArrayList; import java.util.List; public class Demo01 { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("123"); list.add("abs"); //指定位置插入 list.add(1,"456"); //删除指定位置的元素 String s=list.remove(1); System.out.println("删除的元素为:"+s); //替换指定位置上的元素 String str=list.set(0, "小明"); System.out.println("替换的元素为:"+str); //遍历 for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }
1、增加元素方法
①、 add(Object e):向集合末尾处,添加指定的元素
②、add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移
二、 删除元素删除
①、 remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素
②、 remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素
三、替换元素方法
①、set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素
四、 查询元素方法
①、 get(int index):获取指定索引处的元素,并返回该元素
三、Iterator的并发修改异常:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Demo02 { public static void main(String[] args) { List<String> arr=new ArrayList<String>(); arr.add("a"); arr.add("b"); arr.add("c"); //遍历时判断是否有b,有的话添加个d //获取迭代器对象 Iterator<String> it=arr.iterator(); while(it.hasNext()){ String s=it.next(); if(s.equals("b")){ arr.add("d"); } } } }
运行时会出现 java.util.ConcurrentModificationException!
解决办法:在迭代时,不要使用集合的方法操作元素;
那么想要在迭代时对元素操作咋办?通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况。
四、List集合存储数据的结构:
数据存储的常用结构:堆栈、队列、数组、链表。
1、堆栈:
先进后出(堆栈的入口、出口都是堆栈的顶端位置);存元素为压栈,取元素为弹栈。
2、队列:
先进先出(队列的入口、出口各占一侧)。
3、数组(长度不可变):
查找元素快(通过索引)、增删元素慢(需要创建新的数组)。
4、链表(多个节点之间,通过地址进行连接):
查找元素慢(需要通过连接的节点,一次向后查找)、增删元素快
五、ArrayList集合:
ArrayList集合数据存储的结构是数组结构(适合查询的时候用);
六、LinkedList集合:
LinedList集合数据存储的结构是链表结构(适合增删的时候用);
import java.util.LinkedList; public class Demo03 { public static void main(String[] args) { LinkedList<String> arr=new LinkedList<String>(); arr.addFirst("a"); arr.addFirst("b"); arr.addLast("c"); arr.addLast("d"); /*for(String s:arr){ System.out.println(s); }*/ //获取集合中第一个元素 System.out.println("集合中第一个元素为:"+arr.getFirst()); //获取最后一个 System.out.println("集合中最后一个元素为:"+arr.getLast()); //删除第一个 arr.removeFirst(); arr.removeFirst(); //删除最后一个 arr.removeLast(); for(String s:arr){ System.out.println(s); } //集合里不为空时打印 if(!arr.isEmpty()){ System.out.println("该集合不为空"); } } }
七、Vector集合
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。
Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。