El rol de crear un nuevo objeto de colección cuando una colección se pasa como un parámetro de función

Colección de listas propensa a errores

Cuando se usan colecciones de listas para anidar colecciones , es común ver un código como este:

List<Integer> list = new ArrayList<Integer>();
		
		//一些对list集合的操作
		
		List<List<Integer>> res = new ArrayList<List<Integer>>();

		res.add(new ArrayList<Integer>(list));

Usted se estará preguntando ¿por qué no res.add(list)? ¿Es estonew ArrayList(list) redundante? Simplemente escribamos el código y veamos los resultados:
1. La primera forma de escribir

class Main{
    
    
public static void main(String[] args) {
    
    
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		res.add(list);	
		System.out.println("res: "+res);
		System.out.println("list: "+list);
		
	//运行结果	
	//   	res: [[1, 2]]
    //     list: [1, 2]
	}	
}

2. La segunda forma de escribir

class Main{
    
    
public static void main(String[] args) {
    
    
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		res.add(new ArrayList<Integer>(list));	
		System.out.println("res: "+res);
		System.out.println("list: "+list);
		
	//运行结果	
	//   	res: [[1, 2]]
    //     list: [1, 2]
	}	
}

Se encuentra que los resultados son los mismos, pero ¿son realmente los mismos? Realicemos algunas operaciones en la colección de listas para continuar con las pruebas.

class Main{
    
    
public static void main(String[] args) {
    
    
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		res.add(list);	
		list.clear();
		System.out.println("res: "+res);
		System.out.println("list: "+list);
		
	//运行结果	
	//   	res: [[]]
    //     list: []
	}	
}
class Main{
    
    
public static void main(String[] args) {
    
    
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		res.add(new ArrayList<Integer>(list));		
		list.clear();
		System.out.println("res: "+res);
		System.out.println("list: "+list);
		
	//运行结果	
	//  res: [[1, 2]]
   //   list: []
	}	
}

La operación de borrar la lista encontrará que los resultados de los dos métodos de escritura ya no son los mismos. La razón de esto es que res.add(list)este método de escritura es agregar el objeto de la lista directamente a la colección res. En este momento, nuestra modificación a la colección de listas también cambiará la res El valor de la colección de listas agregada a la colección.

Si se trata res.add(new ArrayList <Integer> (list));de un nuevo conjunto agregado al conjunto res en este momento que tiene los mismos elementos de datos que los elementos de datos almacenados en el conjunto de listas, la modificación del conjunto de listas en este momento no afectará el conjunto res.

Se puede ver que una colección es un objeto que corresponde a un valor de dirección, los elementos almacenados en diferentes colecciones pueden ser los mismos, pero los valores de dirección correspondientes son diferentes. Si se modifica un conjunto, también se modificarán los datos del elemento correspondientes al conjunto con este conjunto como datos del elemento (el valor de la dirección es el mismo).

Supongo que te gusta

Origin blog.csdn.net/qq_52595134/article/details/122628670
Recomendado
Clasificación