สร้างรายการ int ดั้งเดิมหรือไม่


97

มีวิธีสร้างรายการ primitive int หรือ primitives ใน java ดังต่อไปนี้หรือไม่?

List<int> myList = new ArrayList<int>();

ดูเหมือนว่าฉันสามารถทำได้ List myList = new ArrayList();

และเพิ่ม "int" ลงในรายการนี้ แต่นั่นหมายความว่าฉันสามารถเพิ่มอะไรก็ได้ในรายการนี้

เป็นทางเลือกเดียวของฉันคือสร้างอาร์เรย์ของ int และแปลงเป็นรายการหรือสร้างรายการวัตถุจำนวนเต็มหรือไม่


หากคุณกังวลเรื่องประสิทธิภาพการทำงานควรช่วยได้
assylias

เป็นไปได้ที่จะสร้างรายการโดยใช้อาร์เรย์พื้นฐาน แต่คุณต้องทราบขนาดของอาร์เรย์ที่จะเริ่มต้นและคุณจะสูญเสียฟังก์ชันอื่น ๆ ที่มาพร้อมกับวัตถุคอลเลกชัน แต่คุณสามารถทำบางสิ่งเช่น int [] array = new int [10];
Taylor

คำตอบ:


144

ใน Java ประเภทของตัวแปรใด ๆ อาจเป็นชนิดดั้งเดิมหรือชนิดอ้างอิง อาร์กิวเมนต์ประเภททั่วไปต้องเป็นประเภทอ้างอิง เนื่องจาก primitives ไม่ขยายObjectจึงไม่สามารถใช้เป็นอาร์กิวเมนต์ประเภททั่วไปสำหรับชนิด parametrized

ใช้Integerคลาสซึ่งเป็น wrapper แทนint:

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

หากคุณใช้ Java 7 คุณสามารถทำให้การประกาศนี้ง่ายขึ้นโดยใช้ตัวดำเนินการเพชร:

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

ด้วย autoboxing ใน Java ประเภทดั้งเดิมintจะกลายเป็นIntegerเมื่อจำเป็น

Autoboxing คือการแปลงอัตโนมัติที่คอมไพลเลอร์ Java สร้างขึ้นระหว่างประเภทดั้งเดิมและคลาสของตัวห่ออ็อบเจ็กต์ที่เกี่ยวข้อง

ดังนั้นสิ่งต่อไปนี้จึงถูกต้อง:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1

1
ดังนั้นวิธีการ JTable setSelectedIndices จึงเป็นสิ่งที่ไม่สมเหตุสมผล: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez

25

ไม่มีคอลเลกชันใด ๆ ที่สามารถมีประเภทดั้งเดิมได้เมื่อใช้ Java Collection Framework

อย่างไรก็ตามมีคอลเลกชัน Java อื่น ๆ ที่รองรับประเภทดั้งเดิมเช่นTrove , Colt , Fastutil , Guava

ตัวอย่างของอาร์เรย์ที่มี ints จะเป็นอย่างไรเมื่อใช้ Trove Library มีดังต่อไปนี้:

 TIntArrayList list= new TIntArrayList();

ประสิทธิภาพของรายการนี้เมื่อเปรียบเทียบกับ ArrayList of Integers จาก Java Collections นั้นดีกว่ามากเนื่องจากไม่จำเป็นต้องใช้ autoboxing / unboxing ไปยัง Integer Wrapper Class ที่เกี่ยวข้อง


1
ฉันไม่พบการใช้งานคอลเลกชันดั้งเดิมใน Guava ขอลิงค์หน่อยได้ไหม
nimcap

9

มีวิธีสร้างรายการของ int ดั้งเดิมหรือ primitive ใด ๆ ใน java

ไม่คุณทำไม่ได้ คุณสามารถสร้างรายการประเภทการอ้างอิงเช่นInteger, Stringหรือประเภทของคุณเอง

ดูเหมือนว่าฉันสามารถทำได้List myList = new ArrayList();และเพิ่ม "int" ลงในรายการนี้

เมื่อคุณเพิ่มลงintในรายการนี้ระบบจะใส่กล่องเป็นIntegerประเภท Wrapper โดยอัตโนมัติ แต่เป็นความคิดที่ดีที่จะใช้รายการประเภทดิบหรือสำหรับประเภททั่วไปสำหรับกรณีนั้นในรหัสที่ใหม่กว่า

ฉันสามารถเพิ่มอะไรก็ได้ในรายการนี้

แน่นอนว่านั่นคือข้อได้เปรียบของการใช้ประเภทดิบ คุณสามารถมีแมว , สุนัข , เสือ , ไดโนเสาร์ทั้งหมดในภาชนะหนึ่ง

เป็นทางเลือกเดียวของฉันสร้างอาร์เรย์ของ int และแปลงเป็นรายการ

ในกรณีนั้นคุณจะได้รับไฟล์List<Integer>. ไม่มีทางที่คุณจะสร้างList<int>หรือสิ่งดั้งเดิมใด ๆ

