Categorías
Collections Generics Versus

Conjunto frente a conjunto

Es posible que sepa que un conjunto comodín ilimitado Puede contener elementos de cualquier tipo, y un conjunto de tipo sin formato también puede contener elementos de cualquier tipo. ¿Cuál es la diferencia entre ellos?

1. Dos hechos sobre Set

Hay dos hechos sobre Set :
Ítem ​​1: ¿Desde el signo de interrogación? representa cualquier tipo. El conjunto Es capaz de contener cualquier tipo de elementos.
Ítem ​​2: Debido a que no sabemos el tipo de?, No podemos poner ningún elemento en el Conjunto

Entonces, un Conjunto Puede contener cualquier tipo de elemento (Elemento 1), pero no podemos poner ningún elemento en él (Elemento 2). ¿Las dos declaraciones entran en conflicto entre sí? Por supuesto que no lo son. Esto se puede ilustrar claramente con los dos ejemplos siguientes:

El artículo 1 significa la siguiente situación:

//Legal Code
public static void main(String[] args) {
	HashSet<Integer> s1 = new HashSet<Integer>(Arrays.asList(1, 2, 3));
	printSet(s1);
 
	HashSet<String> s2 = new HashSet<String>(Arrays.asList("a", "b", "c"));
	printSet(s2);
}
 
public static void printSet(Set<?> s) {
	for (Object o : s) {
		System.out.println(o);
	}
}

Dado que Set Puede contener cualquier tipo de elementos, simplemente usamos Object en el ciclo.

El artículo 2 significa la siguiente situación que es ilegal:

//Illegal Code
public static void printSet(Set<?> s) {
	s.add(10);//this line is illegal 
	for (Object o : s) {
		System.out.println(o);
	}
}

Debido a que no conocemos el tipo de Exactamente, no podemos agregarle nada más que nulo. Por la misma razón, no podemos inicializar un conjunto con Set . Lo siguiente es ilegal:

//Illegal Code
Set<?> set = new HashSet<?>();

2. Establecer vs. Establecer

¿Cuál es la diferencia entre el conjunto de tipo sin formato y el conjunto de caracteres comodín ilimitado ?

Esta declaración de método está bien:

public static void printSet(Set s) {
	s.add("2");
	for (Object o : s) {
		System.out.println(o);
	}
}

porque el tipo crudo no tiene restricciones. Sin embargo, esto corromperá fácilmente el invariante de la colección.

En resumen, el tipo comodín es seguro y el tipo sin formato no lo es. No podemos poner ningún elemento en un Conjunto .

3. ¿Cuándo es útil Establecer ?

Cuando desee utilizar un tipo genérico, pero no sepa o no le importe cuál es el tipo real del parámetro, puede utilizar [1]. Solo se puede utilizar como parámetros para un método.

Por ejemplo:

public static void main(String[] args) {
	HashSet<Integer> s1 = new HashSet<Integer>(Arrays.asList(1,2,3));
	HashSet<Integer> s2 = new HashSet<Integer>(Arrays.asList(4,2,3));
 
	System.out.println(getUnion(s1, s2));
}
 
public static int getUnion(Set<?> s1, Set<?> s2){
	int count = s1.size();
	for(Object o : s2){
		if(!s1.contains(o)){
			count++;
		}
	}
	return count;
}

Referencia:

1. Bloch, Joshua. Java efectivo. Addison-Wesley Professional, 2008.

  https://www.programcreek.com/2008/12/53/

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *