深入学习List集合

Java知己

Java List 是一个有序集合。Java List 是扩展 Collection 接口的接口。Java List 提供对可插入元素的位置的控制。您可以按索引访问元素,也可以搜索列表中的元素。


Java List

关于 Java List 的一些重要观点是;

  • Java List 接口是 Java Collections Framework 的成员。
  • List 允许您添加重复元素。
  • List 允许您拥有'null'元素。
  • List 接口在 Java 8 中有许多默认方法,例如 replaceAll,sort 和 spliterator。
  • 列表索引从 0 开始,就像数组一样。
  • List 支持泛型,我们应尽可能使用它。将 Generics 与 List 一起使用将在运行时避免 ClassCastException。

Java 列表类图

Java List 接口扩展了 Collection 接口。集合界面 externs Iterable 接口。一些最常用的 List 实现类是 ArrayList,LinkedList,Vector,Stack,CopyOnWriteArrayList。AbstractList 提供了 List 接口的骨干实现,以减少实现 List 的工作量。

Java 列表方法

一些有用的 Java List 方法是;

  1. int size():获取列表中元素的数量。
  2. boolean isEmpty():检查列表是否为空。
  3. boolean contains(Object o):如果此列表包含指定的元素,则返回 true。
  4. Iterator <E> iterator():以适当的顺序返回此列表中元素的迭代器。
  5. Object [] toArray():以适当的顺序返回包含此列表中所有元素的数组
  6. boolean add(E e):将指定的元素追加到此列表的末尾。
  7. boolean remove(Object o):从此列表中删除指定元素的第一个匹配项。
  8. boolean retainAll(Collection <?> c):仅保留此列表中包含在指定集合中的元素。
  9. void clear():从列表中删除所有元素。
  10. E get(int index):返回列表中指定位置的元素。
  11. E set(int index,E element):用指定的元素替换列表中指定位置的元素。
  12. ListIterator <E> listIterator():返回列表中元素的列表迭代器。
  13. List <E> subList(int fromIndex,int toIndex):返回指定 fromIndex(包含)和 toIndex(不包括)之间的此列表部分的视图。返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。

在 Java 8 中添加到 List 的一些默认方法是;

  1. default void replaceAll(UnaryOperator <E> 运算符):将此列表的每个元素替换为将运算符应用于该元素的结果。
  2. default void sort(Comparator <super E> c):根据指定的 Comparator 引发的顺序对此列表进行排序。
  3. default Spliterator <E> spliterator():在此列表中的元素上创建 Spliterator。

要列出的 Java 数组

我们可以使用 Arrays 类将数组视图作为列表。但是我们将无法对列表进行任何结构修改,它将抛出 java.lang.UnsupportedOperationException。所以最好的方法是使用 for 循环来迭代数组来创建列表。下面是一个简单的例子,展示了如何正确地将 java 数组转换为列表。

package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayToList {
    public static void main(String[] args) {
        String[] vowels = {"a","e","i","o","u"};
        List<String> vowelsList = Arrays.asList(vowels);
        System.out.println(vowelsList);
        /**
         * List is backed by array, we can't do structural modification
         * Both of the below statements will throw java.lang.UnsupportedOperationException
         */
        //vowelsList.remove("e");
        //vowelsList.clear();
        //using for loop to copy elements from array to list, safe for modification of list
        List<String> myList = new ArrayList<>();
        for(String s : vowels){
            myList.add(s);
        }
        System.out.println(myList);
        myList.clear();
    }
}
 
package com.journaldev.examples;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class ArrayToList {
 
    public static void main(String[] args) {
        
        String[] vowels = {"a","e","i","o","u"};
        
        List<String> vowelsList = Arrays.asList(vowels);
        System.out.println(vowelsList);
        
        /**
         * List is backed by array, we can't do structural modification
         * Both of the below statements will throw java.lang.UnsupportedOperationException
         */
        //vowelsList.remove("e");
        //vowelsList.clear();
                
        //using for loop to copy elements from array to list, safe for modification of list
        List<String> myList = new ArrayList<>();
        for(String s : vowels){
            myList.add(s);
        }
        System.out.println(myList);
        myList.clear();
    }
 
}

