**java中string与new String的相关实现与区别**
事例:
String hello=“123”;此时的这个声明的执行过程,首先在栈区中创建引用,然后去string的常量池中去找这个以“123”为值的这个对象。
如果没有的话,我们进行创建,这时候创建的这个字符串指向这个对象;
如果有,那就不需要创建,将现在的zhu指向该对象也就是“123”
加入此时又来了一个String hello1=“12”,那么这个对象zhu1就不会指向"123",而是去指向常量池中的"12",同样的道理,这时候再定义一个,String hello2=“12”,那么是在常量池中是存在的,那么将不会创建新的地址,所以hello2和hello1都会指向这个"12",所以如果将hello1== hello2比较的时候输出的结果为true,因为地址是没有发生变化的。但是如果hello1拼接了hello1+“k”,hello2拼接了hello2+“q”,那么此时的发地址是发生了变化的,所以hello1==hello2这个时候,输出的结果是false。
但是String ww = new String(“有的是”); 这个的实现过程就是直接在堆内存中创建,但是如果此时又有String ww1 = new String(“有的是”); ww1不会指向这个对象,它会创建一个新的对象并指向它,所以这时候如果比较的时候 ww == ww1,这时的结果是false,因为创建了两次对象,地址不相同,但是如果用 ww.equals(ww1)的时候却是true,因为两次创建的时候内容是相同的。
注意几点:
1. 栈内存存储的是引用和基本数据类型
2. 堆内存存储的是对象
3. ==是比较的是值的内存地址
4. equals是比较的是字符的内容
代码实例如下:
public static void main(String[] args) {
/**
* string字符串进行比较的时候,当声明一个变量的时候 String zhu = "456";
* 会先去常量池中找,如果在常量池中不含有这个"456",那么就会创建一个新的值为"456"的对象,此时的内存地址是不一样的
* 如果在下一次的时候出现了"456"这个字符串,那么此时的这个对象就会共同指向"456"这个对象
*/
String str = "456";
String str1= "456";
String str2 ="123";
String a = new String("123");
String a1 = new String("123");
String a2 = new String("456");
//equals将此字符串与指定的字符串进行比较,当参数不为空的时候并且表示与该对象有相同的字符序列的字符对象时,结果为真
System.out.println(str.equals(str1));//true
System.out.println(str==str1);//true
System.out.println(str.equals(a2));//true
System.out.println(str.equals(a));//true
System.out.println(a.equals(a1));//true
System.out.println(a==a1);//false
System.out.println(str==a2);//false
}
以上是对string与new String的相关理解,本人基础比较薄弱,如有不好的地方请多多指教,希望此篇可以帮助到大家。