- ImmutableMap, como sugiere el nombre, es un tipo de mapa que es inmutable. Significa que el contenido del mapa es fijo o constante después de la declaración, es decir, son de solo lectura .
- Si se intenta agregar, eliminar y actualizar elementos en el mapa, se lanza la excepción UnsupportedOperationException .
- Un ImmutableMap tampoco permite elementos nulos.
- Si se intenta crear un ImmutableMap con un elemento nulo, se lanza NullPointerException . Si se intenta agregar un elemento nulo en el mapa, se lanza la excepción UnsupportedOperationException .
Ventajas de ImmutableMap
- Son seguros para subprocesos.
- Son eficientes en memoria.
- Dado que son inmutables, pueden transferirse a bibliotecas de terceros sin ningún problema.
Tenga en cuenta que es una colección inmutable, no una colección de objetos inmutables, por lo que los objetos que contiene pueden modificarse.
Declaración de clase:
@GwtCompatible(serializable=true, emulated=true) public abstract class ImmutableMap extends Object implements Map, Serializable
Jerarquía de clases:
java.lang.Object ↳ com.google.common.collect.ImmutableMap
Creación de ImmutableMap
ImmutableMap se puede crear mediante varios métodos. Éstos incluyen:
- Desde el mapa existente usando la función copyOf() de Guayaba
// Below is the Java program to create ImmutableMap
import
com.google.common.collect.ImmutableMap;
import
java.util.HashMap;
import
java.util.Map;
class
MapUtil {
// Function to create ImmutableMap from Map
public
static
<K, T>
void
iMap(Map<K, T> map)
{
// Create ImmutableMap from Map using copyOf()
ImmutableMap<K, T> immutableMap = ImmutableMap.copyOf(map);
// Print the ImmutableMap
System.out.println(immutableMap);
}
public
static
void
main(String[] args)
{
Map<Integer, String> map =
new
HashMap<Integer, String>();
map.put(
1
,
"Geeks"
);
map.put(
2
,
"For"
);
map.put(
3
,
"Geeks"
);
iMap(map);
}
}
Producción:
{1=Geeks, 2=For, 3=Geeks}
- Nuevo ImmutableMap usando la función of() de Guava
// Below is the Java program to create ImmutableMap
import
com.google.common.collect.ImmutableMap;
import
java.util.HashMap;
import
java.util.Map;
class
MapUtil {
// Function to create ImmutableMap
public
static
void
createImmutableMap()
{
// Create ImmutableMap using of()
ImmutableMap<Integer, String> immutableMap = ImmutableMap.of(
1
,
"Geeks"
,
2
,
"For"
,
3
,
"Geeks"
);
// Print the ImmutableMap
System.out.println(immutableMap);
}
public
static
void
main(String[] args)
{
createImmutableMap();
}
}
Producción:
{1=Geeks, 2=For, 3=Geeks}
- Usando el método Java 9 Factory Of()
En Java, use of() con Set, Map o List para crear un mapa inmutable.
Tenga en cuenta: los programas a continuación son de Java 9. Por lo tanto, necesitaría un compilador de Java 9 para ejecutarlos.
// Java code illustrating of() method to
// create a ImmutableSet
import
java.util.*;
import
com.google.common.collect.ImmutableMap;
class
GfG {
public
static
void
main(String args[])
{
// non-empty immutable set
Map<Integer, String> map = Map.of(
1
,
"Geeks"
,
2
,
"For"
,
3
,
"Geeks"
);
// Let's print the set
System.out.println(map);
}
}
Producción:
{1=Geeks, 2=For, 3=Geeks}
- Usando Builder() de ImmutableMap
En Guava, la clase ImmnutableMap proporciona una función Builder(). A través de esta función, se puede crear un nuevo ImmutableMap o se puede crear
un ImmutableMap a partir de un mapa existente o ambos.- Creando un nuevo ImmutableMap
// Java code illustrating of() method to
// create a ImmutableSet
import
java.util.*;
import
com.google.common.collect.ImmutableMap;
class
GfG {
public
static
void
main(String args[])
{
// non-empty immutable set
ImmutableMap<Integer, String> imap =
ImmutableMap.<Integer, String>builder()
.put(
1
,
"Geeks"
)
.put(
2
,
"For"
)
.put(
3
,
"Geeks"
)
.build();
// Let's print the set
System.out.println(imap);
}
}
Producción:
{1=Geeks, 2=For, 3=Geeks}
- Creación de un mapa inmutable a partir de un mapa existente
// Java code illustrating of() method to
// create a ImmutableSet
import
java.util.*;
import
com.google.common.collect.ImmutableMap;
class
GfG {
public
static
void
main(String args[])
{
// non-empty immutable set
Map<Integer, String> map = Map.of(
1
,
"Geeks"
,
2
,
"For"
,
3
,
"Geeks"
);
ImmutableMap<Integer, String> imap =
ImmutableMap.<Integer, String>builder()
.putAll(map)
.build();
// Let's print the set
System.out.println(imap);
}
}
Producción:
{1=Geeks, 2=For, 3=Geeks}
- Creando un nuevo ImmutableMap incluyendo el Mapa existente
// Java code illustrating of() method to
// create a ImmutableSet
import
java.util.*;
import
com.google.common.collect.ImmutableMap;
class
GfG {
public
static
void
main(String args[])
{
// non-empty immutable set
Map<Integer, String> map = Map.of(
1
,
"Geeks"
,
2
,
"For"
,
3
,
"Geeks"
);
ImmutableMap<Integer, String> imap =
ImmutableMap.<Integer, String>builder()
.putAll(map)
.put(
4
,
"Computer"
)
.put(
5
,
"Portal"
)
.build();
// Let's print the set
System.out.println(imap);
}
}
Producción:
{1=Geeks, 2=For, 3=Geeks, 4=Computer, 5=Portal}
- Creando un nuevo ImmutableMap
Intenta cambiar ImmutableMap
Como se mencionó anteriormente, el siguiente programa lanzará UnsupportedOperationException .
// Java code to show that UnsupportedOperationException // will be thrown when ImmutableMap is modified. import java.util.*; class GfG { public static void main(String args[]) { // empty immutable map Map<Integer, String> map = Map.of(); // Lets try adding element in these set map.put(1, "Geeks"); map.put(2, "For"); map.put(3, "Geeks"); } }
Producción :
Exception in thread "main" java.lang.UnsupportedOperationException at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:218) at ImmutableListDemo.main(Main.java:16)
¿En qué se diferencia de Collections.unmodifiableMap()?
Collections.unmodifiableMap crea un contenedor alrededor del mismo mapa existente de modo que el contenedor no se puede usar para modificarlo. Sin embargo, aún podemos cambiar el mapa original.
// Java program to demonstrate that a Map created using // Collections.unmodifiableMap() can be modified indirectly. import java.io.*; import java.util.*; class GFG { public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "Geeks"); map.put(2, "For"); map.put(3, "Geeks"); // Create ImmutableMap from Map using copyOf() Map<Integer, String> imap = Collections.unmodifiableMap(map); // We change map and the changes reflect in imap. map.put(4, "Computer"); map.put(5, "Portal"); System.out.println(imap); } }
Producción:
{1=Geeks, 2=For, 3=Geeks, 4=Computer, 5=Portal}
Si creamos un ImmutableMap a partir de un Mapa existente y cambiamos el Mapa existente, el ImmutableMap no cambia porque se crea una copia.
// Below is a Java program for // Creating an immutable Map using copyOf() // and modifying original Map. import java.io.*; import java.util.*; import com.google.common.collect.ImmutableMap; class GFG { public static void main(String[] args) { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "Geeks"); map.put(2, "For"); map.put(3, "Geeks"); // Create ImmutableMap from Map using copyOf() ImmutableMap<Integer, String> imap = ImmutableMap.copyOf(map); // We change map and the changes wont reflect in imap. map.put(4, "Computer"); map.put(5, "Portal"); System.out.println(imap); } }
Producción :
{1=Geeks, 2=For, 3=Geeks}
Publicación traducida automáticamente
Artículo escrito por RishabhPrabhu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA