有人往往会问:他创建了几个对象?我想答案是众所周知的2个。这个问题也从一个侧面说出了String的一些不同。
我们接着说创建String对象的另-中方式:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
显然,这种方式他创建了一个对象。这种方式是String特有的(确实我们在java中好像没有看到过也从来没有过其他对象这样的方式创建)。其实java中这样设置String,应该是让他和内置的基本类型定义时一致。
然后我们再来看看这样一段代码:
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
他创建的对象还是一个,以前初学时我就感到疑惑。为什么会是一个呢?
其实java里有一个字符串池的概念。确切地应该说是jvm中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。 (来自javaeye的定义)
当我们遇到String str1=“hya”的语句时,Java会先在字符串池中寻找是否已经存在"hya"这个字符串,如果没有,则建立字符串"hya"对象,然后变量 str1指向这个地址;然后遇到语句String str2=“hya”这时字符串池中已经有 "hya"了,所以直接让变量str2也指向这个地址。
我们再来看看String str=new String("a");这个语句如何处理的呢?"a"是字符串池中的一个对象,然后new String()是建立一个对象,并将句柄赋值给str,这与其他的对象建立没有什么不同。
以让的知识介绍完后,我们再来看看这个问题(考试哦!)
所以对于上面的一段代码,不管他们是不是同一个对象,他们的值都是Hello,所以用equqls方法,返回的值都是true。
由于java中String的用处十分的广,所以初于使用和性能上的考虑,对他作了一些特殊处理。最后我们再来说说String对象在JVM中的存储,以及字符串池与heap和stacK的关系。java中的数据主要存储在heap和stacK这两个数据结构中其中:栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。 堆(heap):用于存储对象。