Java learning 6: creación de instancias y comparación de tamaños de objetos String

Comparación de instancias y tamaño de objetos String

Creación de instancias de objetos String:

1. Dos formas de obtener objetos String

package Main;
import java.util.Scanner;

public class Main {
    
    
	
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		
		String str1 = sc.next();
		System.out.println("str1 = " + str1);
		
		String GetChar = sc.nextLine();
		System.out.println("只是为了读取回车,处理缓冲区!");
		
		String str2 = sc.nextLine();
		System.out.println("A line String str2 = " + str2);
		
		String str3 = "Hello World";
		System.out.println("Static String str3 = " + str3);
		
		String str4 = new String("Hello World");
		System.out.println("String str4 = " + str4);
		
		sc.close();
	}

}

Peinar el conocimiento:

Primero: lee una cadena con espacios

¡Déjame hablar primero sobre cómo obtener una cadena de la entrada del teclado! El método general next (); es leer el final del espacio o la marca de retorno de carro, y desde el espacio o el retorno de carro hasta el final del tipo de teclado (incluido el retorno de carro) se colocará en el búfer, lo que significa que Scanner escanea La lectura de línea es la misma que scanf () del lenguaje C; la entrada estándar es la misma, ¡no la entrada de flujo de E / S de C ++!
¿Cómo resolver este problema de búfer?
¡Agregue una variable de tipo String y lea el búfer específicamente! Se puede ver el código anterior.

Segundo: inicialización estática de objetos String e inicialización dinámica

Sabemos que la inicialización estática consiste en asignar una cadena a un objeto String, pero ¿cómo funciona esta asignación? De hecho, el objeto String (como strObj) se utiliza como referencia a la clase String. Para decirlo sin rodeos, este objeto es en realidad un número en el área de la pila y su significado es la primera dirección del objeto, es decir, la referencia. Originalmente, una cadena estática tiene su propio espacio de almacenamiento, es decir, un espacio en el área del montón, y también tiene su primera dirección establecida. Suponga:

El proceso de inicialización estática:

Cadena estática: "Hola mundo" -----> Init = 0x0000

Inicialización estática StrObj = "Hola mundo" -----> StrObj = 0x0000

La desventaja es que tanto StrObj como Init apuntan a la misma dirección, lo cual es muy peligroso. Una vez que una variable es recolectada como basura, es probable que se acceda a otro objeto nuevamente, ¡pero tal acceso no está permitido! Es una posible causa de la excepción de puntero nulo.

El proceso de inicialización dinámica:

String str = new String ("Hola mundo");

Genere objetos anónimos: Init = 0x0000 -----> Init = "Hello World"

Llame al constructor de copia (capa inferior): str = 0x0011 -----> str = "Hello World"

Esto no causará el problema de excepción de puntero nulo mencionado anteriormente, de hecho, ¡hay otros problemas! Cuando comparamos objetos de la clase String, ¡comparamos sus direcciones! ! !
Este es el problema de la comparación de cadenas que describiremos brevemente más adelante.

Comparación de tamaño de los objetos String:

package Main;
import java.util.Scanner;

public class Main {
    
    
	
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		
		String str1 = sc.nextLine();
		
		String str2 = "Hello World";
		
		String str3 = new String("Hello World");
		
		System.out.println(str1 == str2);
		System.out.println(str1 == str3);
		System.out.println(str2 == str3);
		
		
		sc.close();
	}

}
Primero echemos un vistazo a la salida:

Inserte la descripción de la imagen aquí

¿Por qué es esto? De acuerdo con lo que hemos dicho anteriormente, podemos saber que los objetos String son en realidad referencias, por lo que cuando comparamos objetos, en realidad estamos comparando sus direcciones. Obviamente, estas direcciones no son las mismas (si tiene alguna pregunta, por favor envíeme un mensaje)

Deduzca otras cosas: no puede comparar cadenas con operadores de comparación de tamaño normal

Entonces, ¿qué método se utiliza?

compareTo (); Introducción al método:

package Main;
import java.util.Scanner;

public class Main {
    
    
	
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		
		String str1 = sc.nextLine();
		
		String str2 = "Hello World";
		
		String str3 = new String("Hello World");
		
		System.out.println(str1.compareTo(str2));
		System.out.println(str1.compareTo(str3));
		System.out.println(str2.compareTo(str3));
		
		
		sc.close();
	}

}
Primero echemos un vistazo a los resultados de la ejecución:

Inserte la descripción de la imagen aquí

para resumir:

De hecho, este objeto .compareTo (el objeto que se está comparando
); es exactamente igual que strcmp (str1, str2); en lenguaje C, que devuelve la diferencia (0/1 / -1) de las dos cadenas.
Obviamente, si las dos cadenas son iguales, devuelve 0, el objeto anterior es pequeño, devuelve -1, de lo contrario devuelve 1 ...

¡Así que hoy analizamos profundamente y dominamos las diferencias entre los diferentes métodos de instanciación de objetos String desde la perspectiva de la instanciación de objetos, la referencia y la construcción de copias, así como los métodos y métodos de comparación de tamaño!

Supongo que te gusta

Origin blog.csdn.net/qq_44274276/article/details/104901061
Recomendado
Clasificación