String字符串的一些常见问题(为什么不可变,常用方法等)

String为什么要设计成不可变?

主要有以下几点原因:

  1. 为了线程安全同一个字符串实例可以被多个线程共享

  2. 字符串支持hash映射和缓存。因为String的hash值经常会使用到,比如作为 Map集合中的键,不可变的特性使得 hash 值也不会改变,不需要重新计算。

  3. 出于安全考虑网络地址URL、文件路径path、密码通常情况下都是以String类型进行保存,假若String可变,将会引起各种安全隐患。

String的equals() 和 Object的equals() 有何区别?

Objectequals 方法如果不重写,比较的是对象的内存地址
String 中的 equals 方法是被重写过的,比较的是 String 字符串的值是否相等。

String, StringBuffer StringBuilder区别

1. 可变性
String 不可变
StringBuffer 和 StringBuilder 可变

2. 线程安全

String 不可变,因此是线程安全的

StringBuilder 不是线程安全的

StringBuffer 是线程安全的,内部使用 synchronized 进行同步

什么是StringJoiner?

StringJoiner是 Java 8 新增的一个 API,它基于 StringBuilder 实现,用于实现对字符串通过分隔符拼接的场景

StringJoiner 有两个构造方法,第一个构造要求依次传入分隔符、前缀和后缀。第二个构造则只要求传入分隔符即可。

String类的常用方法有哪些

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换

split():分割字符串,返回一个分割后的字符串数组。

equals():比较两个字符串是否相等

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

toLowerCase():将字符串转成小写字母。 toUpperCase():将字符串转成大写字符

substring():截取字符串

equals():字符串比较

String s1 = new String(“abc”);这句话会创建几个字符串对象?

取决于字符串常量池中是否有对象“abc”的引用
如果字符串常量池中不存在字符串对象“abc”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。

什么是字符串常量池?

字符串常量池用来存储字符串常量
在创建字符串时,JVM首先会检查字符串常量池,如果该字符串已经存在池中,则返回其引用,如果不存在,则创建此字符串并放入池中,并返回其引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值