String类型在Java中对象的比较的内存中的运行情况

来源:百度知道 编辑:UC知道 时间:2024/07/07 20:41:41
有以下程序代码片段(main方法和类定义就省略了)
String s1 = "1";
String s2 = "1";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

String ss1 = new String("1");
String ss2 = new String("1");
System.out.println(ss1 == ss2);
System.out.println(ss1.equals(ss2));

程序的输出结果为:
true
true
false
true

我的理解是String属于类(对象好像也可以说),而作为类类型与基本类型不同,他的对象是存放在内存中的堆里的,而把其引用(或称作指针)存放在内存中的栈里。

==运算符比较的是对象的引用,而equals比较的是对象的值。--这句话对吧?

为什么在上面的程序的运行结果会不同?????
哪位高人能说一说以上代码在内存中的情况(按照代码的顺序来)????

==是Object (所有类的父类)的equals方法
而String 的equsls方法为父类方法的重写 所以他们不比较对象本身 而是比较对象指向的字符串

这里涉及到java内存分配的问题
首先你要知道"1"是字符串常量
是存放在数据段的,或者叫常量池
当程序中出现"1"时虚拟机就去内存里找有没有现成的"1",有就不创建了
所以s1,s2指向的是同一内存空间
equals()的默认实现就是==,==比较的是对象的hashcode,可以简单理解为地址,或者说对象引用里的内容,而不是对象里的内容,ss1和ss2是两个对象,占据了堆内存中的两块内存空间(局部变量ss1,ss2在栈内存),所以s1==s2,ss1!=ss2
equals()方法是想要比较对象里的内容相等否,一般由用户重写实现,另jvm已经对String和Date这两个常用对象的equals()进行了重写,方法体中比较的是对象内容,所以s1 equals s2,ss1 equals ss2

==运算符比较的是对象的引用,而equals比较的是对象的值 ---这句话对
ss1不等ss2 因为这两个是你定义的。