根据您的项目要求选择上述任何一种方法。

Java List to Array

一个简单的示例,显示将列表转换为数组的正确方法。

package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListToArray {
    public static void main(String[] args) {
        List<String> letters = new ArrayList<String>();
        // add example
        letters.add("A");
        letters.add("B");
        letters.add("C");
        //convert list to array
        String[] strArray = new String[letters.size()];
        strArray = letters.toArray(strArray);
        System.out.println(Arrays.toString(strArray)); //will print "[A, B, C]"
    }
}
 
package com.journaldev.examples;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class ListToArray {
 
    public static void main(String[] args) {
 
        List<String> letters = new ArrayList<String>();
 
        // add example
        letters.add("A");
        letters.add("B");
        letters.add("C");
        
        //convert list to array
        String[] strArray = new String[letters.size()];
        strArray = letters.toArray(strArray);
        System.out.println(Arrays.toString(strArray)); //will print "[A, B, C]"
    }
 
}

Java 列表排序

有两种方法可以对列表进行排序。我们可以使用 Collections 类进行自然排序,或者我们可以使用 List sort()方法并使用我们自己的 Comparator 进行排序。下面是 java 列表排序的一个简单示例。

package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class ListSortExample {
    public static void main(String[] args) {
        List<Integer> ints = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) ints.add(random.nextInt(1000));
        //natural sorting using Collections class
        Collections.sort(ints);
        System.out.println("Natural Sorting: "+ints);
        //My custom sorting, reverse order
        ints.sort((o1,o2) -> {return (o2-o1);});
        System.out.println("Reverse Sorting: "+ints);
    }
}
 
package com.journaldev.examples;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
 
public class ListSortExample {
 
    public static void main(String[] args) {
        
        List<Integer> ints = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) ints.add(random.nextInt(1000));
        
        //natural sorting using Collections class
        Collections.sort(ints);
        System.out.println("Natural Sorting: "+ints);
        
        //My custom sorting, reverse order
        ints.sort((o1,o2) -> {return (o2-o1);});
        System.out.println("Reverse Sorting: "+ints);
    }
}

下面给出了一个示例输出。由于我使用 Random 生成列表元素,因此每次都会有所不同。

Natural Sorting: [119, 273, 388, 450, 519, 672, 687, 801, 812, 939]
Reverse Sorting: [939, 812, 801, 687, 672, 519, 450, 388, 273, 119]
 
Natural Sorting: [119, 273, 388, 450, 519, 672, 687, 801, 812, 939]
Reverse Sorting: [939, 812, 801, 687, 672, 519, 450, 388, 273, 119]

Java 列表常见操作

在 java 列表上执行的最常见操作是添加,删除,设置,清除,大小等。下面是一个简单的 java 列表示例,显示了常用的方法用法。

package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListExample {
    public static void main(String args[]) {
        List<String> vowels= new ArrayList<String>();
        //add example
        vowels.add("A");
        vowels.add("I");
        //let's insert E between A and I
        vowels.add(1,"E");
        System.out.println(vowels);
        List<String> list = new ArrayList<String>();
        list.add("O");list.add("U");
        //appending list elements to letters
        vowels.addAll(list);
        System.out.println(vowels);
        //clear example to empty the list
        list.clear();
        //size example
        System.out.println("letters list size = "+vowels.size());
        //set example
        vowels.set(2, "E");
        System.out.println(vowels);
        //subList example
        vowels.clear();vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
        list = vowels.subList(0, 2);
        System.out.println("letters = "+vowels+", list = "+list);
        vowels.set(0, "A");
        System.out.println("letters = "+vowels+", list = "+list);
        list.add("U");
        System.out.println("letters = "+vowels+", list = "+list);
    }
}
 
