Exploración de cadenas en Java

1.cadena

1. La clase String es inmutable después de la inicialización, y
sus métodos miembros predeterminan los métodos finales. Cualquier operación de cambio relacionada generará un nuevo objeto.

String str1 = "abc";
str1 = "bcd";
String str2 = new String("abc");
String str3="a"+"bc";
System.out.println(str1==str3); //true

En este momento, str1 solo apunta a la constante de cadena "bcd" en el grupo de constantes de cadena.
El objeto generado por la nueva palabra clave se almacena en el montón, y la referencia se almacena en la pila, es decir, str1 y str2 se almacenan en la pila, el "abc" generado por new se almacena en el montón y apunta a "bcd" en el grupo constante.

Hay un grupo de constante de cadena en el área del método jvm. Cada vez que creamos una constante de cadena, la JVM primero verificará el grupo de constante de cadena. Si la cadena ya existe en el grupo de constante, luego devolverá directamente la referencia de instancia en el grupo de constante. Si la cadena no existe en el grupo constante, la cadena se instancia y se coloca en el grupo constante. Debido a la inmutabilidad de las cadenas de cadenas, podemos estar bastante seguros de que no hay dos cadenas idénticas en el grupo constante.
El grupo constante en Java en realidad se divide en dos formas: grupo constante estático y grupo constante en tiempo de ejecución.

(1) Las cadenas creadas con "" comillas solas son constantes, y se determina que se almacenan en el Conjunto de cadenas en el momento de la compilación; (2) Los objetos creados usando una nueva Cadena ("") se almacenarán en el montón, que es nuevo en tiempo de ejecución Creado

2.String + signo

String s = "a" + "b" + "c"; 
String s1  =  "a"; 
String s2  =  "b"; 
String s3  =  "c"; 
String s4  =  s1  +  s2  +  s3;

La creación de s solo genera un objeto, mientras que s4 genera dos objetos, y cada vez que se genera un objeto;
La costura literal "+" se realiza durante la compilación. La operación de empalme "+" a la que hace referencia la cadena se realiza realmente en tiempo de ejecución, y la cadena recién creada se almacena en el montón.

2. Distinguir ==e igual

(1) Para ==, si actúa sobre una variable de tipo de datos básicos (byte, short, char, int, long, float, double, boolean), compare directamente si el "valor" almacenado es igual; si actúa sobre un tipo de referencia Variable (String), se compara la dirección del objeto señalado (es decir, si apunta al mismo objeto).

(2) El método equals es un método en la clase base Object, por lo que este método está disponible para todas las clases que heredan de Object. En la clase Object, el método igual se usa para comparar si las referencias de dos objetos son iguales, es decir, si apuntan al mismo objeto.

(3) Para el método de igualdad, tenga en cuenta que el método de igualdad no puede aplicarse a variables de tipos de datos básicos. Si el método igual no se reescribe, se compara la dirección del objeto señalado por la variable del tipo de referencia; y la clase String reescribe el método igual para comparar si las cadenas almacenadas en el objeto de cadena puntiaguda son iguales . Algunas otras clases, como Double, Date, Integer, etc., han reescrito el método de igualdad para comparar si el contenido de los objetos señalados es igual.

3. La diferencia entre String, StringBuffer, StringBuilder

(1) Los objetos en String son inmutables, lo que puede entenderse como constantes, obviamente seguros para subprocesos; la mayoría de los métodos en StringBuffer son modificados por la palabra clave sincronizada, por lo que son seguros para subprocesos; StringBuilder no es seguro para subprocesos;

4.String y StringBuffer pasan valor

public static void main(String[] args) {
		//1.String类型
		String str1="hello";
		String str2="world";
		System.out.println(str1+"----------------"+str2);//hello----------------world
		change(str1,str2);
		System.out.println(str1+"----------------"+str2);//hello----------------world
		
		//2.StringBuffer类型
		StringBuffer sb1=new StringBuffer("hello");
		StringBuffer sb2=new StringBuffer("world");
		System.out.println(sb1+"-----------------"+sb2);//hello----------------world
		change2(sb1,sb2);
		System.out.println(sb1+"-----------------"+sb2);//hello----------------worldworld
	}
 
	private static void change2(StringBuffer sb1, StringBuffer sb2) {
		sb1=sb2;
		sb2=sb1.append(sb2);
	}
 
	public static void change(String str1, String str2) {
		str1=str2;
		str2=str1+str2;
	}

Solo se pasan valores en Java, pero es importante saber si el valor es el valor real de la variable o la dirección del objeto referenciado.
En el método change (), str1 y str2 cambian el objeto puntiagudo, pero no tiene nada que ver con el método main;
el objeto al que apunta sb2 en el método change2 () cambia, y sb2 en main también apunta a ese objeto, lo que naturalmente afecta a las variables en main.

137 artículos originales publicados · Me gusta 123 · Visite 250,000+

Supongo que te gusta

Origin blog.csdn.net/lz20120808/article/details/85952526
Recomendado
Clasificación