¡Entendamos la colección inmutable en Java de otra manera! ! !

Ejemplo de colección inmutable:

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
        "red",
        "orange",
        "yellow",
        "green",
        "blue",
        "purple");

class Foo {
    Set<Bar> bars;
    Foo(Set<Bar> bars) {
        this.bars = ImmutableSet.copyOf(bars); // defensive copy!
    }
}

Por que usar colecciones inmutables

Los objetos inmutables tienen muchas ventajas, que incluyen:

  • Cuando el objeto es llamado por una biblioteca que no es de confianza, la forma inmutable es segura;

  • Cuando varios subprocesos llaman a objetos inmutables, no hay problema de condición de carrera

  • Las colecciones inmutables no necesitan considerar cambios, por lo que puede ahorrar tiempo y espacio. Todas las colecciones inmutables tienen una mejor utilización de la memoria (análisis y detalles de prueba) que sus formas mutables;

  • Dado que los objetos inmutables son fijos, se pueden utilizar de forma segura como constantes.

  • Crear copias inmutables de objetos es una buena técnica de programación defensiva. Guava proporciona versiones inmutables simples y fáciles de usar para todos los tipos de colección estándar de JDK y los nuevos tipos de colección de Guava. El JDK también proporciona el método Collections.unmodifiableXXX para envolver la colección en una forma inmutable, pero creemos que no es lo suficientemente bueno:

  • Voluminoso y engorroso: no se puede usar cómodamente en todos los escenarios en los que desea hacer copias defensivas;

  • Inseguro: asegúrese de que nadie modifique la colección original por referencia y que la colección devuelta sea de hecho inmutable;

  • Ineficiencia: la colección empaquetada aún conserva la sobrecarga de la colección de variables, como la verificación de modificaciones simultáneas, espacio adicional para la tabla hash, etc.

Si no necesita modificar una colección determinada, o desea que una colección determinada permanezca sin cambios, es una buena práctica copiarla a la defensiva en una colección inmutable.

Nota importante: todas las implementaciones de colecciones inmutables de Guava no aceptan valores nulos. Hemos realizado un estudio detallado sobre la base de código interno de Google y hemos descubierto que solo el 5% de los casos necesitan permitir elementos nulos en la colección, y el 95% restante de las escenas fallan rápidamente cuando encuentran un valor nulo. Si necesita utilizar null en colecciones inmutables, utilice el método Collections.unmodifiableXXX en el JDK. Para obtener sugerencias más detalladas, consulte "Usar y evitar nulos".

Cómo usar colecciones inmutables

Las colecciones inmutables se pueden crear de varias formas:

  • método copyOf, como ImmutableSet.copyOf (set);
  • de método, como ImmutableSet.of ("a", "b", "c") o ImmutableMap.of ("a", 1, "b", 2);
  • Herramientas de construcción como
public static final ImmutableSet<Color> GOOGLE_COLORS =
        ImmutableSet.<Color>builder()
            .addAll(WEBSAFE_COLORS)
            .add(new Color(0, 191, 255))
            .build();

Además, para las colecciones inmutables ordenadas, la clasificación se realiza cuando se construye la colección, como por ejemplo:

ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");

Clasificará los elementos en a, b, c, d durante la construcción.

CopyOf más inteligente de lo imaginado

Tenga en cuenta que el método ImmutableXXX.copyOf intentará evitar hacer copias cuando sea seguro; no se conocen los detalles de implementación reales, pero generalmente es muy inteligente, como:

ImmutableSet<String> foobar = ImmutableSet.of("foo", "bar", "baz");
thingamajig(foobar);

void thingamajig(Collection<String> collection) {
    ImmutableList<String> defensiveCopy = ImmutableList.copyOf(collection);
    ...
}

En este código, ImmutableList.copyOf (foobar) devolverá directamente foobar.asList () de forma inteligente, que es una vista de lista de ImmutableSet con una complejidad de tiempo constante. Como exploración, ImmutableXXX.copyOf (ImmutableCollection) intentará evitar la copia de tiempo lineal en las siguientes situaciones:

  • Es posible utilizar la estructura de datos subyacente en tiempo constante; por ejemplo, ImmutableSet.copyOf (ImmutableList) no se puede completar en tiempo constante.
  • Sin fugas de memoria, por ejemplo, si tiene una gran colección inmutable ImmutableList hugeList, ImmutableList.copyOf (hugeList.subList (0, 10)) se copiará explícitamente para evitar la retención innecesaria de referencias hugeList .
  • No cambia la semántica, por lo que ImmutableSet.copyOf (myImmutableSortedSet) se copiará explícitamente, porque ImmutableSet tiene una semántica diferente para hashCode () y es igual en comparación con el ImmutableSortedSet basado en comparadores. Evitar la copia lineal cuando sea posible puede minimizar la sobrecarga de rendimiento de los estilos de programación defensivos.

vista asList

Todas las colecciones inmutables tienen un método asList () para proporcionar una vista ImmutableList para ayudarlo a leer fácilmente los elementos de la colección en forma de lista. Por ejemplo, puede usar sortedSet.asList (). Get (k) para leer el k-ésimo elemento más pequeño de ImmutableSortedSet.

La ImmutableList devuelta por asList () suele ser, no siempre, una implementación rentable de la vista, en lugar de simplemente copiar los elementos en la Lista. En otras palabras, la vista de lista devuelta por asList suele ser mejor que el rendimiento promedio de la lista general. Por ejemplo, cuando la colección subyacente lo admite, siempre usa el método contiene eficiente.

Al final

Responda a los datos mediante un mensaje privado para recibir un resumen de las preguntas de la entrevista de Java de un fabricante importante + manual de Alibaba Taishan + una guía de aprendizaje para los puntos de conocimiento + un resumen de los puntos de conocimiento básicos de Java en un documento pdf de 300 páginas.

Inserte la descripción de la imagen aquí

El contenido de estos materiales son todos los puntos de conocimiento que el entrevistador debe preguntar durante la entrevista. El capítulo incluye muchos puntos de conocimiento, incluidos conocimientos básicos, colecciones de Java, JVM, concurrencia multiproceso, principios de primavera, microservicios, Netty y RPC, Kafka , Diario, patrón de diseño, algoritmo Java, base de datos, Zookeeper, caché distribuida, estructura de datos, etc. expediente

Supongo que te gusta

Origin blog.csdn.net/weixin_46577306/article/details/107869428
Recomendado
Clasificación