วิธีการเริ่มต้นวัตถุ List <String> ใน Java?


405

ฉันไม่สามารถเริ่มต้นรายการในรหัสต่อไปนี้:

List<String> supplierNames = new List<String>();
supplierNames.add("sup1");
supplierNames.add("sup2");
supplierNames.add("sup3");
System.out.println(supplierNames.get(1));

ฉันต้องเผชิญกับข้อผิดพลาดต่อไปนี้:

ไม่สามารถสร้างอินสแตนซ์ของประเภทได้ List<String>

ฉันจะยกตัวอย่างได้List<String>อย่างไร

คำตอบ:


733

หากคุณตรวจสอบAPIสำหรับListคุณจะสังเกตเห็นมันพูดว่า:

Interface List<E>

เป็นinterfaceวิธีที่ไม่สามารถยกตัวอย่าง (ไม่new List()เป็นไปได้)

หากคุณตรวจสอบลิงก์นั้นคุณจะพบว่ามีบางอย่างclassที่ใช้งานได้List:

คลาสการใช้งานที่รู้จักทั้งหมด:

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack,Vector

สิ่งเหล่านั้นสามารถถูกสร้างขึ้นมาได้ ใช้ลิงก์ของพวกเขาเพื่อทราบข้อมูลเพิ่มเติมเกี่ยวกับพวกเขา IE: เพื่อทราบว่าสิ่งใดเหมาะสมกับคุณมากกว่า

3 ตัวที่ใช้บ่อยที่สุดน่าจะเป็น:

 List<String> supplierNames1 = new ArrayList<String>();
 List<String> supplierNames2 = new LinkedList<String>();
 List<String> supplierNames3 = new Vector<String>();

โบนัส:
นอกจากนี้คุณยังสามารถสร้างอินสแตนซ์ด้วยค่าในวิธีที่ง่ายขึ้นโดยใช้เครื่องหมายArrays classดังนี้:

List<String> supplierNames = Arrays.asList("sup1", "sup2", "sup3");
System.out.println(supplierNames.get(1));

แต่โปรดทราบว่าคุณไม่ได้รับอนุญาตให้เพิ่มองค์ประกอบเข้าไปในรายการดังfixed-sizeกล่าว


1
Arrays.asList ยอดเยี่ยม แต่อย่างที่คุณควรสังเกตุจากตอนนี้ไม่สามารถทำสิ่งที่คาดหวังในกรณีเช่นint[] a = {1,2,3}; System.out.println(Arrays.asList(a)); // [[I@70cdd2]
Mr_and_Mrs_D

1
@JAIL นั่นไม่ใช่สิ่งที่เกิดขึ้น นั่นคือรายการขององค์ประกอบหนึ่งซึ่งองค์ประกอบหนึ่งเป็นอาร์เรย์ของ ints พฤติกรรมที่ต้องการน่าจะเป็นรายการขององค์ประกอบสามข้อ 1, 2 และ 3
Christoffer Hammarström

1
@Christoffer Hammarströmเพื่อพิมพ์รายการหรืออาร์เรย์คุณสามารถใช้ java.util.Arrays.toString (array); ดังนั้นคุณสมบัตินี้จะได้รับ ..
Maxr1998

1
การใช้เวกเตอร์ลักษณะนี้และที่นี่แตกต่างกันบ้าง เนื่องจากปัญหาเธรด
Nuno Rafael Figueiredo

3
หากคุณต้องการรายการผลลัพธ์ให้ArrayListใช้new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"))
Daniel F

114

ไม่สามารถยกตัวอย่างอินเทอร์เฟซได้ แต่มีการใช้งานน้อย:

JDK2

List<String> list = Arrays.asList("one", "two", "three");

JDK7

//diamond operator
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");

JDK8

List<String> list = Stream.of("one", "two", "three").collect(Collectors.toList());

JDK9

// creates immutable lists, so you can't modify such list 
List<String> immutableList = List.of("one", "two", "three");

// if we want mutable list we can copy content of immutable list 
// to mutable one for instance via copy-constructor (which creates shallow copy)
List<String> mutableList = new ArrayList<>(List.of("one", "two", "three"));

พลัสมีจำนวนมากวิธีการอื่น ๆ ที่จัดทำโดยห้องสมุดอื่น ๆ เช่นฝรั่ง

List<String> list = Lists.newArrayList("one", "two", "three");

38

รายการคืออินเทอร์เฟซคุณไม่สามารถยกตัวอย่างอินเทอร์เฟซเนื่องจากอินเทอร์เฟซเป็นแบบแผนวิธีการใดควรมีคลาสของคุณ ในการเริ่มต้นอินสแตนซ์คุณต้องมีการรับรู้ (การใช้งาน) ของอินเทอร์เฟซนั้น ลองรหัสด้านล่างด้วยการใช้งานที่เป็นที่นิยมมากของ List interface

List<String> supplierNames = new ArrayList<String>(); 

หรือ

List<String> supplierNames = new LinkedList<String>();

14

คุณจะต้องใช้ArrayList<String>หรือเช่น

List<String> เป็นส่วนต่อประสาน

ใช้สิ่งนี้:

import java.util.ArrayList;

...

List<String> supplierNames = new ArrayList<String>();

13

