String s = new String("abc");产生了几个对象?

2023-11-11

对于这个问题,老套路先上代码:

public class StringTest {
	public static void main(String[] args){
		String s1="Hello";
		String s2="Hello";
		String s3=new String("Hello");
		System.out.println("s1和s2 引用地址是否相同:"+(s1 == s2));
		System.out.println("s1和s2 值是否相同:"+s1.equals(s2));
		System.out.println("s1和s3 引用地址是否相同:"+(s1 == s3));
		System.out.println("s1和s3 值是否相同:"+s1.equals(s3));
	}
}

执行结果:

s1和s2 引用地址是否相同:true
s1和s2 值是否相同:true
s1和s3 引用地址是否相同:false
s1和s3 值是否相同:true

上面程序中的"==“是判断两个对象引用的地址是否相同,也就是判断是否为同一个对象,s1与s2 返回为true,s1与s3返回则是false。说明s1与s2 引用的同一个对象的地址,s3则与其它两个引用不是同一个对象地址。
Java为了避免产生大量的String对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以上面s1与s2引用地址相同。
那为什么s3与s1、s2引用的不是同一个字符串地址呢? String s3=new String(“Hello”); JVM首先是在字符串常量池中找"Hello” 字符串,如果没有创建字符串常量,然后放到常量池中,若已存在,则不需要创建;当遇到 new 时,还会在内存(不是字符串常量池中,而是在堆里面)上创建一个新的String对象,存储"Hello",并将内存上的String对象引用地址返回,所以s3与s1、s2引用的不是同一个字符串地址。内存结构图如下:
在这里插入图片描述
从内存图可见,s1与s2指向的都是常量池中的字符串常量,所以它们比较的是同一块内存地址,而s3指向的是堆里面的一块地址,说的具体点应该是堆里面的Eden区域,s1跟s3,s2跟s3比较都是不相等的,都不是同一块地址。

了解了String类的工作原理,回归问题本身:
在String的工作原理中,已经提到了,new一个String对象,是需要先在字符串常量中查找相同值或创建一个字符串常量(有则用没有则创建),然后再在内存中创建一个String对象,所以String str = new String(“xyz”); 会创建一个或两个对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String s = new String("abc");产生了几个对象? 的相关文章