คุณไม่ควรใส่ใจ แต่อย่างใด แม้ว่าList<Integer>คุณจะสามารถเพิ่มintประเภทดั้งเดิมได้ มันจะถูกบรรจุกล่องโดยอัตโนมัติดังตัวอย่างด้านล่าง:

List<Integer> list = new ArrayList<Integer>();
list.add(5);

การอภิปรายที่ดีเกี่ยวกับประเภทดิบ
Kevin Bowersox

ที่จริงเพื่อความชัดเจนคุณสามารถสร้างรายการที่มีประเภทดั้งเดิมได้โดยใช้อาร์เรย์พื้นฐาน int [] array = int ใหม่ [10];
Taylor

1
@Taylor แต่นั่นจะไม่ใช่รายการที่เพิ่มขึ้นแบบไดนามิก นั่นคืออาร์เรย์ และฉันคิดว่า OP คงจะรู้เรื่องนั้นอยู่แล้ว
Rohit Jain


5

นี้เป็นไปไม่ได้ ข้อกำหนดจาวาห้ามการใช้งานดั้งเดิมในยาชื่อสามัญ อย่างไรก็ตามคุณสามารถสร้างArrayList<Integer>และเรียกใช้add(i)if iเป็น int ได้ด้วยการชกมวย


4

คุณสามารถใช้คอลเลกชันแบบดั้งเดิมที่มีอยู่ในEclipse คอลเลกชัน คราสคอลเลกชันมีList, Set, BagและMapสำหรับพื้นฐานทั้งหมด องค์ประกอบในคอลเลกชันดั้งเดิมยังคงเป็นแบบดั้งเดิมและไม่มีการชกมวยเกิดขึ้น

คุณสามารถเริ่มต้นIntList ได้ดังนี้:

MutableIntList ints = IntLists.mutable.empty();

คุณสามารถแปลงจากList<Integer>ไปIntListเช่นนี้

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

หมายเหตุ: ฉันเป็นผู้สนับสนุน Eclipse Collections



0

เมื่อคุณใช้ Java สำหรับการพัฒนา Android ก็จะแนะนำให้ใช้SparseIntArrayเพื่อป้องกันไม่ให้ Autoboxing ระหว่างและintInteger

คุณสามารถค้นหาข้อมูลเพิ่มเติมได้SparseIntArrayในเอกสารประกอบสำหรับนักพัฒนา Androidและคำอธิบายที่ดีสำหรับการทำกล่องอัตโนมัติบน Android ให้ป้อนคำอธิบายลิงก์ที่นี่


นั่นเป็นคำสั่งที่แข็งแกร่ง แน่นอนว่าSparseIntArrayมักเป็นตัวเลือกที่ดีกว่า แต่ก็มีข้อเสียที่ต้องระวัง "การนำไปใช้งานไม่ได้มีวัตถุประสงค์เพื่อให้เหมาะสมกับโครงสร้างข้อมูลที่อาจมีรายการจำนวนมากโดยทั่วไปจะช้ากว่า HashMap แบบเดิม ... "
Andy Thomas

ใช่นั่นคือเรื่องจริง พวกเขาครอบคลุมการแลกเปลี่ยนนี้ค่อนข้างดีในวิดีโอที่ฉันเชื่อมโยง แต่ OP ขอความเป็นไปได้นั้นและฉันแค่อยากจะเพิ่มว่ามันเป็นไปได้จริงกับ Android และยังแนะนำสำหรับกรณีการใช้งานส่วนใหญ่ ขอขอบคุณที่เพิ่มข้อมูล!
Stefan Medack

0

มีวิธีแปลงอาร์เรย์ Integer [] เป็นอาร์เรย์ int [] หรือไม่?

การละเว้นทั้งหมดนี้จากไลบรารีหลักของ Java ดูเหมือนจะเกิดขึ้นในทุกโครงการที่ฉันเคยทำ และสะดวกพอ ๆ กับไลบรารี Trove ฉันไม่สามารถแยกวิเคราะห์ข้อกำหนดที่แม่นยำเพื่อให้ตรงตาม LPGL สำหรับแอพ Android ที่ลิงก์ไลบรารี LGPL แบบคงที่ (คำนำบอกว่าโอเคร่างกายดูเหมือนจะไม่พูดเหมือนกัน) และมันก็ไม่สะดวกที่จะไปที่แหล่งที่มาของ Apache ที่ฉีกและลอกเพื่อรับคลาสเหล่านี้ จะต้องมีวิธีที่ดีกว่านี้


-4

Java Collection ควรเป็นคอลเล็กชันของ Object เท่านั้น

List<Integer> integerList = new ArrayList<Integer>();

จำนวนเต็มเป็นคลาส Wrapper ของประเภทข้อมูลดั้งเดิม int

เพิ่มเติมจากคลาส JAVA wrapper ที่นี่ !

คุณสามารถบันทึกโดยตรงและรับ int ถึง / จาก integerList เป็น integerList.add(intValue); int intValue = integerList.get(i)


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