Ipinapatupad ng klase
HashSet
ang interface Set
, ay batay sa isang hash table, at sinusuportahan din ng isang instance HashMap
. Dahil HashSet
ang mga elemento ay hindi nakaayos, walang garantiya na ang mga elemento ay nasa parehong pagkakasunud-sunod pagkatapos ng ilang panahon. Ang mga operasyon ng pagdaragdag, pagtanggal at paghahanap ay isasagawa sa patuloy na oras, sa kondisyon na ang hash function ay wastong namamahagi ng mga elemento sa "mga bucket", na tatalakayin sa ibang pagkakataon. Ilang mahahalagang punto tungkol sa HashSet
:
- kasi ipinapatupad ng klase ang interface
Set
, maaari lamang itong mag-imbak ng mga natatanging halaga; - Maaaring mag-imbak ng mga NULL na halaga;
- Ang pagkakasunud-sunod kung saan ang mga elemento ay idinagdag ay kinakalkula gamit ang isang hash code;
HashSet
nagpapatupad din ngSerializable
atCloneable
.
HashSet
, ay dapat na direktang proporsyonal sa bilang ng mga elemento sa HashSet
+ ang "kapasidad" ng built-in na instance HashMap
(ang bilang ng mga "basket"). Samakatuwid, upang mapanatili ang pagganap, mahalagang huwag itakda ang paunang kapasidad na masyadong mataas (o masyadong mababa ang load factor). Paunang kapasidad - ang paunang bilang ng mga cell ("bins") sa hash table. Kung ang lahat ng mga cell ay napuno, ang kanilang bilang ay awtomatikong tataas. Ang load factor ay isang sukatan kung gaano ito kapuno HashSet
bago awtomatikong tumaas ang kapasidad nito. Kapag ang bilang ng mga elemento sa HashSet
ay naging mas malaki kaysa sa produkto ng paunang kapasidad at ang load factor, ang hash table ay muling hina-hash (ang mga hash code ng mga elemento ay muling kinakalkula at ang talahanayan ay itinayong muli ayon sa mga nakuhang halaga) at ang numero ang mga cell sa loob nito ay doble. Load factor = Bilang ng mga elemento na nakaimbak sa table / hash table size Halimbawa, kung ang paunang bilang ng mga cell sa table ay 16, at ang load factor ay 0.75, pagkatapos ay sumusunod na kapag ang bilang ng mga filled na cell ay umabot sa 12, ang ang bilang ng mga cell ay awtomatikong tataas. Ang load factor at initial capacity ay ang dalawang pangunahing salik na nakakaapekto sa performance ng HashSet
. Ang load factor na 0.75 ay nagbibigay ng magandang performance sa karaniwan. Kung ang parameter na ito ay tumaas, ang memory load ay bababa (dahil babawasan nito ang bilang ng mga re-hashing at muling pagtatayo ng mga operasyon), ngunit ito ay makakaapekto sa mga pagpapatakbo ng append at lookup. Upang mabawasan ang oras na ginugol sa muling pag-hash, kailangan mong piliin ang tamang parameter ng paunang kapasidad. Kung ang paunang kapasidad ay mas malaki kaysa sa maximum na bilang ng mga elemento na hinati sa load factor, walang mangyayaring muling pag-hash. Mahalaga: HashSet
ay hindi isang istraktura ng data na may built-in na pag-synchronize, kaya kung maraming mga thread ang gumagana sa parehong oras, at hindi bababa sa isa sa mga ito ay sinusubukang gumawa ng mga pagbabago, ito ay kinakailangan upang magbigay ng naka-synchronize na pag-access mula sa labas. Madalas itong ginagawa sa kapinsalaan ng isa pang naka-synchronize na bagay na nakapaloob sa HashSet
. Kung walang ganoong bagay, kung gayon ang Collections.synchronizedSet()
. Ito ang kasalukuyang pinakamainam na paraan upang maiwasan ang mga out-of-sync na operasyon sa HashSet
.
Set s = Collections.synchronizedSet(new HashSet(...));
Mga tagabuo ng HashSet:
HashSet h = new HashSet();
- default na tagabuo. Ang default na paunang kapasidad ay 16, ang load factor ay 0.75.HashSet h = new HashSet(int initialCapacity)
– isang constructor na may ibinigay na paunang kapasidad. Salik ng pag-load - 0.75.HashSet h = new HashSet(int initialCapacity, float loadFactor);
— isang constructor na may ibinigay na paunang kapasidad at load factor.HashSet h = new HashSet(Collection C)
– isang constructor na nagdaragdag ng mga elemento mula sa isa pang koleksyon.
HashSet
:
import java.util.*;
class Test
{
public static void main(String[]args)
{
HashSet<String> h = new HashSet<String>();
// Add elements to the HashSet using the add() method
h.add("India");
h.add("Australia");
h.add("South Africa");
h.add("India");// try to add another same element
// Print the elements of the HashSet to the console
System.out.println(h);
System.out.println("List contains India or not:" +
h.contains("India"));
// Remove elements from the set using the remove() method
h.remove("Australia");
System.out.println("List after removing Australia:"+h);
// Loop through the elements of the HashSet using an iterator:
System.out.println("Iterating over list:");
Iterator<String> i = h.iterator();
while (i.hasNext())
System.out.println(i.next());
}
}
Konklusyon:
[South Africa, Australia, India]
List contains India or not:true
List after removing Australia:[South Africa, India]
Iterating over list:
South Africa
India
Ang lahat ng mga klase na nagpapatupad ng isang interface Set
ay panloob na sinusuportahan ng mga pagpapatupad Map
. HashSet
nag-iimbak ng mga elemento gamit ang HashMap
. Bagama't HashMap
dapat na katawanin ang isang elemento bilang key-value pair para magdagdag ng elemento, HashSet
ang value lang ang idinaragdag. Sa katunayan, ang value na ipapasa natin HashSet
ay ang susi sa object HashMap
, at isang constant ang ginagamit bilang value HashMap
. Sa ganitong paraan, sa bawat key-value pair, lahat ng key ay magkakaroon ng parehong halaga. Pagpapatupad HashSet
sa java doc
:
private transient HashMap map;
// Constructor - 1
// All constructors implicitly create a HashMap object.
public HashSet()
{
// Create an implicit HashMap object
map = new HashMap();
}
// Constructor- 2
public HashSet(int initialCapacity)
{
// Create an implicit HashMap object
map = new HashMap(initialCapacity);
}
// An object of the Object class, each time acting as a value in the HashMap
private static final Object PRESENT = new Object();
Kung titingnan mo ang pamamaraan add()
y HashSet
:
public boolean add(E e)
{
return map.put(e, PRESENT) == null;
}
Mapapansin mo na tinatawag ng method add()
na y ang method sa internal object , na ipinapasa dito ang elementong idaragdag bilang key, at ang PRESENT constant bilang value. Ang pamamaraan ay gumagana sa isang katulad na paraan . Tinatawag nito ang internal object method : HashSet
put()
HashMap
remove()
remove()
HashMap
public boolean remove(Object o)
{
return map.remove(o) == PRESENT;
}
HashSet
ay batay sa isang hash table, at magdagdag, magtanggal, o maghanap ng mga operasyon, sa karaniwan, makukumpleto sa pare-pareho (O(1)) na oras . Paraan HashSet
:
boolean add(E e)
: nagdadagdag ng isang elemento saHashSet
, kung wala, ngunit kung ang naturang elemento ay naroroon na, ang pamamaraan ay nagbabalik ng false .void clear():
inaalis ang lahat ng elemento mula sa isang set.boolean contains(Object o)
: Nagbabalik ng true kung ang ibinigay na elemento ay nasa set.boolean remove(Object o)
: Tinatanggal ang ibinigay na elemento mula sa set, kung mayroon.Iterator iterator()
: Nagbabalik ng iterator para sa mga elemento ng set.boolean isEmpty()
: Nagbabalik ng true kung walang elemento sa set.Object clone()
: Nagsasagawa ng surface cloningHashSet
.
GO TO FULL VERSION