当前位置: 首页 > news >正文

八股文——JAVA基础:String s1 = new String(“abc“);这句话创建了几个字符串对象?

这段代码创建一个或两个对象。

如果没有“abc”这个字符串对象,那么会在堆中创建一个对象实例,并且在常量池中创建该实例的索引。

如果已有"abc"这个字符串对象,那么常量池中不会再创建,只会在堆中创建一个对象。

需要记住,常量池只会节省字面量(非new出对象时)的内存,因为多个字面量共享同一个常量池内容(常量池实质上是基于哈希表的索引)。

你注意到的“矛盾”其实是字面量加载(由 ldc 或类加载器初始化)和 new String(...) 本身向常量池写入 (intern())之间的区别:

  1. 字符串字面量的加载

     

    java

    复制编辑

    String s1 = new String("abc");

    在编译后的字节码里,会有一条类似

     

    asm

    复制编辑

    ldc "abc"

    指令,这条指令会确保在类加载/链接阶段,JVM 会把字面量 "abc" 自动加入常量池(如果还不存在的话)。

    • 这一行为和你写不写 new String("abc") 是分开的:只要字节码中出现了 "abc" 这个字面量,常量池就会有它。

  2. new String(...) 创建堆对象,不修改常量池
    紧接着,执行

     

    java

    复制编辑

    new String("abc")

    会在上再开辟一个新 String 实例,用常量池中已有的那份字符数据来初始化它的内容。但这一过程并不会把新对象“放进”常量池——它只是读取池里的那份,而不是向池里写入。


所以,究竟创建几个对象?

  • 常量池里是否已经有 "abc"

    • 没有:在类首次加载时,ldc "abc" 会导致池中新建一个 String 对象——这是由字面量触发的

    • 已有:字面量加载这步被跳过,不再新建。

  • new String("abc")

    • 始终在堆上创建一个新对象,不管常量池中有没有相同字面量

相关文章:

  • window11 本地安装 MySQL8.0
  • SAP顾问职位汇总(第26周)
  • 数据分析标普500
  • 实现win系统控制局域网的linux主机桌面
  • 现代 JavaScript (ES6+) 入门到实战(三):字符串与对象的魔法升级—模板字符串/结构赋值/展开运算符
  • 知攻善防靶机 Windows 挖矿事件应急
  • 通过交互式网页探索传输现象-AI云计算数值分析和代码验证
  • 博图SCL编程利器:CASE OF 语句详解与应用指南之设备运行模式选择框架
  • pytorch学习—4.反向传播(用pytorch算梯度)
  • 设备预测性维护和异常检测系统设计方案
  • 什么是 Event Loop?
  • 自然语言处理NLP期末复习
  • web3区块链-ETH以太坊
  • 抗辐照芯片技术在商业卫星领域的应用与突破
  • MySQL技巧
  • Spring Cloud:服务监控与追踪的高级实践
  • 基于二分类方法和安全系数方法使用comsol with matlab蒙特卡洛模拟实现边坡失效概率计算——随机变量模型
  • 设计模式之适配器模式
  • 计算机组成原理与体系结构-实验三 存储器(Proteus 8.15)
  • 零基础学习RabbitMQ(4)--RabbitMQ快速入门