String创建
String是不变对象,即:字符串对象创建后,表示的子符内容不可变,若改变必定创建新对象- java对于字符串有一个优化,即:
字符串常量池,正式在堆内存中开辟的一块空间,用于保存所有使用字面量形式创建的字符串对象,当再次使用该字面量创建新的字符串是会直接重用而不会再创建新的,来节省内存开销。 java.lang.String使用了final修饰,不能被继承
public class StringDemo {
public static void main(String[] args) {
String str = "123abc"; //str1会重用str创建的字符串对象 String str1 = "123abc"; String str2 = "123abc"; System.out.println(str == str1); // true System.out.println(str == str2); //true } }
讯享网

3)修改内容会创建新对象
因为String类被final修饰,是不可变的,如果非要改变里面的值,那它会重新创建一个对象
讯享网public class StringDemo {
public static void main(String[] args) {
String str = "123abc"; //str1会重用str创建的字符串对象 String str1 = "123abc"; String str2 = "123abc"; str = str2 + "!"; //str不再指向原对象 System.out.println(str); //123abc! System.out.println(str2); //123abc System.out.println(str == str2); //false System.out.println(str1 == str2); //true } }

4)新new出一个String
public class StringDemo {
public static void main(String[] args) {
String str3 = new String("123abc"); System.out.println(str3);//123abc /* * str2与str3是两个不同的字符串对象,虽然内容都是“123abc”,但是两个对象保存的地址不同 */ System.out.println(str2 == str3);//false //equals比较只关心与值的比较,“ == ”比较的是内容,而引用类型中存的是地址 System.out.println(str2.equals(str3));//true } }
== 与 equal常常用来做对比
equals比较只关心与值的比较, “ == ”比较的是内容,而引用类型中存的是地址
5)编译器的特性
这里用到了编译器的一个特性:编译器在编译源代码时,当遇到一个计算表达式可以在编译期间确定结果时就会直接进行计算,并将结果编译到class文件中,这样JVM每次运行程序时就无需再计算。
eg:int a= 1+1;
编译器编译后class改为:int a = 2;
下面的字符串也是如此,会改为:String str4 = “123abc”;
讯享网public class StringDemo {
public static void main(String[] args) {
String str2 = "123abc"; String str4 = "123" + "abc";//编译器在编译时会把能直接计算的值计算 System.out.println(str4);//123abc System.out.println(str2 == str4);//true String s = "123"; String str5 = s + "abc";//s是变量,编译器在编译成class文件时不能直接计算出结果 System.out.println(str5);//123abc System.out.println(str2 == str5);//flase } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/23527.html