//方式一:
String s = "wsy";
//方式二:
String s1 = new String("wsy");
我先试了试debug,发现变量s中里面有个数组名称为value的char数组
![](https://i-blog.csdnimg.cn/blog_migrate/58c42b0f354557363c618ead95aee6d5.png)
原来String类里面有个数组名称为value的char数组,并且是private final修饰的
![](https://i-blog.csdnimg.cn/blog_migrate/cc4588e75aaa86fd3504512fb76632ca.png)
为了更深一步了解String两种创建方式的区别,我试试看比较这两个变量的地址是否是一样的
//方式一:
String s = "wsy";
System.out.println(s.hashCode());
//方式二:
String s1 = new String("wsy");
System.out.println(s1.hashCode());
System.out.println(s == s1);
![](https://i-blog.csdnimg.cn/blog_migrate/124563879f1fe7fafc1d852f91fb33c4.png)
刚开始觉得很奇怪,为什么两个String类型的数据,它们的hashcode()相同,但是==的结果为false,后来我进入到String类里面一看原来String重写了hashCode方法,哈希值是根据字符串的内容来决定的,并不是内存地址,所以为了更深一步了解String两种创建方式的区别,这个方式不可行。
![](https://i-blog.csdnimg.cn/blog_migrate/6074c11f30dbaded2a103f2485fe51a4.png)
后来我又上网查了下,
String方式一:是先看常量池中是否有wsy,数据空间,如果有,直接指向,如果没有则重新创建,然后指向s最终指向的是常量池中的空间地址
方式二:先在堆中创建空间,里面维护了value属性,指向常量池的wsy空间。如果常量池没有“wsy”,重新创建,如果有,直接通过value指向,最终指向的是堆中的空间地址
![](https://i-blog.csdnimg.cn/blog_migrate/bc6d80a3779c19b2fafd00b7edd4ce88.png)