Java中,String str = new String(“abc”)时,会在虚拟机栈中创建String类型的字符串对象的引用str;然后在堆中创建“abc”的String对象;最后str指向堆中的“abc”对象。
class文件中,如果用到字符串,会先到字符串常量池中找看有没有,如果有,则把引用指向常量池中的字符串对象,如果没有,则在常量池中创建字符串对象;如String str = "abc"时,会先在常量池中查找有没有“abc”的字符串,有的话把“abc”对象的地址赋值给str,没有的话则在常量池中创建。
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "opp";
String b = new String("liuyucai");
String c = "opp";
String d = new String("opp");
System.out.println(b == "liuyucai"); //比较地址 false
System.out.println(b.equals("liuyucai")); //比较值 true
System.out.println(a== c); //比较地址 true
System.out.println(a.equals(c)); //比较值 true
System.out.println(a== d); //比较地址 false 说明在堆中创建了一个字符串"opp"对象, 即使常量池中有了字符串对象,但是new时仍在堆中创建
System.out.println(a.equals(d)); //比较值 true
System.out.println(a== "opp"); //true 说明此时得“opp”从常量池中获取
System.out.println(a.equals("opp"));//true
System.out.println(a=="abc"); //false
String k = "abc";
System.out.println(k == "abc"); //true 说明 a==“abc”时在常量吃中创建了"abc"对象,String k = "abc",时,k指向常量池得对象
}
}
"=="和equal的区别
在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。但是String类中重写了该方法,只比较值
- 对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址
- 对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。