Java中字符串直接赋值和new一个对象,得到的地址值是什么样子的

public class StringDemo2 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";

    System.out.println("s1:" + s1.getClass().getName() + "@" + s1.hashCode());
    System.out.println("s2:" + s2.getClass().getName() + "@" + s2.hashCode());
    System.out.println("s3:" + s3.getClass().getName() + "@" + s3.hashCode());

    System.out.println("s1==s2:" + (s1 == s2));
    System.out.println("s1.equals(s2):" + s1.equals(s2));
    System.out.println("s1==s3:" + (s1 == s3));
    System.out.println("s1.equals(s3):" + s1.equals(s3));
}

}

图片说明

s1==s2结果是false,说明它们的地址值是不同的。但是为什么s1.getClass().getName() + "@" + s1.hashCode()ode(2/s1.getClass().getName() + "@" 2 s1.hashCode()却是一样的???

同问2|评论0|浏览2162|收藏0|

分享

3个回答

按赞数排序 

zhangpan_soft

zhangpan_soft   2016.09.04 14:08

java中,所有的引用放在栈内存中,所有的值放在堆内存中,而堆又分好多块,new 对象必然开辟对空间,放在大众的堆空间中,这部分是内存独立的,
所以如果有字符串String s1=new String(123);那么如果有String s2=new String(123);呢么s1,s2都会被分配内存空间,地址就不一样。
而直接赋值是放在堆空间中的“串池”中,它里面放的是具体的数值,常量,比如说ASCII,基本数据,等等,这块区域的数值是共享的。也就是说:
假如有字符串String s1 = "123";呢么如果有字符串String s2="123";那么字符串s2是不占用内存空间的,会直接把s2的引用指向“串池”中的“123”,所以s1和s2的地址一样。
至于直接new 的和直接赋值的,不用说了,存放的内存空间都不一样,自然地址也就不一样。

猜你喜欢

转载自blog.csdn.net/qq_35568099/article/details/83536898
今日推荐