Java ArrayList และ HashMap ได้ทันที

ใครช่วยกรุณายกตัวอย่างการสร้าง Java ArrayList และ HashMap ได้ทันที ดังนั้นแทนที่จะทำ add() หรือ put() ให้ส่งข้อมูลเริ่มต้นสำหรับอาร์เรย์ / แฮชที่การสร้างอินสแตนซ์ของคลาสจริง ๆ หรือไม่

เพื่อเป็นตัวอย่าง สิ่งที่คล้ายกับ PHP เช่น:

$array = array (3, 1, 2);
$assoc_array = array( 'key' => 'value' );

person Steve M    schedule 12.05.2009    source แหล่งที่มา
comment
คุณกำลังขอไวยากรณ์เกี่ยวกับวิธีการทำเช่นนั้นหรือตัวอย่างในโลกแห่งความเป็นจริงว่าทำไมคุณถึงต้องการ?   -  person Bill the Lizard    schedule 12.05.2009


คำตอบ (8)


วิธีที่ดีในการทำเช่นนี้คือการใช้ List.of() และ Map.of() (ตั้งแต่ Java 8):

List<String> list = List.of("A", "B", "C");
    
Map<Integer, String> map = Map.of(1, "A",
                                  2, "B",
                                  3, "C");

Java 7 และรุ่นก่อนหน้าอาจใช้ Google Collections:

List<String> list = ImmutableList.of("A", "B", "C");

Map<Integer, String> map = ImmutableMap.of(
  1, "A",
  2, "B",
  3, "C");
person Steve McLeod    schedule 12.05.2009
comment
500kB เป็นราคาที่สูงที่ต้องจ่ายเพียงเพื่อทำเช่นนั้น หากสิ่งเดียวที่ต้องการคือการเติมคอลเลกชั่นได้ทันที คำตอบที่ยอมรับได้คือ IMHO ที่อร่อยที่สุด - person Damien B; 12.05.2009
comment
อีกเหตุผลที่ไม่ชอบแนวทางนี้ก็คือ มันเป็นรายการที่ไม่เปลี่ยนรูป แม้ว่าฉันจะเดา (โดยไม่ได้อ่านเอกสารประกอบ) ว่ามีรายการที่ไม่แน่นอนหรือไม่ - person cgp; 12.05.2009
comment
การออกแบบเปลี่ยนแปลงไม่ได้! แต่ใช่ มีตัวเลือกอื่นด้วย หากไม่เปลี่ยนรูปแบบ คุณสามารถแชร์หนึ่งอินสแตนซ์ระหว่างเธรด และระหว่างคำขอทางเว็บได้อย่างง่ายดาย 500 Kb เป็นราคาที่ต้องจ่ายสูง แต่มีสินค้าอื่นๆ อีกมากมายใน Google Collectons ซึ่งคุ้มค่าที่จะจ่าย - person Steve McLeod; 12.05.2009
comment
@Damien- ยุติธรรมเพียงพอ แต่ไม่มีอะไรหยุดผู้ใช้จากการเขียนวิธีนี้ในเวอร์ชันของตนเอง - person Philip Guin; 14.12.2012
comment
Map.of เป็นคุณสมบัติ Java 9 ไม่ใช่ 8! - person vahid kh; 20.06.2021

อาร์เรย์สามารถแปลงเป็น Lists:

List<String> al = Arrays.asList("vote", "for", "me"); //pandering

โปรดทราบว่าสิ่งนี้ ไม่ ส่งคืน ArrayList แต่เป็นอินสแตนซ์ List โดยพลการ (ในกรณีนี้คือ Array.ArrayList)!

แนวทางของบรูโนได้ผลดีที่สุดและสามารถพิจารณาได้ทันทีสำหรับแผนที่ ฉันชอบวิธีอื่นสำหรับรายการ (ดูด้านบน):

