java基础--特殊的String

  

1  String str = new  String( " a " );  

有人往往会问:他创建了几个对象?我想答案是众所周知的2个。这个问题也从一个侧面说出了String的一些不同。

    我们接着说创建String对象的另-中方式:

    

String str = " aaa "

显然,这种方式他创建了一个对象。这种方式是String特有的(确实我们在java中好像没有看到过也从来没有过其他对象这样的方式创建)。其实java中这样设置String,应该是让他和内置的基本类型定义时一致。

  然后我们再来看看这样一段代码:

String str1 = " hya " ;   
String str2
= " hya " ;  

他创建的对象还是一个,以前初学时我就感到疑惑。为什么会是一个呢?

   其实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):用于存储对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值