package com.journaldev.examples;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class ListExample {
 
    public static void main(String args[]) {
        List<String> vowels= new ArrayList<String>();
        
        //add example
        vowels.add("A");
        vowels.add("I");
        
        //let's insert E between A and I
        vowels.add(1,"E");
        System.out.println(vowels);
        
        List<String> list = new ArrayList<String>();
        list.add("O");list.add("U");
        
        //appending list elements to letters
        vowels.addAll(list);
        System.out.println(vowels);
        
        //clear example to empty the list
        list.clear();
        
        //size example
        System.out.println("letters list size = "+vowels.size());
        
        //set example
        vowels.set(2, "E");
        System.out.println(vowels);
        
        //subList example
        vowels.clear();vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
        list = vowels.subList(0, 2);
        System.out.println("letters = "+vowels+", list = "+list);
        vowels.set(0, "A");
        System.out.println("letters = "+vowels+", list = "+list);
        list.add("U");
        System.out.println("letters = "+vowels+", list = "+list);
        
        
    }
 
}

以上 java 列表示例程序的输出是;

[A, E, I]
[A, E, I, O, U]
letters list size = 5
[A, E, E, O, U]
letters = [E, E, I, O], list = [E, E]
letters = [A, E, I, O], list = [A, E]
letters = [A, E, U, I, O], list = [A, E, U]
[A, E, I]
[A, E, I, O, U]
letters list size = 5
[A, E, E, O, U]
letters = [E, E, I, O], list = [E, E]
letters = [A, E, I, O], list = [A, E]
letters = [A, E, U, I, O], list = [A, E, U]

Java List 迭代器

下面是一个简单的例子,展示了如何在 java 中迭代列表。

package com.journaldev.examples;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListIteratorExample {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<5; i++) list.add(i);
        Iterator<Integer> iterator = list.iterator();
        //simple iteration
        while(iterator.hasNext()){
            int i = (int) iterator.next();
            System.out.print(i + ", ");
        }
        System.out.println("\n"+list);
        //modification of list using iterator
        iterator = list.iterator();
        while(iterator.hasNext()){
            int x = (int) iterator.next();
            if(x%2 ==0) iterator.remove();
        }
        System.out.println(list);
        //changing list structure while iterating
        iterator = list.iterator();
        while(iterator.hasNext()){
            int x = (int) iterator.next(); //ConcurrentModificationException here
            if(x==1) list.add(10);
        }
    }
}
 
package com.journaldev.examples;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class ListIteratorExample {
 
    public static void main(String[] args) {
 
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<5; i++) list.add(i);
        
        Iterator<Integer> iterator = list.iterator();
        
        //simple iteration
        while(iterator.hasNext()){
            int i = (int) iterator.next();
            System.out.print(i + ", ");
        }
        System.out.println("\n"+list);
        
        //modification of list using iterator
        iterator = list.iterator();
        while(iterator.hasNext()){
            int x = (int) iterator.next();
            if(x%2 ==0) iterator.remove();
        }
        System.out.println(list);
        
        //changing list structure while iterating
        iterator = list.iterator();
        while(iterator.hasNext()){
            int x = (int) iterator.next(); //ConcurrentModificationException here
            if(x==1) list.add(10);
        }
    }
 
}

以上 java 列表迭代器程序的输出是;

0, 1, 2, 3, 4, 
[0, 1, 2, 3, 4]
[1, 3]
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.journaldev.examples.ListIteratorExample.main(ListIteratorExample.java:34)
 
0, 1, 2, 3, 4, 
[0, 1, 2, 3, 4]
[1, 3]
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.journaldev.examples.ListIteratorExample.main(ListIteratorExample.java:34)

这就是 Java 中 List 的快速综述。我希望这些 Java List 示例可以帮助您开始使用 List 集合编程。

关注公众号:「Java知己」,每天更新Java知识哦,期待你的到来!

  • 发送「1024」,免费领取 30 本经典编程书籍。
  • 发送「Group」,与 10 万程序员一起进步。
  • 发送「JavaEE实战」,领取《JavaEE实战》系列视频教程。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
Java知己
每日福利

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355