Map<String,String> map = new HashMap<String,String>() {
 {
    put("key1", "value1");
    put("key2", "value2");
 }
};
person cgp    schedule 12.05.2009
comment
ได้รับการเตือน Arrays.asList จะไม่ส่งคืน java.util.ArrayList แต่เป็น java.util.Arrays$ArrayList! - person user85421; 12.05.2009

สำหรับรายการสั้นๆ:

    List<String> ab = Arrays.asList("a","b");
person Andreas Petersson    schedule 12.05.2009
comment
ไม่ได้จริงๆ.. จาก java.util.Arrays.java: public static ‹T› List‹T› asList(T... a) { return new ArrayList‹T›(a); } ดังนั้นจึงส่งคืน ArrayList ที่กำหนดไว้ล่วงหน้า - person Andreas Petersson; 12.05.2009
comment
ดูแหล่งที่มาเพิ่มเติม Arrays มีคลาส ArrayList ภายในของตัวเองซึ่งไม่รองรับ add() หรือ Remove() - person Michael Myers; 12.05.2009
comment
และจากเอกสารประกอบของ asList: ส่งคืนรายการขนาดคงที่ที่สนับสนุนโดยอาร์เรย์ที่ระบุ - person user85421; 12.05.2009

ใช้ตัวเริ่มต้นที่ไม่ระบุชื่อที่ดี:

List<String> list = new ArrayList<String>() {{
    add("a");
    add("b");
}};

เหมือนกันสำหรับแผนที่:

Map<String, String> map = new HashMap<String, String>() {{
    put("a", "a");
    put("b", "b");
}};

ฉันพบว่าสิ่งนี้หรูหราและอ่านง่ายที่สุด

วิธีอื่นๆ จำเป็นต้องสร้างอาร์เรย์ก่อน จากนั้นจึงแปลงเป็นรายการ ซึ่งแพงเกินไปในรสนิยมของฉัน และอ่านได้น้อยกว่า

person Yuval Adam    schedule 12.05.2009

สำหรับรายการ คุณสามารถใช้ Arrays.asList เช่นนี้:

List<String> stringList = Arrays.asList("one", "two");
List<Integer> intList = Arrays.asList(1, 2);

สำหรับ Maps คุณสามารถใช้สิ่งนี้:

public static <K, V> Map<K, V> mapOf(Object... keyValues) {
    Map<K, V> map = new HashMap<>();

    K key = null;
    for (int index = 0; index < keyValues.length; index++) {
        if (index % 2 == 0) {
            key = (K)keyValues[index];
        }
        else {
            map.put(key, (V)keyValues[index]);
        }
    }

    return map;
}

Map<Integer, String> map1 = mapOf(1, "value1", 2, "value2");
Map<String, String> map2 = mapOf("key1", "value1", "key2", "value2");

หมายเหตุ: ใน Java 9 คุณสามารถใช้ Map.of
หมายเหตุ 2: Double Brace Initialization สำหรับการสร้าง HashMaps ตามที่แนะนำในคำตอบอื่น ๆ คำเตือน

person R. Oosterholt    schedule 23.05.2017

คุณหมายถึงแบบนี้เหรอ?

public List<String> buildList(String first, String second)
{
     List<String> ret = new ArrayList<String>();
     ret.add(first);
     ret.add(second);
     return ret;
}

...

List<String> names = buildList("Jon", "Marc");

หรือคุณสนใจตัวสร้าง ArrayList ซึ่งใช้ Collection<? extends E> หรือไม่? ตัวอย่างเช่น:

