Java什么场景字符串会创建不同的对象

在Java中,字符串可能会创建不同的对象的情况包括但不限于以下几种场景:

  1. 使用 new 关键字创建
    当你使用 new String("some text") 的方式创建字符串时,无论池中是否存在相同内容的字符串,都会在堆内存中新创建一个String对象。
String s1 = new String("Hello");
String s2 = new String("Hello");
// s1 和 s2 指向的是堆中两个不同的对象,即使它们的内容相同。
  1. 字符串连接操作(concatenation)
    当通过 +StringBuilder/StringBuffer 进行字符串拼接时,如果结果字符串没有在常量池中,则会生成新的字符串对象。例如:
String s1 = "Hel" + "lo";
String s2 = "Hello";
String s3 = "Hel" + new String("lo");
// s1 与 s2 引用同一个常量池中的对象。
// s1 与 s3 引用的是不同的对象,因为s3中包含了一个通过new创建的新字符串对象。
  1. 从其他类型转换为字符串
    将整数、字符数组、字节数组等类型的数据转换为字符串时,每次调用相应的构造方法或转换方法(如 toString()),都会创建一个新的字符串对象。
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String s1 = new String(chars);
// 创建了一个新的字符串对象,即使它内容可以对应到常量池中的某个字符串。
  1. 反射创建字符串
    使用 Class.newInstance() 或者 Constructor.newInstance() 等反射机制动态创建字符串时,也会创建新的对象。

  2. 从流中读取数据
    当从输入流(如FileInputStream、Socket等)读取数据并转换为字符串时,通常会通过 InputStreamReaderBufferedReader 类读取字节然后转换为字符串,这个过程也会创建新的字符串对象。

  3. 类加载器加载资源
    不同的类加载器加载同一份资源文件时,如果资源文件内容作为字符串处理,那么每个类加载器加载的结果可能是不同的字符串实例。

总的来说,只要不是直接引用已存在于字符串常量池中的字符串字面量,或者显式要求复用常量池中字符串的操作,都有可能创建不同的字符串对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值