面试题--String字符串相关

1.String str1="abc";String str2=new String("abc");有什么区别?

  • 方式一是通过字面量的方式来定义字符串的,方式二是通过new+构造器方式
  • 通过字面量的方式,此时数据声明在方法区的字符串常量池中;通过new+构造器的方式,此时数据的保存地址值是数据的堆空间中开辟空间以后对应的地址值
    在这里插入图片描述

字符串常量存储在字符串常量池中,目的是共享,字符串非常量对象存储在堆中。

2. String s=new String("abc");方式创建对象,在内存中创建了几个对象?

一个或两个。

  • 如果字符串常量池中已经有abc存在,这种情况只需要新建一个对象,否则就是需要创建两个对象。
  • 当字符串常量池中没有abc,此时会创建两个对象:
    (1)一个是字符串变量abc所对应的、驻留在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只存放引用
    (2)另一个是通过new String()创建并初始化的,内容与abc相同的实例,也是在堆中。

知识点总结

  1. String是一个final类,代表不可变的字符序列。
  2. 字符串是常量,用双引号引起来,创建后不可更改。
  3. String实现了Serializable接口:表示字符串是支持序列化的。
  4. String实现了Comparable接口:表示字符串是可比较大小的。
  5. 定义了final char[] value用来存储字符串数据。
  6. 通过字面量方式给一个字符串赋值,此时的字符串值声明在字符串常量池中。
  7. 字符串常量池中是不会存储相同内容的字符串的。
  8. 当字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value值。
  9. 当对现有的字符串进行连接操作时,也需重现指定内存区域赋值,不能在原有位置赋值。
  10. 当调用String的replace()方法修改指定字符或字符串时,也需重新指定内存区域。
  11. 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
  12. 只要其中一个是变量,结果就在堆中。
  13. 如果拼接的结果调用intern() 方法,返回值就在常量池中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值