随机推荐

  • 若依 默认展开侧边栏菜单

    打开文件 ruoyi ui src layout components Sidebar index vue 将下面代码覆盖掉原文件中的el menu节点相关代码 参考自 http doc ruoyi vip ruoyi vue other
  • 如何用Python进行数据分析,详细流程讲解!

    1 为什么选择Python进行数据分析 Python是一门动态的 面向对象的脚本语言 同时也是一门简约 通俗易懂的编程语言 Python入门简单 代码可读性强 一段好的Python代码 阅读起来像是在读一篇外语文章 Python这种特性称为
  • PYCHARM 之 VIM 操作

    1 主题 如果你是Vim的粉丝 并且不打算使用其他类型的编辑器 那么这篇教程将会比较适合你 这里将会详细介绍如何在Pycharm IdeaVim插件的帮助下下载 安装 使用Vim 至于有关Python编程以及Vim的用法 详见officia
  • Reachability from the Capital CodeForces - 999E(tarjan模板应用 )

    题目 Berland有n个城市和m条路 每条路连接两个城市 所有路都是单向的 为了能从首都到达所有城市 需要建造的最少的新道路的数量是多少 新建的道路也是单向的 em 其实就是说从这一点出发的 强连通 联想一下之前做过的 最少添加几条边是这
  • threejs三维地图大屏项目分享

    这是最近公司的一个项目 客户的需求是基于总公司和子公司的数据 开发一个数据展示大屏 大屏两边都是一些图表展示数据 中间部分是一个三维中国地图 点击中国地图的某个省份 可以下钻到省份地图的展示 地图上 会做一些数据的标注 信息标牌 如下图所示
  • 射频中的 IM3、IIP3、OIP3、G、P1dB指标之间的关系

    噪声系数与非线性失真是描述射频系统性能优劣的两个重要指标 噪声 限制了系统所能处理的最低信号电平 非线性失真 限制了系统所能处理的最高信号电平 在非线性器件 放大器 混频器等 输入端 输入等幅度不同频率的双音信号 f1 f2 由于器件的非线
  • Wordpress入门建站教程二:搭建WP站点的准备工作

    WordPress入门第一课就简单介绍了WordPress 它是一个使用 PHP语言和 MySQL数据库开发的开源 免费的建站程序 那么搭建WordPress站点 就要求一个能够运行PHP语言的主机空间和一个MySQL数据库 也许有些朋友会
  • JVM性能调优-JVM内存区域划分

    JVM性能调优 JVM内存区域划分 1 程序计数器 线程私有 结论 程序计数器线程私有 并且分配的空间大小不会随程序执行改变 所以不存在内存溢出等异常情况 程序计数器 Program Counter Register 也有称作为PC寄存器
  • 微电网中的最优调度matlab例程,用yalmip+cplex求解器求解,以一天的运行费用最小为目标函数,可用作参考学习。

    微电网中的最优调度matlab例程 用yalmip cplex求解器求解 以一天的运行费用最小为目标函数 可用作参考学习 9515644736113608浪迹天涯
  • 边缘计算——简单易懂的PPT+文字介绍

    边缘计算是续云计算 物联网 5G时代之后的有一个新生代宠儿 这里我分享一个彩蛋 昨天我一个同事理解边缘计算是一种识别算法 觉得通过识别图像数据中的实体的边缘轮廓 得出该实体所表现出来的动作 比如扒窃动作识别 打架行为识别等 其实不然 边缘计
  • Shell编程条件语句

    目录 一 条件测试 1 test命令 2 条件测试 常用的测试操作符 3 字符串比较 常用选项 4 逻辑测试 二 if语句 1 if单分支语句 2 if双分支语句 3 if多分支语句 学生考试成绩判断 圆的面积计算案例 三 case语句 1
  • 复变函数与积分变换系列(一) - 复变函数与解析函数

    复变函数与解析函数 Author Benjamin142857 TOC 0 几个基本概念 实虚部 P l u r a l
  • 关于代码评审

    代码评审实际是编写代码的开发人员在被复查 它是最小化缺陷的有效方法 无论公司实行代码评审的额外动机是什么 代码评审都是工业化的最优方法 一 代码评审目的 1 确保要发布质量可靠的代码 代码评审能非常有效地发现所有类型的错误 包括那些由于不正
  • Java基础三

    表达式自动提升类型 在程序中出现直接写出来的数字 如果是整数默认类型为int 如果为小数默认类型为double 一个表达式中包含多种数据类型时 结果的数据类型会自动提升 规则如下 byte short char 自动提升为int 整个表达式
  • selenium 二维码登陆解决方案

    selenium与api 的结合 获取到 qr id 然后api 带这个qr id 调用 然后就ok了 实现方式看代码 coding utf 8 auth cy create 11 27 18 update from time import
  • 告别if else!试试这款轻量级流程引擎吧,跟SpringBoot绝配!

    之前同事用了一款轻量级的规则引擎脚本AviatorScript 我也跟着用了起来 真的挺香 能少写很多代码 这期就给大家介绍一下这款规则引擎 简介 AviatorScript是一门高性能 轻量级寄宿于 JVM 包括 Android 平台 之
  • Mysql实现局域网访问

    Mysql实现局域网访问 文章目录 Mysql实现局域网访问 找到MYSQL数据库中的User表 找到自己账号的那条数据 将Localhost 改为 号 代表所有ip都可以访问 Localhost代表只有自己可以访问 这样就实现了局域网访问
  • 详解Mysql主键

    主键 对于关系表 有个很重要的约束 就是任意两条记录不能重复 不能重复不是指两条记录不完全相同 而是指能够通过某个字段唯一区分出不同的记录 这个字段被称为主键 对主键的要求 最关键的一点是 记录一旦插入到表中 主键最好不要再修改 因为主键是
  • Schedulis 普通版环境部署

    Schedulis 普通版环境部署 一 使用前置 请基于 Linux 操作系统操作 建议 CentOS 创建新用户 hadoop 并为该用户赋予 root 权限 用于部署schedulis 准备好 MySQL 版本5 5 的客户端和服务端
  • String s = new String("abc");产生了几个对象?

    对于这个问题 老套路先上代码 public class StringTest public static void main String args String s1 Hello String s2 Hello String s3 new