List接口
如图,是左边这部分
List:有序,可重复
Set:无序,不可重复
1 List接口
1.1 特点
1)它是一个元素存取有序的集合。
2)它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3)集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
1.2常用方法
在指定位置添加元素add()
获取get(index)
删除remove()
替换set(index)
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import java.util.ArrayList; import java.util.List; public class ListTest1 { public static void main(String[] args) { List<String> list= new ArrayList<String>(); list.add( "a" ); list.add( "b" ); //在指定位置添加元素 list.add( 1 , "c" ); System.out.println(list); //遍历(通过下标获取) for ( int i= 0 ;i<list.size();i++){ System.out.print(list.get(i)+ " " ); } System.out.println(); //删除指定位置的元素 String str=list.remove( 1 ); System.out.println( "删除:" ); System.out.println(str); System.out.println(list); //替换指定位置上的元素 list.set( 1 , "z" ); System.out.println( "替换:" ); System.out.println(list); } } |
1.3 Iterator并发修改异常
在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorTest { public static void main(String[] args) { List<String> list= new ArrayList<String>(); list.add( "a" ); list.add( "b" ); list.add( "c" ); Iterator<String> it=list.iterator(); //获取迭代器对象 //循环遍历 while (it.hasNext()){ String s=it.next(); //如果有元素"b",那么再添加一个元素 if (s.equals( "b" )){ list.add( "d" ); } } } } |
所以用迭代器和增强for时,在遍历时不能对元素进行操作。想操作只能用普通for。
2集合存储数据的结构
List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。
数据存储的常用结构有:堆栈、队列、数组、链表。
2.1堆栈
特点:
1)先进后出
2)栈的入口、出口的都是栈的顶端位置
3)压栈:就是存元素
4)弹栈:就是取元素
2.2队列
特点:
1)先进先出
2)队列的入口、出口各占一侧。
2.3数组结构
特点:
1)查找元素快:因为有索引
2)增删元素慢:因为长度不可变,需要创建新数组
2.4链表
多个节点之间,通过地址进行连接。
有数据域和指针域,指针域中存是的下一个数据的地址。
特点:
1)查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
2)增删元素快(如下图):
增加元素:只需要修改连接下个元素的地址即可。
删除元素:只需要修改连接下个元素的地址即可。
3 ArrayList集合数据存储结构
ArrayList集合数据存储的结构是数组结构。
由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
看需求,是查询多,还是增删多。
4 LinkedList集合
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
4.1常用方法
1)添加
1 2 3 4 5 6 7 8 9 10 11 12 13 | import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> list= new LinkedList<Integer>(); list.add( 1 ); list.add( 2 ); list.addFirst( 3 ); list.addFirst( 4 ); list.addLast( 5 ); System.out.println(list); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> list= new LinkedList<Integer>(); list.addLast( 1 ); list.addLast( 2 ); list.add( 3 ); list.addFirst( 4 ); list.addFirst( 5 ); System.out.println(list); } } |
2)获取首尾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> list= new LinkedList<Integer>(); list.addLast( 1 ); list.addLast( 2 ); list.add( 3 ); list.addFirst( 4 ); list.addFirst( 5 ); System.out.println(list); System.out.println( "第一个是" +list.getFirst()); System.out.println( "最后一个是" +list.getLast()); } } |
3)删除首尾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> list= new LinkedList<Integer>(); list.addLast( 1 ); list.addLast( 2 ); list.add( 3 ); list.addFirst( 4 ); list.addFirst( 5 ); System.out.println(list); list.removeLast(); list.removeFirst(); System.out.println( "删除后:" ); System.out.println(list); } } |
4)堆栈顺序存取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> list= new LinkedList<Integer>(); list.push( 1 ); list.push( 2 ); list.push( 3 ); list.push( 4 ); System.out.println(list.pop()); System.out.println(list.pop()); System.out.println(list.pop()); System.out.println(list.pop()); } } |
5)上面例子中,pop()方法,如果集合中没有元素了,再pop,就会报异常
所以要加个判断 list.size()!=0,也可以用isEmpty()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> list= new LinkedList<Integer>(); list.push( 1 ); list.push( 2 ); list.push( 3 ); list.push( 4 ); while (!list.isEmpty()){ System.out.println(list.pop()); } } } |
isEmpty()是从Collection继承来的
4.2 LinkedList和ArrayList的区别
1)ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。
2)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
5 Vector集合(过时,了解即可,和Iterator和ArrayList一样的)
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。
Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。
Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。
5.1 Vector常用方法
对比ArrayList:
elementAt()就是ArrayList中的get()
elements() 就是Iterator中获取对象的iterator() 方法
5.2 Enumeration枚举常用方法
对比Iterator:
hasMoreElements() 就是hasNext()
nextElement() 就是next()
5.3 Vector和ArrayList对比
Vector是同步的,安全,慢
ArrayList不同步,不安全,快
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步