public class TestDemo {
public static void main(String[] args) {
// 创建常量的字符串
String str = "helloworld";
//创建字符串的对象
String str1 = new String("helloworld");
/**
* 进行判断.==进行的地址判断。str是直接先在栈区分一块内存,然后指向数据共享区的"helloworld".
* 而str1则先在栈区分一块内存,然后在堆内存中分一块区间来存放new String()
* 所有结果是false
*/
System.out.println(str == str1);
/**
* 使用equals比对的是值,所以结果是true
*/
System.out.println(str.equals(str1));
//定义两个字符串常量
String str2 = "hello";
String str3 = "hello";
/**
* str2对象建立时,先查找数据共享区是否有字符串"hello",若没有则在数据共享区创建一个hello字符串;
* str3对象建立时,也会先到数据共享区查找字符串"hello",已经存在,所有不会再创建。所以地址是一样的;
* 因此结果是ture
*/
System.out.println(str2 == str3);
//值判断,ture
System.out.println(str2.equals(str3));
//定义3个字符串常量
String str4 = "hello";
String str5 = "world";
String str6 = "helloworld";
/**
* 因为str4和str5是对象,对象的值是有可能会变的,所有即使(str4 + str5)拼接后为"helloworld"。
* 即使数据共享区已经有helloworld的字符串,系统还是会在数据共享区重新分配一个地址。
* 因此结果是false
* 另外(str4 + str5)创建的对象是放在数据共享区还是堆中?肯定是数据共享区,因为他们没有对应的引用,若是放在了堆中,很容易
* 就会被垃圾回收器回收了。
*/
System.out.println(str6 == (str4 + str5));
/**
* 因为("hello" + "world")是常量字符串,值是不会变的。
* 所以在数据共享区已经有helloworld的字符串的情况下,系统是不会再创建新的。
* 因此结果是ture
*/
System.out.println(str6 == ("hello" + "world"));
//值比较肯定是一样的,所以是ture
System.out.println((str4 + str5).equals(str6));
System.out.println(("hello" + "world").equals(str6));
}
}