Java Collection API จัดเตรียมคลาสคอลัมน์และอินเทอร์เฟซเพื่อช่วยเราจัดเก็บและจัดการคอลเลกชันวัตถุ ในความเป็นจริงคอลเลกชันใน Java ทำงานเหมือนอาร์เรย์ แต่ขนาดของคอลเลกชันสามารถเปลี่ยนแปลงได้แบบไดนามิกและคอลเลกชันก็ให้ฟังก์ชั่นขั้นสูงมากขึ้น ด้วย Javacollection API เราไม่จำเป็นต้องเขียนคลาสคอลเลกชันด้วยตัวเอง คลาสคอลเลกชัน Java ส่วนใหญ่ตั้งอยู่ในแพ็คเกจ java.util และคลาสคอลเลกชันที่เกี่ยวข้องพร้อมกันบางแห่งตั้งอยู่ในแพ็คเกจ java.util.concurrent นี่คือบางส่วนของคลาสคอลเลกชันที่จัดทำโดย Java API
1. ภาพรวมของคอลเลกชัน Java
มีสองประเภทของคอลเลกชันใน Java คือ:
1. คอลเลกชัน
2. แผนที่
คอลเลกชันของคลาสคอลเลกชันสามารถเข้าใจได้ว่าเป็นส่วนใหญ่ที่จัดเก็บวัตถุเดียวในขณะที่คอลเลกชันของคลาสแผนที่ส่วนใหญ่จะเก็บวัตถุคีย์-ค่า ทั้งสองหมวดหมู่นี้สามารถนำมาใช้เพื่อให้สอดคล้องกับสองอินเทอร์เฟซคือ Collection接口และ Map接口รูปภาพต่อไปนี้แสดงรายการทรีมรดกของอินเทอร์เฟซทั้งสองนี้:
จากภาพด้านบนเราจะเห็นได้ว่าอินเทอร์เฟซคอลเลกชันได้มาสามสาขาคือ:
1. รายการ
2. ตั้งค่า
3. คิว
แผนที่ค่อนข้างง่ายมีเพียงสาขาเดียว ด้านล่างเราจะแนะนำการดำเนินการแต่ละคลาสของคอลเลกชัน Java โดยละเอียด
หมายเหตุ: เพื่อแยกความแตกต่างของคอลเลกชันและคอลเลกชันคอลเลกชันเป็นส่วนต่อประสานกับคอลเลกชันและคอลเลกชันเป็นคลาสเครื่องมือซึ่งมีวิธีการคงที่บางอย่างเพื่ออำนวยความสะดวกให้เราใช้งานอินสแตนซ์คอลเลกชันซึ่งทั้งสองอยู่ในแพ็คเกจ java.util
2. แนะนำครั้งแรกจากอินเทอร์เฟซคอลเลกชัน
รูปต่อไปนี้เป็นภาพหน้าจอของซอร์สโค้ดของอินเทอร์เฟซคอลเลกชัน จากวิธีการนามธรรมในอินเทอร์เฟซเราจะเห็นว่ามันกำหนดวิธีการทั่วไปสำหรับคอลเลกชันทั่วไป:
- เพิ่มและลบองค์ประกอบ
- ตรวจสอบว่าองค์ประกอบมีอยู่หรือไม่
- รับขนาดของคอลเลกชัน
- วนซ้ำคอลเลกชัน
2.1 อินเตอร์เฟสรายการคอลเลกชัน
อินเตอร์เฟสรายการสืบทอดมาจากอินเตอร์เฟสคอลเลกชัน ลักษณะของมันคือวัตถุที่ได้รับคำสั่งและแต่ละวัตถุมีดัชนีที่ไม่ซ้ำกัน เราสามารถค้นหาองค์ประกอบผ่านดัชนีนี้และวัตถุในรายการได้รับอนุญาตให้ทำซ้ำซึ่งคล้ายกับอาร์เรย์ สำหรับอินเทอร์เฟซรายการ Java API ให้การใช้งานต่อไปนี้:
- java.util.arraylist
- java.util.linkedlist
- java.util.vector
- java.util.stack
แน่นอนว่ามีการใช้งานบางอย่างในแพ็คเกจ java.util.concurrent ซึ่งจะอธิบายในรายละเอียดในบทความอื่น
ArrayList เป็นคอลเลกชันที่ใช้กันมากที่สุด และการใช้งานภายในเป็นอาร์เรย์ และขนาดของ ArrayList สามารถขยายได้แบบไดนามิก ประสิทธิภาพการเข้าถึงแบบสุ่มสำหรับองค์ประกอบสูงและความซับซ้อนของเวลาในการเข้าถึงคือ O(1) ประสิทธิภาพการทำงานจากหางสูงและความซับซ้อนของเวลาคือ O(1) เช่นเดียวกับการเข้าถึงแบบสุ่ม หากดำเนินการจากหัวประสิทธิภาพจะค่อนข้างต่ำเนื่องจากเมื่อแทรกหรือลบออกจากศีรษะองค์ประกอบทั้งหมดต่อไปนี้จะต้องย้ายและความซับซ้อนของเวลาคือ O(ni) (n หมายถึงจำนวนองค์ประกอบและฉันแสดงถึงตำแหน่งขององค์ประกอบ)
LinkList: ดังที่เห็นได้จากรูปด้านบนไม่เพียง แต่สืบทอดอินเทอร์เฟซ List เท่านั้น แต่ยังสืบทอดอินเทอร์เฟซ Deque (จะมีการแนะนำในภายหลัง) LinkList เป็นโครงสร้างข้อมูลตามรายการที่เชื่อมโยงและแต่ละโหนดจะบันทึกพอยน์เตอร์ไปยังโหนดก่อนหน้าและโหนดถัดไป LinkList ค่อนข้างไม่มีประสิทธิภาพสำหรับการเข้าถึงแบบสุ่มเนื่องจากต้องมีการจัดทำดัชนีตั้งแต่เริ่มต้นดังนั้นความซับซ้อนของเวลาคือ O(i) อย่างไรก็ตามสำหรับการเพิ่มและการลบองค์ประกอบ LinkList นั้นมีประสิทธิภาพเนื่องจากต้องมีการแก้ไขเฉพาะด้านหน้าและด้านหลังเท่านั้นและความซับซ้อนของเวลาคือ O(1)
เวกเตอร์: จากภาพหน้าจอของเวกเตอร์และซอร์สโค้ด arraylist พวกเขาสืบทอดอินเตอร์เฟสเหมือนกัน ดังนั้นเวกเตอร์จึงถือได้ว่าเป็น ArrayList ที่ปลอดภัยจากเธรดซึ่งดำเนินการตามอาร์เรย์ แต่การดำเนินการคอลเลกชันเกือบทั้งหมดจะถูกเพิ่มเข้ากับคำหลัก synchronized
สแต็ค: ด้านบนเป็นภาพหน้าจอของซอร์สโค้ดคลาสสแต็ก เราเห็นว่าคลาสสแต็กจริงมาจากเวกเตอร์ สแต็คเพิ่มวิธีการหลายวิธีตามเวกเตอร์เพื่อให้ลักษณะของสแต็ค (สุดท้ายใน LIFO แรก) คุณลักษณะของสแต็คคือเมื่อเพิ่มองค์ประกอบใหม่จะถูกเพิ่มไปด้านบนและเมื่อลบองค์ประกอบด้านบนจะถูกลบออกก่อน โครงสร้างข้อมูลนี้ส่วนใหญ่ใช้เป็นกระบวนการประมวลผลข้อมูลพิเศษเช่นการรวบรวมภาษาการแยกวิเคราะห์ XML ฯลฯ
2.2 คอลเลกชันชุดอินเทอร์เฟซ
อินเทอร์เฟซ SET และรายการยังสืบทอดมาจากอินเทอร์เฟซ Collection และยังเป็นการใช้งานคอลเลกชัน ความแตกต่างที่ใหญ่ที่สุดระหว่างพวกเขาคือ วัตถุในชุดไม่ได้รับอนุญาตให้ทำซ้ำ สำหรับอินเทอร์เฟซ Set Java API ให้การใช้งานต่อไปนี้:
- java.util.enumset
- java.util.hashset
- java.util.linkedhashset
- java.util.treeset
ฟังก์ชั่นของคลาสเหล่านี้แตกต่างกันเล็กน้อยและความแตกต่างส่วนใหญ่สะท้อนให้เห็นในลำดับของการทำซ้ำของวัตถุและประสิทธิภาพของการแทรกและการค้นหา
การใช้ HashSet นั้นง่ายมากและเป็น HashMap ภายใน แต่ไม่รับประกันลำดับขององค์ประกอบ
การใช้งาน LinkedHashSet นั้นง่ายมากและใช้ LinkedHashMap ภายใน เนื่องจาก LinkedHashMap เก็บรักษา รายการที่เชื่อมโยงแบบสองทิศทาง ภายในเพื่อรักษาคำสั่งซื้อลักษณะของ LinkedHashSet คือองค์ประกอบในการสั่งซื้อและลำดับของการทำซ้ำองค์ประกอบเป็นคำสั่งของการแทรกของพวกเขา การแทรกซึมขององค์ประกอบจะไม่ส่งผลกระทบต่อลำดับขององค์ประกอบดั้งเดิม
Treeset: จากความสัมพันธ์ในการสืบทอดในรูปด้านบนคุณต้องเข้าใจอินเตอร์เฟส NavigableSet TreeSet SortedSet ก่อน
SortedSet Interface
Public Interface SortedSet <E> ขยายชุด <e> {comparator <? super e> comparator (); SortedSet <e> ชุดย่อย (E Fromelement, E toElement); SortedSet <e> ชุดหูฟัง (e toelement); SortedSet <E> tailSet (E FromElement); e แรก (); - จากคำนิยามอินเตอร์เฟสด้านบนอินเตอร์เฟส SortedSet เป็นส่วนย่อยของชุด นอกเหนือจากคุณสมบัติชุดทั่วไปองค์ประกอบของมันจะถูกสั่งซื้อภายใน ลำดับขององค์ประกอบภายในขึ้นอยู่กับกฎการสั่งซื้อขององค์ประกอบนั่นคือลำดับขององค์ประกอบขึ้นอยู่กับการใช้งานอินเทอร์เฟซ comparable ขององค์ประกอบหรือ comparator เปรียบเทียบ สำหรับความแตกต่างระหว่างการเปรียบเทียบและตัวเปรียบเทียบโปรดดูที่: https://www.vevb.com/article/93973.htm
อินเตอร์เฟส NavigableSet
อินเตอร์เฟสสาธารณะ NavigableSet <E> ขยาย SortEtset <E> {NavigableSet <E> descendingset (); ตัววนซ้ำ <e> descendingIterator (); SortedSet <e> ชุดหูฟัง (e toelement); SortedSet <E> tailSet (E FromElement); SortedSet <e> ชุดย่อย (E Fromelement, E toElement); เพดาน (), พื้น (), สูงกว่า () และต่ำกว่า () ... }จากคำนิยามอินเตอร์เฟส NavigableSet มันเป็นส่วนย่อยของ SortedSet และให้วิธีการนำทาง สำหรับความหมายของวิธีการนำทางเหล่านี้คุณสามารถตรวจสอบเอกสาร Java
ดังนั้นลักษณะของ TreeSet คือองค์ประกอบภายในได้รับคำสั่งและมีวิธีการนำทางมากมายที่จะนำไปใช้ จากส่วนแรกของภาพรวมคลาสคอลเลกชัน Java เรารู้ว่าชุดมีชุดย่อยแบบ SortedSet เฟซและ SortedSet มี NavigableSet Sub-Interface Java API ใช้เฉพาะอินเตอร์เฟส SortedSet และ NavigableSet ซึ่งเป็น TreeSet
2.3 อินเทอร์เฟซคิวของคอลเลกชัน
อินเทอร์เฟซคิวสืบทอดมาจากอินเทอร์เฟซคอล Collection ซึ่งแสดงถึงคิวที่สั่งซื้อ อย่างไรก็ตามคุณสมบัติที่ใหญ่ที่สุดของคิวนี้คือองค์ประกอบที่แทรกใหม่ตั้งอยู่ที่หางของคิวและวัตถุที่ถูกลบอยู่ที่หัวของคิวซึ่งคล้ายกับคิวที่ตรวจสอบในซูเปอร์มาร์เก็ต
เรารู้แล้วจาก ภาพรวมคอลเลกชัน Java ในส่วนที่ 1 ว่าอินเทอร์เฟซคิวยังมี deque อินเตอร์เฟซย่อย ลองมาดูคำจำกัดความของอินเทอร์เฟซทั้งสองนี้โดย Java API:
อินเทอร์เฟซคิว:
คิวส่วนต่อประสานสาธารณะ <e> ขยายคอลเลกชัน <e> {บูลีนเพิ่ม (e e); ข้อเสนอบูลีน (e e); e ลบ (); E Poll (); E peek ();}อินเทอร์เฟซ deque:
ส่วนต่อประสานสาธารณะ deque <e> ขยายคิว <e> {void addfirst (e e); เป็นโมฆะ addlast (e e); e removefirst (); e removefirst ();}จากคำจำกัดความของอินเทอร์เฟซทั้งสองนี้ฉันคิดว่าทุกคนได้เห็นเบาะแสบางอย่าง อินเทอร์เฟซคิวกำหนดวิธีการทำงานของคิวทั่วไปในขณะที่ deque เป็น คิวสองปลาย
สำหรับอินเทอร์เฟซ Queue Java API มีการใช้งานสองครั้ง:
- java.util.linkedList (ยังใช้อินเทอร์เฟซ deque)
- java.util.priorityqueue
LinkedList: บทก่อนหน้านี้ได้กล่าวว่าเป็นคิวมาตรฐาน
PriorityQueue: คำสั่งซื้อในคิวนั้นคล้ายคลึงกับ Treeset ขึ้นอยู่กับกฎการสั่งซื้อขององค์ประกอบนั่นคือการใช้งานองค์ประกอบไปยังอินเตอร์เฟสที่เปรียบเทียบได้หรือตัวเปรียบเทียบตัวเปรียบเทียบ
สำหรับอินเทอร์เฟซ Deque มีการใช้งานอื่นนอกเหนือจากคลาส LinkList:
- java.util.arraydeque
ArrayDeque: ดังที่เห็นได้จากชื่อการใช้งานภายในเป็นอาร์เรย์
3. แผนที่คอลเลกชัน Java
จากส่วนแรกของภาพรวมคลาสคอลเลกชัน Java เรารู้ว่าแผนที่ไม่ได้รับมาจากอินเทอร์เฟซคอลเลกชัน แต่อยู่ในตำแหน่งคู่ขนานกับอินเทอร์เฟซคอลเลกชัน ดังนั้นพฤติกรรมของแผนที่จึงแตกต่างจากพฤติกรรมของคอลเลกชันที่แนะนำข้างต้น คุณสมบัติหลักของแผนที่คือองค์ประกอบที่เก็บไว้เป็นคู่ key-value มาดูคำจำกัดความของอินเทอร์เฟซแผนที่:
แผนที่ส่วนต่อประสานสาธารณะ <k, v> {v ใส่ (k key, v value); บูลีนมีคีย์ (คีย์วัตถุ); ตั้งค่า <map.entry <k, v >> entrySet (); int hashcode (); v รับ (คีย์วัตถุ); ตั้งค่า <k> keyset (); -สำหรับอินเทอร์เฟซแผนที่ Java API ให้การใช้งานต่อไปนี้:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- java.util.identityhashmap
- java.util.linkedhashmap
- java.util.properties
- java.util.treemap
- java.util.weakhashmap
ในหมู่พวกเขาสิ่งที่ใช้กันมากที่สุดคือ hashmap และ treemap
คีย์และค่าใน HashMap นั้นไม่เป็นระเบียบ การใช้ HashMap ภายในนั้นคุ้มค่าที่จะศึกษา สำหรับรายละเอียดโปรดดูการใช้งานภายในของ HashMap
Hashtable ถือได้ว่าเป็นการใช้งาน HashMap ที่มีน้ำหนักมาก วิธีการส่วนใหญ่จะถูกเพิ่มด้วยคำหลักที่ซิงโครไนซ์ซึ่งเป็นเธรดที่ปลอดภัย ความแตกต่างอีกประการหนึ่งระหว่าง HashTable และแฮชแมปคือ key-value ของ HashMap ทั้งสองได้รับอนุญาตให้เป็นโมฆะในขณะที่ HashTable不
LinkedHashMap ยังเป็น HASHMAP แต่รายการที่เชื่อมโยงสองทางได้รับการดูแลภายในเพื่อรักษาคำสั่งซื้อ การใช้งานภายใน LinkedHashSet ใช้เพื่อใช้ LinkedHashMap
กุญแจและคุณค่าใน treemap ไม่เพียง แต่รักษาความสงบเรียบร้อย แต่คล้ายกับ TreeSet และ PriorityQueue ลำดับซ้ำของคีย์และค่าใน treemap ขึ้นอยู่กับกฎการเรียงลำดับที่เกี่ยวข้อง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น