集合之四:List接口

  查阅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替代。

原文地址:https://www.cnblogs.com/lotus-wmm/p/8443237.html