คอลเลกชันใน Java ส่วนใหญ่กระจุกตัวอยู่ในสองส่วน ส่วนหนึ่งอยู่ในแพ็คเกจ java.util และอีกส่วนหนึ่งอยู่ใน java.util.concurrent ส่วนหลังจะขึ้นอยู่กับส่วนแรกและกำหนดคอลเลกชันบางส่วนที่ใช้ฟังก์ชันการซิงโครไนซ์
บทความนี้มุ่งเน้นไปที่วัตถุคอลเลกชันต่างๆภายใต้ java.util เป็นหลัก อ็อบเจ็กต์คอลเลกชันใน Java สามารถแบ่งคร่าวๆ ได้เป็นสามประเภท: รายการ ชุด และแผนที่ แผนภาพ UML ที่สอดคล้องกันมีดังนี้ (รวมถึงวัตถุคอลเลกชันส่วนใหญ่ภายใต้ java.util):
ภาพรวมของคอลเลกชัน
ทั้งรายการและการตั้งค่าในคอลเลกชั่น Java มาจากคอลเลกชั่น ซึ่งเป็นจุดเริ่มต้นที่ดีสำหรับคอลเลกชั่นการเรียนรู้ โดยมีการดำเนินการที่จำเป็นในคอลเลกชั่น:
เพิ่มองค์ประกอบ: เพิ่ม/เพิ่มทั้งหมด
ล้างคอลเลกชัน: ชัดเจน
ลบองค์ประกอบ: ลบ/removeAll
ตรวจสอบว่าคอลเลกชันมีองค์ประกอบ: contains/containsAll หรือไม่
ตรวจสอบว่าคอลเลกชันว่างเปล่าหรือไม่: isEmpty
คำนวณจำนวนองค์ประกอบในคอลเลกชัน: ขนาด
แปลงคอลเลกชันเป็นอาร์เรย์: toArray
รับตัววนซ้ำ: ตัววนซ้ำ
ลองดูตัวอย่างง่ายๆ โค้ดต่อไปนี้จะส่งคืนคอลเลกชันที่มีองค์ประกอบเป็นจำนวนเต็มที่สร้างขึ้นแบบสุ่ม:
ส่งคืนคอลเลกชัน;
-
1) ใช้ตัววนซ้ำเพื่อสำรวจคอลเลกชัน ตามที่กล่าวไว้เมื่ออธิบายอินเทอร์เฟซคอลเลกชันข้างต้น คอลเลกชันทั้งหมดจะมีตัววนซ้ำที่เราสามารถใช้เพื่อสำรวจคอลเลกชัน
รายการใน Java เป็นส่วนขยายที่มีประสิทธิภาพของอาร์เรย์ มันเป็นโครงสร้างที่สามารถเก็บองค์ประกอบประเภทใดก็ได้หากไม่ได้ใช้ข้อมูลทั่วไปก็จะสามารถเก็บองค์ประกอบประเภทที่ระบุโดยข้อมูลทั่วไปเท่านั้น เมื่อเปรียบเทียบกับอาร์เรย์ ความจุของรายการสามารถขยายได้แบบไดนามิก
องค์ประกอบในรายการสามารถทำซ้ำได้ และองค์ประกอบภายในเป็นแบบ "เรียงลำดับ" ในที่นี้ไม่ได้หมายถึงการเรียงลำดับ แต่หมายความว่าเราสามารถระบุตำแหน่งขององค์ประกอบในคอลเลกชันได้
อ็อบเจ็กต์คอลเลกชันที่ใช้กันทั่วไปในรายการ ได้แก่ ArrayList, Vector และ LinkedList โดยสองรายการแรกจะถูกจัดเก็บตามอาร์เรย์ และรายการหลังจะถูกจัดเก็บตามรายการที่เชื่อมโยง ในบรรดานั้น Vector นั้นปลอดภัยต่อเธรด และอีกสองอันไม่ปลอดภัยต่อเธรด
รายการสามารถมีค่าว่างได้ แม้ว่าจะใช้ข้อมูลทั่วไปก็ตาม
ArrayList อาจเป็นวัตถุคอลเลกชันที่ใช้กันมากที่สุด ในโค้ดตัวอย่างข้างต้น เรายังใช้มันเพื่อสร้างอินสแตนซ์ของวัตถุคอลเลกชัน ดังนั้นเราจะไม่ลงรายละเอียดที่นี่
เวกเตอร์
ตัวอย่างของ Vector มีดังนี้ อันดับแรกเรามาดูวิธีการสร้างและเอาท์พุต Vector:
[9, 29, 32, 54, 12]
ขนาดของเวกเตอร์คือ 3
[29, 32, 54]
LinkedList ใช้รายการที่เชื่อมโยงเพื่อจัดเก็บข้อมูล โค้ดตัวอย่างจะเป็นดังนี้:
ผลลัพธ์จะเป็นดังนี้:
โมฆะ
โมฆะ
โมฆะ
ขนาดของรายการที่เชื่อมโยงคือ 8
[100, 84, 19, 57, 68, 26, 27, 47]
Set คล้ายกับ List ทั้งสองใช้เพื่อจัดเก็บองค์ประกอบเดียว และจำนวนองค์ประกอบแต่ละรายการไม่แน่นอน แต่ชุดต้องไม่มีองค์ประกอบที่ซ้ำกัน หากใส่องค์ประกอบที่เหมือนกันสองรายการลงในชุด องค์ประกอบหลังจะไม่ถูกแทรก
ชุดสามารถแบ่งคร่าวๆ ได้เป็นสองประเภท: ชุดที่ไม่เรียงลำดับและชุดที่เรียงลำดับประกอบด้วย HashSet และ LinkedHashSet และชุดที่เรียงลำดับส่วนใหญ่อ้างอิงถึง TreeSet ในหมู่พวกเขา HashSet และ LinkedHashSet สามารถมีค่าว่างได้
แฮชเซ็ต
HashSet เป็นคอลเลกชันที่ได้รับการสนับสนุนจากตาราง Hash ซึ่งไม่ปลอดภัยสำหรับเธรด
ลองดูตัวอย่างต่อไปนี้ ซึ่งโดยพื้นฐานแล้วจะเหมือนกับตัวอย่างแรกกับ Vector:
สำหรับ (int i = 0; i < 3; i++)
-
set.add(จำนวนเต็มใหม่(100));
-
ชุด.เพิ่ม(null);
System.out.println("ขนาดของชุดคือ" + set.size());
System.out.println (ชุด);
-
คลาสMyInteger
-
ค่าจำนวนเต็มส่วนตัว
MyInteger สาธารณะ (ค่าจำนวนเต็ม)
-
this.value = ค่า;
-
สตริงสาธารณะ toString()
-
กลับ String.valueOf (ค่า);
-
สาธารณะ int hashCode()
-
กลับ 1;
-
บูลีนสาธารณะเท่ากับ (Object obj)
-
กลับเป็นจริง;
-
-
ต่อไปนี้เป็นวิธีการทดสอบที่เกี่ยวข้อง:
สำหรับ (int i = 0; i < 3; i++)
-
set.add (MyInteger ใหม่ (100));
-
System.out.println("ขนาดของชุดคือ" + set.size());
System.out.println (ชุด);
-
TreeSet คือชุดที่รองรับการเรียงลำดับ และอินเทอร์เฟซหลักคือ SortedSet
ก่อนอื่นเรามาดูการทำงานพื้นฐานของ TreeSet กันก่อน:
สุ่ม r = สุ่มใหม่ ();
สำหรับ (int i = 0; i < 5; i++)
-
set.add(จำนวนเต็มใหม่(r.nextInt(100)));
-
System.out.println (ชุด);
System.out.println(set.first());
System.out.println(set.last());
System.out.println(set.descendingSet());
System.out.println(set.headSet(จำนวนเต็มใหม่ (50)));
System.out.println(set.tailSet(จำนวนเต็มใหม่ (50)));
System.out.println(set.subSet(30, 60));
System.out.println(set.floor(50));
System.out.println(set.ceiling(50));
-
[53, 49, 48, 42, 8]
[8, 42, 48, 49]
[53]
[42, 48, 49, 53]
ต่อไปเราจะกำหนด Integer ใหม่ก่อน:
MyInteger2 สาธารณะ (มูลค่า int)
-
this.value = ค่า;
-
int สาธารณะ CompareTo (วัตถุ arg0)
-
MyInteger2 อุณหภูมิ = (MyInteger2)arg0;
ถ้า (temp == null) กลับ -1;
ถ้า (temp.value > this.value)
-
กลับ 1;
-
อย่างอื่นถ้า (temp.value < this.value)
-
กลับ -1;
-
กลับ 0;
-
บูลีนสาธารณะเท่ากับ (Object obj)
-
กลับ comparTo (obj) == 0;
-
สตริงสาธารณะ toString()
-
กลับ String.valueOf (ค่า);
-
-
แผนที่เก็บ "คู่คีย์-ค่า" เช่นเดียวกับ Set แผนที่มีสองประเภทใน Java: เรียงลำดับและไม่เรียงลำดับ ได้แก่ HashMap, Hashtable และ LinkedHashMap และเรียงลำดับรวมถึง TreeMap
แผนที่ไม่เรียงลำดับ
ทั้ง HashMap และ Hashtable ถูกจัดเก็บในรูปแบบของตาราง HashMap ไม่ปลอดภัยสำหรับเธรด แต่ Hashtable นั้นปลอดภัยต่อเธรด เราสามารถถือว่า HashMap เป็น Hashtable เวอร์ชัน "เรียบง่าย"
HashMap สามารถเก็บค่าว่างได้ ไม่ว่าจะเป็นคีย์หรือค่า Hashtable ไม่สามารถเก็บค่าว่างได้
ไม่ว่า HashMap หรือ Hashtable จะเป็นอย่างไร หากเราสังเกต Constructor เราจะพบว่ามันสามารถมีพารามิเตอร์ได้ 2 ตัว: InitialCapacity และ LoadFactor ตามค่าเริ่มต้น InitialCapacity จะเท่ากับ 16 และ LoadFactor เท่ากับ 0.75 สิ่งนี้เกี่ยวข้องกับจำนวนองค์ประกอบที่สามารถจัดเก็บไว้ในตารางแฮช เมื่อจำนวนองค์ประกอบเกิน defaultCapacity*loadFactor วิธีการแฮชใหม่จะถูกทริกเกอร์เพื่อขยายตารางแฮช หากเราต้องการแทรกองค์ประกอบมากเกินไป เราจำเป็นต้องปรับพารามิเตอร์ทั้งสองนี้ให้เหมาะสม
มาดูตัวอย่าง HashMap กันก่อน:
map.put(จำนวนเต็มใหม่(1), "a");
map.put(จำนวนเต็มใหม่(2), "b");
map.put(จำนวนเต็มใหม่(3), "c");
System.out.println (แผนที่);
System.out.println(map.entrySet());
System.out.println(map.keySet());
System.out.println(map.values());
-
map.put(โมฆะ, โมฆะ);
map.put(โมฆะ, โมฆะ);
map.put (จำนวนเต็มใหม่ (4), null);
map.put (จำนวนเต็มใหม่ (5), null);
System.out.println (แผนที่);
System.out.println(map.entrySet());
System.out.println(map.keySet());
System.out.println(map.values());
-
table.put(จำนวนเต็มใหม่(1), "a");
table.put(จำนวนเต็มใหม่(2), "b");
table.put(จำนวนเต็มใหม่(3), "c");
System.out.println (ตาราง);
System.out.println(ตารางรายการชุด());
System.out.println(ตาราง.ชุดคีย์());
System.out.println(ตาราง.ค่า());
-
โมฆะคงที่ส่วนตัว hashTableTest2()
-
แผนที่ <Integer,String> table = new Hashtable<Integer, String>();
table.put(โมฆะ, โมฆะ);
table.put(โมฆะ, โมฆะ);
table.put(จำนวนเต็มใหม่(4), null);
table.put (จำนวนเต็มใหม่ (5), null);
System.out.println (ตาราง);
System.out.println(ตารางรายการชุด());
System.out.println(ตาราง.ชุดคีย์());
System.out.println(ตาราง.ค่า());
-
การเรียงลำดับแผนที่ส่วนใหญ่อ้างถึง TreeMap ซึ่งมีความซับซ้อนของเวลา O(log(n)) เมื่อเพิ่ม ลบ และค้นหาองค์ประกอบ มันไม่ปลอดภัยสำหรับเธรด
คุณลักษณะของมันคล้ายกับ TreeSet มาก ดังนั้นฉันจะไม่ลงรายละเอียดที่นี่