2017-07-08 101 views
7

, ben çok sık head = (h + 1) & (elements.length - 1); ne yapar & bit işleci burada nasıl çalışır? Java Koleksiyon sınıflarında

//ArrayDeque 
    public E pollFirst() { 
    int h = head; 
    @SuppressWarnings("unchecked") 
    E result = (E) elements[h]; 
    // Element is null if deque empty 
    if (result == null) 
     return null; 
    elements[h] = null;  // Must null out slot 
    head = (h + 1) & (elements.length - 1); 
    return result; 
} 

altında gibi kodları fark ettiniz? Neden & işleci kullanılır ve hangi amaçla kullanılır.

Sorunuz &'un nasıl çalıştığı değil, bunun kullanımı nedir?

Bunu açıklayan var mı?

cevap

11

(h + 1) % elements.length için yalnızca elements.length'un ikisinin bir gücü olduğu durumlarda çalışan bir kısayoldur. Bazı eski donanımlarda bu biraz daha hızlı çalışmış olabilir, ancak bu hala modern bir işlemcide olduğundan şüpheliyim. & operasyonu % için gerçek eşdeğer değildir Yani

+0

Kontrol ettim, varsayılan dizi uzunluğu 16 olarak ayarlandı ve dolduğunda iki katına çıkar. Teşekkürler – Roshan

1

, negatif sayılar düşünüyorum. Bu durum burada değil, ama bu aracılığıyla yapılır bu konularda başka yerlerde (HashMap gibi) vardır:

(n - 1) & hash // n - current capacity, hash - hashcode 

hashcode yana ler int değerler - bunlar negatif sayılar olabilir. & yerine % kullanmak, HashMap (bu nedenle de kova numarası olduğu için) gerçekleşemeyen bir negatif sayıya neden olur.

+0

Bilgi paylaşımı için teşekkürler! – Roshan