String[] items = new String[] { "First", "Second", "Third" };
// Here's one way of creating a List...
Collection<String> itemCollection = Arrays.asList(items);
// And here's another
ArrayList<String> itemList = new ArrayList<String>(itemCollection);
person Jon Skeet    schedule 12.05.2009
comment
การปรับปรุงเล็กน้อยตามคำแนะนำของ Jon: ใช้ได้กับไอเท็มจำนวนเท่าใดก็ได้: public List‹String› buildList(String... items) { return new ArrayList‹String›(Arrays.asList(items)); } - person Steve McLeod; 12.05.2009
comment
(โค้ดตัวอย่างอาจทำให้ง่ายขึ้นเล็กน้อยโดยการใช้ varags Arrays.asList(); stackoverflow.com/questions/258954/) - person Jonik; 12.05.2009
comment
ฉันกำลังแสดงขั้นตอนแยกกันเพื่อให้ชัดเจนว่าต้องทำอย่างไรเมื่อคุณมีอาร์เรย์อยู่แล้ว - person Jon Skeet; 12.05.2009
comment
ทำไมไม่ใช้ var-args เพื่อให้คุณสามารถผ่านรายการจำนวนเท่าใดก็ได้ - person sal; 12.05.2009

แล้วเรื่องนี้ล่ะ?

ArrayList<String> array = new ArrayList<String>(Arrays.asList("value1", "value2"));

ฉันรู้ว่าคำตอบหลายข้อให้วิธีแก้ปัญหาที่คล้ายกัน แต่ฉันคิดว่าคำตอบนี้แม่นยำกว่าและกระชับกว่าเล็กน้อย หากคุณมีค่าจำนวนมาก คุณอาจต้องการทำสิ่งนี้:

ArrayList<String> array = new ArrayList<String>(Arrays.asList(
    "value1",
    "value2",
    "value3",
    ...
));
person ahmadPH    schedule 01.04.2021

person    schedule
comment
แนวทางเหล่านี้เป็นสิ่งที่ดี แต่เนื้อหาสามารถแก้ไขได้หลังการสร้าง วิธีการที่ไม่เปลี่ยนรูปนั้นดีมาก! - person Steve McLeod; 12.05.2009
comment
บางครั้งมันก็เป็นอันตราย คุณจะได้รับการอ้างอิงถึงคลาสที่ปิดล้อมเนื่องจากคลาสภายในที่ไม่ระบุชื่อจะคงการอ้างอิงถึงออบเจ็กต์พาเรนต์ นี่อาจทำให้เกิดปัญหากับการรวบรวมขยะและการทำให้เป็นอนุกรม - person Andreas Petersson; 12.05.2009
comment
ฉันไม่ชอบการเริ่มต้นแบบ double-brace เลย เหตุใดจึงต้องสร้างคลาสภายในใหม่ (ไม่คงที่) ในเมื่อตัวเริ่มต้นอย่างง่ายก็ทำได้เช่นกัน - person Michael Myers; 12.05.2009
comment
ฉันคิดเสมอว่าวิธีการวงเล็บปีกกาแบบคู่นั้นดี (โดยเฉพาะสำหรับการสร้าง GUI) - แต่ความคิดเห็นเกี่ยวกับการอ้างอิงวัตถุหลักนั้นทำได้ดีมาก ดำเนินการด้วยความระมัดระวังที่นี่ อาจจะดีกว่าถ้าสร้างคลาสตัวสร้างแผนที่เล็กๆ ที่ยอมรับ vararg ของอ็อบเจ็กต์ (คีย์ ค่า ค่าคีย์ ฯลฯ...) - person Kevin Day; 13.05.2009
comment
มีปัญหาด้านประสิทธิภาพหรือไม่? ฉันหมายถึงคุณสร้างคลาสที่ไม่ระบุตัวตนในแต่ละครั้งซึ่งจะขยาย ArrayList หากคุณจะสร้างอินสแตนซ์ arraylist และแทนที่จะเพิ่มรายการเข้าไป คิดว่าประสิทธิภาพจะเจ๋งกว่า หรือคลาสนี้ปรากฏขึ้นหลังจากการคอมไพล์? - person degr; 09.07.2015
comment
หากคุณสร้างมันขึ้นมาแบบนี้ มันก็จะไม่สามารถทำให้เป็นซีเรียลไลซ์ได้อีกต่อไป! - person clankill3r; 11.08.2015