String类:
1、字符串是由多个字符组成的一串数据(字符序列)
2、字符串可以看成是字符数组
3、字符串的值是常量,不能被改变
例: String str = "hello";
str += "world";
System.out.println(str);
原理:字符串直接赋值的方式是到常量池去找,如果有就返回(内存地址),如果
没有就创建并返回(内存地址)。
分析:首先在常量池中找有没有hello,一开始肯定是没有的,所以在字符串常
量池中创建一个hello(常量),然后把内存地址赋值给str(引用变量),拼
接world的时候,再去常量池中去找world,没有,创建world再把hello
和world进行拼接,变成helloworld,最后把helloworld的地址赋值给
str(引用变量)
例1: String s = new String("hello");与String s = "hello";的区别
测试:
String str1 = new String("hello");
String str2 = "hello";
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
分析:"==":比较引用数据类型时,比较的是地址值是否相同
"equals":比较引用数据类型默认也是比较地址值是否相同,而String类重写
了equals()方法,比较的是内容是相同所以,第一句输出是false,第二句输
出的true。由第一句输出的结果可以看出str1与str2指向的内存地址是不一
样的
过程:
String str1 = new String("hello");
首先在堆内存中开辟一块空间,再到常量池中去找是否存在"hello",如果有就
直接返回,如果没有就创建一个并返回内存地址,然后将常量池返回的内存地址
保存到堆内存开辟的空间中,再将堆内存的内存地址赋值给引用变量str1
String str2 = "hello";
首先去常量池中去找是否存在"hello",如果有就直接返回,如果没有就创建一
个并返回内存地址,然后将返回的内存地址赋值个引用变量str2
结论:常量池中不存在目标对象时,前者会创建两个字符串对象(堆内存一个,常量池
一个),后者会创建一个字符串对象(常量池一个)常量池中存在目标对象时,前
者会创建一个字符串对象(在堆内存中创建一个),后者不需要创建字符串对象
(直接使用常量池中的对象)
例2: String str1 = "hello";
String str2 = "world";
String str3 = "helloworld";
System.out.println(str3 = str1 + str2); //false
System.out.println(str3.equals(str1 + str2)); //true
System.out.println(str3 = "hello" + "world"); //ture
System.out.println(str3.equals("hello" + "world")); //true
原理: 字符串如果是变量相加,先开空间,再拼接字符串字符串如果是常量相加,是
先拼接,然后到常量池去找,如果有就直接返回,否则就创建并返回内存地址
附:可以通过反编译工具查看,结论更加清晰
java String类创建对象与直接赋值的区别
最新推荐文章于 2023-04-07 23:20:19 发布