------------android培训 、java培训 、期待与您交流------------
public class Test {
public static void main(String[] args) {String str = "abc";
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str == str1);
System.out.println(str1 == "abc");
System.out.println(str2 == "abc");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
}
}
Java语言使用内存的时候,栈内存主要保存以下内容:基本数据类型和对象的引用,而堆内存存储对象,栈内存的速度要快于堆内存。
String str = "abc";
String str1= "abc";
第一句的真正含义是在String池中创建一个对象”abc”,然后引用时str指向池中的对象”abc”。第二句执行时,因为”abc”已经存在于String池了,所以不再创建,则str==str1返回true就明白了。str1==”abc”肯定正确了,在String池中只有一个”abc”,而str和str1都指向池中的”abc”。
String str2 = new String("abc");
这句话创建了2个String对象,而基于上面两句,只在栈内存创建str2引用,在堆内存上创建一个String对象,内容是”abc”,而str2指向堆内存对象的首地址。
str2==”abc”。
”abc”是位于String池中的对象,而str2指向的是堆内存的String对象,==判断的是地址,肯定不等了。
str1.equals(str2),这个是对的,String类的equals重写了Object类的equals()方法,实际就是判断内容是否相同。