รายการเป็นส่วนต่อประสานและคุณไม่สามารถเริ่มต้นส่วนต่อประสานได้ ยกตัวอย่างการนำคลาสมาใช้แทน

ชอบ:

List<String> abc = new ArrayList<String>();
List<String> xyz = new LinkedList<String>();

9

รายการเป็นเพียงส่วนต่อประสานหมายถึงรายชื่อทั่วไปบางรายการ คุณต้องจัดทำอินเทอร์เฟซสำหรับรายการนี้ สองที่พบบ่อยที่สุดคือ:

ArrayList - รายการที่นำไปใช้กับอาร์เรย์

List<String> supplierNames = new ArrayList<String>();

LinkedList - รายการที่นำมาใช้เช่นสายโซ่ขององค์ประกอบที่เชื่อมต่อกัน

List<String> supplierNames = new LinkedList<String>();

9

ในกรณีส่วนใหญ่คุณต้องการความเรียบง่ายArrayList- การนำไปปฏิบัติList

ก่อน JDK เวอร์ชั่น 7

List<String> list = new ArrayList<String>();

JDK 7 และใหม่กว่าคุณสามารถใช้ตัวดำเนินการไดมอนด์

List<String> list = new ArrayList<>();

ข้อมูลเพิ่มเติมสามารถเขียนได้ที่นี่เอกสารของ Oracle - ของสะสม


7

รายการที่คุณต้องการใช้ขึ้นอยู่กับประเภทรายการที่คุณต้องการ

List<String> supplierNames = new ArrayList<String>();

คุณควรจะไป

รายการคืออินเทอร์เฟซ ArrayList เป็นหนึ่งในการนำไปปฏิบัติของส่วนต่อประสานรายการ การใช้งานอื่น ๆ ที่อาจจะเหมาะกับความต้องการของคุณได้ดีขึ้นสามารถพบได้โดยการอ่านJavaDocs ของอินเตอร์เฟซรายการ


7

หากคุณต้องการสร้างการเปลี่ยนรูปไม่ได้ List<T>โดยมีเพียงวัตถุเดียวในนั้นคุณสามารถใช้ API นี้:

List<String> oneObjectList = Collections.singletonList("theOnlyObject”);

ข้อมูลเพิ่มเติม: เอกสาร


5

รายการคือส่วนต่อประสาน คุณไม่สามารถใช้รายการเพื่อเริ่มต้นได้

  List<String> supplierNames = new ArrayList<String>();

เหล่านี้คือบางส่วนของชั้นเรียนที่ถูกใส่รายการ

ArrayList, LinkedList, Vector

คุณสามารถใช้สิ่งนี้ตามความต้องการของคุณ แต่ละคลาสเหล่านี้มีคุณสมบัติของตัวเอง


การใช้เวกเตอร์ลักษณะนี้และที่นี่แตกต่างกันบ้าง เนื่องจากปัญหาเธรด
Nuno Rafael Figueiredo

3

ในกรณีที่มีคนยังคงอ้อยอิ่งอยู่กับคำถามนี้ เพราะฉันเห็นผู้ใช้ใหม่หนึ่งหรือสองคนถามคำถามเดียวกันอีกครั้งและทุกคนก็บอกว่าไม่คุณไม่สามารถทำได้รักอย่างรอบคอบนอกเหนือจากคำตอบทั้งหมดที่ให้ไว้ที่นี่ฉันต้องการให้ข้อมูลเพิ่มเติม - ใช่คุณสามารถทำได้จริง ทำรายการรายการ = รายการใหม่ (); แต่ค่าใช้จ่ายในการเขียนการใช้งานของวิธีการทั้งหมดของอินเทอร์เฟซ ความคิดไม่ได้เป็นเพียง List list = new List (); แต่

List<Integer> list = new List<Integer>(){

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }

..... และอื่น ๆ (ไม่สามารถเขียนวิธีการทั้งหมดได้)

นี่คือตัวอย่างของชั้นไม่ประสงค์ออกนาม ถูกต้องเมื่อมีคนระบุว่าคุณไม่สามารถยกตัวอย่างอินเทอร์เฟซและมันถูกต้อง แต่คุณไม่สามารถพูดได้คุณต้องเขียน list list = new List (); แต่เห็นได้ชัดว่าคุณสามารถทำเช่นนั้นและที่เป็นคำสั่งอย่างหนักเพื่อให้ได้ว่าคุณไม่สามารถทำ


Listแม้ว่าจะเป็นที่ชัดเจนนี้ไม่ได้สร้างวัตถุที่มีชนิดที่เกิดขึ้นจริงเป็น ค่อนข้างจะประกาศคลาสใหม่ที่ไม่มีชื่อและการปฏิบัติListและในเวลาทำงานสร้างวัตถุใหม่ของคลาสที่ประกาศใหม่
Radiodef

0

เราสร้างSoyuz-toเพื่อทำให้ง่ายขึ้น 1 ปัญหา: วิธีการแปลงXเป็นY(เช่นStringเป็นInteger) การสร้างของวัตถุนอกจากนี้ยังมีชนิดของการแปลงจึงมีฟังก์ชั่นที่ง่ายต่อการสร้างMap, List, Set:

import io.thedocs.soyuz.to;

List<String> names = to.list("John", "Fedor");

กรุณาตรวจสอบ - มันมีคุณสมบัติที่มีประโยชน์อื่น ๆ อีกมากมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.