Java面试题-字符串的创建及拼接

一、字符串的两种创建方式

(1) 方式一:String str1 = “qingdianguanzhu”。// 直接量定义的方式,数据存储于字符串常量池中

        直接量:直接量是指在程序中通过源代码直接给出的值,例如在int a = 5;代码中,为变量 a 所分配的初始值 5 就是一个直接量。

        当程序第一次使用某个字符串直接量时,Java 会使用常量池(constant pool)来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,Java 会直接使用常量池(constantpool)中的字符串直接量。

        在jdk 6之前字符串常量池一直在永久代中(可认为是方法区),jdk 7 及以后(jdk 8 也是在堆中)一直在堆空间中。

(2)方式二:String str2 = new String (“hello”) //在堆中创建

二、String 字符串拼接操作

1、常量池与常量池的拼接结果在常量池,原理是编译期优化。

2、常量池中不会存在相同的常量。

3、只要其中一个是变量就会在堆中创建对象,结果就在堆中。变量拼接的原理是 StringBulider。

4、如果拼接的结果调用intern()方法,则判断常量池中有无该字符串,有则返回此字符串地址,无则创建该字符串并返回此字符串的地址。
在这里插入图片描述

 在这里插入图片描述

在这里插入图片描述

 

关于StringBuilder拼接方式理解: 即先创建一个StringBuilder对象再拼接,如上s4=s1+s2;

即为StringBuilder s4; s4.append(s1);s4.append(s2);

执行 String str = new String(“a”) + new String(“b”);后创建几个对象

  对象1: new StringBuilder()

   对象2: new String("a")

   对象3: 常量池中的"a"

   对象4: new String("b")

   对象5: 常量池中的"b"

    对象6 :new String("ab")

关于intern的理解:

1、intern()是字符串对象的一个方法,它底层是一个native直接是调用了本地方法。

2、调用这个方法之后就是去看当前字符串是否在常量池中存在

(1)存 在:那就直接返回该字符串在字符串常量池中所对应的地址给栈中要引用这个字符串的变量。

(2)不存在:
① jdk 1.6:先在字符串常量池中创建该字符串,地址与堆中字符串地址不相同。然后再返回刚创建的字符串在字符串常量池中所对应的地址给栈中要引用这个字符串的变量。

② jdk 1.7及以后:直接将堆中(不是字符串常量池中)该字符串的地址复制到字符串常量池中,这样字符串常量池就有了该字符串的地址引用,也可以说此时字符串常量池中的字符串只是一个对 堆中字符串对象的引用,它们两个的地址相同,然后再把这个地址返回给栈中要引用这个字符串的变量。

例题:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值