2015-05-04 10 views
11

HashSet, HashMap kullanılarak uygulanır ve e1'den HashSet'e bir şey eklediğimizde, dahili olarak e1, sette yoksa, HashMap'e (e1, yeni Object()) ekler. Benim sorum, yeni Nesnelerin oluşturulmadığından daha iyi bir yaklaşım olan (e1, null) gibi eklendikleri zaman yeni Object() ekledikleridir. Burada nulllar eklemek için herhangi bir olumsuzluk var mı?HashSet'in iç uygulaması neden sıfırları eklemek yerine HashMap'e değer olarak eklenecek kukla nesneler oluşturur?

+0

Yeni nesne eklemez. Bu sette bir değerin varlığının bir göstergesi olarak kullanılan tek bir tane ekler. Kaynak kodunu oku. –

+0

Java 8'de, özel statik final olarak değiştirdiler. Object PRESENT = new Object(); , bu değerdir. – Sandeep

+0

hiçbir performans isabeti yok çünkü nesne statik bir sonuçtur ve bu yüzden sadece sabittir ve – Prashant

cevap

11

A HashSet, yeni bir anahtar put her seferinde yeni bir Object eklemez. Bir Object kullanıyor, ancak her seferinde aynı Object kullanıyor. Bu değer HashSet kaynak kodunda PRESENT olarak adlandırılmıştır.

add yöntemi, HashMap numaralı telefondan put(key, PRESENT) numaralarını çağırır. remove yöntemi, iç HashMap üzerinde remove(key) numaralı telefonu çağırır, ancak anahtarın mevcut olup olmadığını belirten bir boolean döndürmelidir. null değer olarak kaydedildiyse, HashSet anahtarın mevcut olup olmadığını belirlemek için önce containsKey, ardından remove numaralı telefonu arayacak - ek ek yük. Burada, sadece Object bir bellek yükü vardır, ki bu oldukça azdır.

0

E.g. Bir HashSet nesnesini ConcurrentSkipListSet yapıcısına verirseniz, boş değer içeremez.

2

Sadece sourcecode baktı ve bu kodu

public boolean add(E e) { 
    return map.put(e, PRESENT)==null; 
} 

public boolean remove(Object o) { 
    return map.remove(o)==PRESENT; 
} 

nullPRESENT yerine kullanıldıysa Bunlar işe yaramaz gördük; Her durumda, fazladan bir adım gerekli olacaktır.

İlgili konular