java-字符串创建与存储机制

在Java语言中,字符串有着非常重要的作用,字符串的声明与初始化主要有如下两种情况:

1)对于String s1 = new String("abc")语句与String s2 = new String("abc")语句,存在两个引用对象s1,s2,两个内容相同的字符串对象"abc",它们在内存中的地址是不同的。简而言之,只要用到new都会生成新的对象。

2)对于String s1 = "abc"语句与String s2 ="abc",它们的内容相同,如果存在太多内容的对象都要占内存的话,就会浪费太多的空间。在JVM中存在了一个字符串池(或称String Table,字符串表,字符串哈希表,字符串常量池等),其中保存着很多的String类的对象,并且可以被共享使用,s1,s2引用的是同一个常量池中的对象。由于String采用了Flyweight的设计模式,当创建一个字符串常量时,例如String s = "abc",会首先在字符串常量池中查找是否有相同的字符串被定义,其判断依据是String类equals(Object obj)方法的返回值。

若已定义,则直接获取对其的引用,此时就不需要创建新的对象;若没有定义,先创建这个对象,然后把它放到字符串池中,再将它的引用返回,由于String类是不可变类,一旦创建好了就不能修改,因此String对象可以被共享而且不会导致程序的混乱。

具体示例:

String s = "abc"; //把"abc"放到常量区中,在编译时产生

String s ="ab" +"c";//把"ab"+"c"转换为字符串常量"abc"放在常量区

String s =new String("abc");//在运行时把"abc"放到堆里

例如:

String s1 = "abc" //在常量区里存放一个"abc"字符串对象

String s2 = "abc"//s2引用常量区中的对象,因此并不会创建新的对象

String s3 = new String("abc")//在堆中创建新的对象

String s4 = new String("abc")//在堆中又创建一个新的对象

  为了便于理解,可以把String s = new String("abc")语句的执行分为两个部分:第一是新建对象的过程,即new String("abc");第二是赋值的过程,即String s=。由于第二个过程中只是定义了一个名为s的String类型变量,将一个String类型的对象的引用赋给s,因此在这个过程中不会创建新的对象。第一个过程中 new String("abc")会调用String类型的构造函数:

public String(String orinigal){

          //body

}

在调用这个构造函数时,传入了一个字符串常量,因此语句new String("abc")也就等价于"abc"和new String 两个操作。若在字符串池中不存在"abc",则会创建一个字符串常量"abc",并将其添加到字符串池中;若存在,则不创建,然后new String()会在堆中创建一个新的对象,所以s3和s4指向的堆中不同对象,地址自然不同。

 

引申:对于String类型的变量s,赋值语句 s = null 与 s = “ ”是否相同?

对于赋值语句s=null,其中的s是一个字符串类型的引用,它不指向任何一个字符串。而赋值语句s = “ ”中的s是一个字符串类型的引用,他指向另一个字符串(这个字符串的值为“ ”,即空字符串),因此,二者是不同的。

面试题:

new String ("abc")创建了几个对象?

答案:创建了一个或者两个对象。如果常量池中原来有"abc",那么只创建一个对象;如果常量池中原来没有字符串"abc",那么就会创建两个对象。

深度解析:

当JVM遇到上述代码时,会先检索常量池中是否存在“abc”,如果不存在“abc”这个字符串,则会先在常量池中创建这个一个字符串。然后再执行new操作,会在堆内存中创建一个存储“abc”的String对象,对象的引用赋值给str2。此过程创建了2个对象。

当然,如果检索常量池时发现已经存在了对应的字符串,那么只会在堆内创建一个新的String对象,此过程只创建了1个对象。
 

 inter()方法:让对象入池

学习了这一些内容,可以深入去理解一下inter方法的作用,以及相关的面试题目

这位朋友的这篇文章写的清晰明了,大家可以去看看!!

String.inter()深入理解                                           

如果以上内容对你有所帮助的话 ,请一键三连!!!发现任何错误请您尽管指出,感谢!!                                                                                                                                                                                

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.小柱.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值