2012-06-22 19 views
39

Tengo dos formas de comparar si una lista está vacía o noverificación si una colección está vacía en Java: ¿Cuál es el mejor método

if (CollectionUtils.isNotEmpty(listName)) 

y

if(listName != null && listName.size() != 0) 

Mi arco me dice que el primero es mejor que el segundo.

Pero creo que este es mejor. ¿Alguien puede aclararlo?

+0

¿Por qué cree "último" es mejor? – ant

+0

OP no cree que –

+3

¿Por qué no 'listname.isEmpty()'? 'isEmpty' es un método en la interfaz de Colección – ccheneson

Respuesta

102

Usted debe absolutamente uso isEmpty(). Calcular el size() de una lista arbitraria podría ser costoso. Incluso validando si tiene algún elemento puede ser costoso, por supuesto, pero no hay optimización para size() que no puede también hacer isEmpty() más rápido, mientras que el caso contrario no es el caso.

Por ejemplo, supongamos que tiene una estructura de lista enlazada, que no hicieron el tamaño de caché (mientras que LinkedList<E>hace). Entonces size() se convertiría en una operación O (N), mientras que isEmpty() seguiría siendo O(1).

Además, por supuesto, el uso de isEmpty() indica lo que realmente le interesa más claramente.

0

me gustaría utilizar la primera. Está claro ver de inmediato lo que hace. No creo que el cheque nulo sea necesario aquí.

9

A menos que ya esté usando CollectionUtils, me gustaría List.isEmpty(), menos dependencias.

Rendimiento sabio CollectionUtils será un poco más lento. Porque básicamente sigue la misma lógica pero tiene una sobrecarga adicional.

Por lo tanto, sería la legibilidad frente al rendimiento frente a las dependencias. Sin embargo, no hay mucha diferencia.

+0

20 años como desarrollador y el hábito de usar CollectionUtils me hizo vago. ¡Ni siquiera noté el List.isEmpty() estándar! Nunca se es demasiado viejo para aprender. ¡Gracias hombre! Voy a cambiar esta actitud mía :-D – Lawrence

+6

List.isEmpty() no es lo mismo que CollectionUtils.isEmpty()! Este último manejará el caso donde la colección es nula, la primera arrojará un NPE. – Starkii

35

CollectionUtils.isNotEmpty comprueba si su colección no es nula y no está vacía. Esto es mejor comparado con la verificación doble, pero solo si tiene esta biblioteca Apache en su proyecto. Si no lo hace a continuación, utilizar:

if(list != null && !list.isEmpty()) 
6

Si tiene las utilidades comunes de Apache en su proyecto, más bien use la primera. Porque es más corto y hace exactamente lo mismo que el último. No habrá ninguna diferencia entre ambos métodos, sino cómo se ve dentro del código fuente.

también un cheque vacía utilizando

listName.size() != 0 

no se recomienda debido a todas las implementaciones de recolección tienen la función

listName.isEmpty() 

que hace exactamente lo mismo.

Así que en general, si usted tiene las utilidades comunes de Apache en la ruta de clases de todos modos, utilizar

if (CollectionUtils.isNotEmpty(listName)) 

en cualquier otro caso utilizar

if(listName != null && listName.isEmpty()) 

Usted no notará ninguna diferencia de rendimiento. Ambas líneas hacen exactamente lo mismo.

+1

Hay colecciones donde el método 'size()' es O (n). En general, se espera que todas las implementaciones 'isEmpty()' sean O (1). –

2

CollectionUtils.isNotEmpty Apache Commons' (Colección) es un nulo-SAFE cheque

Devuelve VERDADERO es la colección/lista no-vacío y no nulo devuelve falso si la colección es nulo

Ejemplo:

List<String> properties = new ArrayList(); 
... 
if (CollectionUtils.isNotEmpty(properties)) { 
    // process the list 
} else { 
// list is null or empty 
} 

Consulte: https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#isNotEmpty(java.util.Collection)

1

Un buen exa MPLE de esto importa donde en la práctica es la ConcurrentSkipListSet implementation en el JDK, que establece:

Mira que, a diferencia de la mayoría de las colecciones, el método tamaño no es una operación de tiempo constante.

Esto es un caso claro en el que isEmpty() es mucho más eficiente que comprobar si size()==0.

Puede ver por qué, intuitivamente, este podría ser el caso en algunas colecciones. Si es el tipo de estructura en la que tiene que atravesar todo para contar los elementos, entonces, si todo lo que desea saber es si está vacío, puede detenerlo tan pronto como encuentre el primero.

6

if (CollectionUtils.isNotEmpty(listName))

es lo mismo que:

if(listName != null && !listName.isEmpty())

En primera aproximación puede ser listName no será lanzado nula y nula excepción de puntero. En el segundo enfoque, debe verificar null manualmente. El primer enfoque es mejor porque requiere menos trabajo de usted. Usar .size() != 0 es algo innecesario, también me enteré de que es más lento que usar .isEmpty()

0

Para la recolección de Check está vacía, puede usar el método: .count(). Ejemplo:

DBCollection collection = mMongoOperation.getCollection("sequence"); 
    if(collection.count() == 0) { 
     SequenceId sequenceId = new SequenceId("id", 0); 
     mMongoOperation.save(sequenceId); 
    } 
-2

Uso CollectionUtils.isEmpty (Colección coll)

cheque Null-seguro si la colección especificada está vacía. Null devuelve verdadero.

Parámetros: Coll - la colección de comprobar, puede ser nula

Devuelve: cierto si vacía o nula

Cuestiones relacionadas