查阅API,看List的介绍。有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。
看完API,我们总结一下:
List接口:
- 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
- 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
- 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List接口的常用子类有:
- ArrayList集合(线程不安全)
- LinkedList集合(线程不安全)
- Vector集合(线程安全)
List接口的常用方法:
public class ListDemo01 { public static void main(String[] args) { function2(); } /* * set(int index,E) * 修改指定索引上的元素 * 返回被修改之前的元素 */ public static void function2(){ List<Double> list = new ArrayList<>(); list.add(1.1); list.add(1.2); list.add(1.3); list.add(1.4); double d=list.set(0, 9.0); /* * 与add(index,ele)不同 不能这样添加元素 * java.lang.IndexOutOfBoundsException: */ double d1=list.set(4,2.0);//这一句会报 java.lang.IndexOutOfBoundsException: System.out.println(d1+"==="+list); } /* * * E remove(int index) * 移除指定索引上的元素 * 返回被删除的元素 * */ public static void function1(){ List<Double> list = new ArrayList<>(); list.add(1.1); list.add(1.2); list.add(1.3); list.add(1.4); System.out.println(list.remove(1)); System.out.println(list); } /* * add(int index,E) * 将元素插入到列表的指定索引上 */ public static void function(){ List<String> list=new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); System.out.println(list); /*带有索引的操作 要注意索引越界的问题 * java.lang.IndexOutOfBoundsException */ list.add(5,"shsxt"); System.out.println(list); } }
List集合存储数据的结构:
List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。数据存储的常用结构有:堆栈、队列、数组、链表。
堆栈: 先进后出 栈的入口、出口的都是栈的顶端位置
队列: 先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素) 队列的入口、出口各占一侧。
数组: 查找快,增删慢, 数组元素在内存地址上是连续的
链表: 多个节点之间,通过地址进行连接 ,查找元素慢 ,增删元素快
List接口的实现类:
- ArrayList
ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
- LinkedList
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
1 package com.shsxt.lisa; 2 3 import java.util.LinkedList; 4 5 /* 6 * LinkedList 链表集合的特有功能 7 * 增删快 查询慢 底层是链表 8 * 9 * 子类的特有功能 不能使用多态 10 */ 11 public class LinkedListDemo01 { 12 13 public static void main(String[] args) { 14 function02(); 15 } 16 17 18 /* 19 * addFirst(E) 20 * addLast(E) 21 */ 22 public static void function() { 23 //子类的特有功能 不能使用多态 所以这里不能使用list 24 LinkedList<String> list = new LinkedList<String>(); 25 list.addLast("元首"); 26 list.add("001"); 27 list.add("002"); 28 29 list.addFirst("张二狗"); 30 System.out.println(list); 31 32 } 33 34 /* 35 * 36 * getFirst(E) getLast(E) 37 */ 38 public static void function02(){ 39 LinkedList<String> list = new LinkedList<String>(); 40 list.addLast("元首"); 41 list.add("001"); 42 list.add("002"); 43 /* 44 * 但是这个获取方式有一些弊端 思考下列场景 45 */ 46 list.clear();//将容器元素清空后 java.util.NoSuchElementException 47 //解决方法 if(link.size()!=0) 或者 if(link.isEmpty()) 48 System.out.println(list.getFirst()); 49 50 } 51 }
-
Vector集合
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。