2014-10-01 15 views
5

Mentre si guarda il codice sorgente del metodo addAll di CollectionUtils. Ho notato che utilizza |= simboloaddAll() restituisce false?

public static <T> boolean addAll(Collection<? super T> c, T... elements) { 
boolean result = false; 
for (T element : elements) 
    result |= c.add(element); 
    return result; 
} 

Dalla mia comprensione |= è un operatore bitwise or e solo una scorciatoia di result = result|c.add(element), così per esempio:

System.out.println(false|true);//true 
System.out.println(false|false);//false 
System.out.println(true|false);//true 
System.out.println(true|true);//true 

Ciò significa che se qualsiasi elemento aggiunto con successo, lo farà ritorna vero Ora mi chiedo se ci sarà un'istanza, restituirà false? Se no, perché ha un ritorno?

+2

Provare a impostare.addAll (set) 'per arbitrario' Imposta '. –

+0

@MarkoTopolnik Sì. Ho fatto lo stesso e il risultato è stato pompato :) –

+0

grazie. Ho dimenticato il Set. Quindi, se uso List, restituirà sempre true, poiché può contenere valori duplicati. – user23123412

risposta

6

Se tutti gli elementi da aggiungere erano già nella raccolta (prima della chiamata a addAll) e la raccolta non consente duplicati, restituirà false, poiché tutte le singole chiamate al metodorestituirebbero false. Questo è vero per le raccolte come Set.

Per altre raccolte, add restituisce sempre true e pertanto addAll restituisce true, a meno che non venga chiamato con un elenco vuoto di elementi da aggiungere.

+0

Grazie. Quindi una lista tornerà sempre vera? perché consente duplicati. – user23123412

+0

@ user23123412 Sì (presupponendo di passare una matrice di elementi non vuota da aggiungere), poiché 'add' per List restituisce sempre true. – Eran

+0

grazie. Adesso lo so. – user23123412

2

Da documenti di addAll()

rendimenti:

true se la raccolta è modificata a seguito della chiamata.

Se le raccolte non sono state modificate, quindi false.

Si consideri il seguente programma (seguire il risultato nei commenti)

public static void main(String[] args) { 
     List<String> l1= new ArrayList<String>(); 
     l1.add("test"); 
     List<String> l2= new ArrayList<String>(); 
     System.out.println(l2.addAll(l1));//true 
     System.out.println(l2.addAll(l1));//true 

     Set<String> s1= new HashSet<String>(); 
     s1.add("test"); 
     Set<String> s2= new HashSet<String>(); 
     System.out.println(s2.addAll(s1));//true 
     System.out.println(s2.addAll(s1));//false 
     } 
3

|= è bitwise OR

. | (OR bit a bit) imposta un bit su 1 se uno o entrambi i bit corrispondenti nei suoi operandi sono 1 e su 0 se entrambi i bit corrispondenti sono 0. In altre parole, | restituisce uno in tutti i casi eccetto dove i bit corrispondenti di entrambi gli operandi sono zero. Il bit pattern risultante è il bit "set" (1 o true) di uno qualsiasi dei due operandi. Questa proprietà viene utilizzata per "impostare" o "attivare" un "flag" (bit impostato su uno) nei flag o nella variabile options indipendentemente dal fatto che tale flag sia stato impostato in precedenza o meno. Bit di flag multipli possono essere impostati se viene definita una combo MASK.

// To set or turn on a flag bit(s) 
flags = flags | MASK; 
// or, more succintly 
flags |= MASK; 

Quindi il codice è equivalente a:

boolean result = false; 
for (T element : elements){ 
    result = result | c.add(element); 
} 
return result; 

Inizialmente risultato sarà falsa e come uno degli elementi di successo vengono aggiunti alla collezione sarà impostato a true cioè c.add(element);. Quindi restituirà true se uno degli elementi viene aggiunto.

0

Operazione: tutti gli elementi nella raccolta specificata vengono aggiunti alla fine di questo elenco. se la raccolta è cambiata in seguito alla chiamata, restituisce true. se la raccolta non viene modificata in seguito alla chiamata, restituisce false.

Problemi correlati