深入了解String类

让学习成为一种习惯。


    之前对于String类型一直有很多疑问。比如说:String类为什么不可变?String str=new String(“abc”)创建了几个对象?String str=new String(“abc”)和String str=“abc”;的区别?String类中的intern()是否会创建对象?等。今天我就来介绍一下String类到底是一个什么样的类。

    在java中提供了一个String类,该类允许开发人员存储字符串,这在很多的编程语言中是没有的。String类内部的实现是使用char数组实现的。在此我就不一个个介绍了。
    下面我们直接介绍一些String类常见的误区。

    首先,讲一下为什么字符串不可变。第一点:在java中String类是final修饰的类不可以被其他类继承。第二点:在java中每次改变String对象的值,其改变后的对象与原来的对象不是同一个对象。因此String是不可变的。

误区一

String a="abc";

"abc"存放在哪里?
    "在java中的分为五个内存区域:JVM栈,本地方法栈,方法区,堆,PC寄存器。而我们的这里所讲的字符串就存放在方法区中,严格来说,是方法区中的常量池中。
    上述代码中String a=“abc”,jvm会先去方法区中的常量池中查找是否有字面量"abc"的存在;若存在则这个a指向“abc”在常量池中的地址,若不存在则在该池中创建一个“abc”,并让变量a指向该对象。

误区二

String a="abc";
String b=new String("abc");

变量a和变量b分别指向哪里?创建了几个对象?
    String a=“abc”,这个部分先去判断常量池是否有字面量"abc"存在,若存在则指向该字面的地址;若不存在则在该池中创建一个对象。这时候常量池中有一个字面量“abc”存在。

    String a=new String(“abc”),对于这个部分,分两种情况:(1)首先还是去常量池中查找字面量“abc”是否存在,若常量池中存在字面量“abc”,则在java的堆内存中开辟一个空间,堆中的这个对象的空间指向常量池中的“abc”的地址;变量a指向堆中new出来这个对象,所以这里总共创建一个对象。(2)若常量池中不存在“abc”对象,则先在常量池中先创建一个“abc”对象,然后在堆中再创建一个对象,让堆中的对象指向常量池中的对象,然后变量a指向堆中new 出来的对象,因此这里就创建了两个对象。
    因为之前String a=“abc”’;这个操作已经在常量池中创建了“abc”,所以这里new String(“abc”)只创建了一个对象。
如下图所所示:在这里插入图片描述

误区三

String a=new String("abc");
String b=a.intern();

这里a.intern()创建了对象吗?
    根据误区二所说,假设常量池中还没有“abc”,这里String a=new String(“abc”);共产生两个两个对象,一个再常量池中,一个在对堆中。堆中的对象指向常量池中的“abc”。
    我们来讲解一些String b=a.intern();官方api翻译过来是这样的:返回字符串对象的规范化表示形式。什么意思呢?说笼统点,就是谁调用这个方法,就返回该对象在常量池中与之相对应的字面量。String类中的intern()方法并不会产生新的对象,因为当一个字符串对象使用该方法的时候必定在常量池中有这个字符串了

好了,本篇对String的介绍就到此为止了。希望能给你带来帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值