Java中用引号创建String对象和用构造函数的区别

Java 面试,创建了几个String 对象? 我让你问!让你问!让你问! 字面量,字符串常量池,堆,谁还问我打谁。 阅读详情

创建一个String对象一般有以下两种方式:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. String str1 = "abcd";  
  2. String str2 = new String("abcd");  

这两种方式有什么区别呢?我们可以通过下面两个小例子来说明.



Example 1:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. String a = "abcd";  
  2. String b = "abcd";  
  3. System.out.println(a == b);  // True  
  4. System.out.println(a.equals(b)); // True  
这里 a == b 为 true,是因为 a 和 b 都引用了方法区的同一个字符串字面值。在java中,当同一个字符串字面值出现多次时,在内存中只会保存该字符串的一份拷贝,即 a 指向的 "abcd" 跟 b 指向的 "abcd" 在内存中是同一个对象。这种方法叫做 "字符串驻留(string interning)"。


Example 2:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. String c = new String("abcd");  
  2. String d = new String("abcd");  
  3. System.out.println(c == d);  // False  
  4. System.out.println(c.equals(d)); // True  

我们知道,new运算符的作用是在堆内存中创建一个新的对象。因而这里两次 new 就会在堆中创建两个String对象,尽管它们的字面值是相同的,但其实是两个同不的对象,占两份空间。因此 c == d 自然会返回 false 了。图示如下:



此外,我们可以调用String的intern()方法来强制让JVM使用字符串驻留,例如下面的代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. String c = new String("abcd").intern();  
  2. String d = new String("abcd").intern();  
  3. System.out.println(c == d);  // Now true  
  4. System.out.println(c.equals(d)); // True  

intern()方法调用时,首先会在字符串常量池中检查有没有 "abcd".equals(常量池中的字符串)为true的对象,如果有,则把该对象返回,如果没有,则创建一个"abcd"对象放到常量池中。因此,在创建d 的时候,intern()就会把先前创建的 "abcd" 的引用直接返回了。
基础学习-String类认识 【文章用于学习】⚫ StringBuilder 是一个可变的字符串容器, 我们可以把它看成是一个工具⚫ 作用:提高字符串的操作效率StringBuilder和String的区别⚫ String :内容是不可变的⚫ StringBuilder:内容是可变的。 阅读详情

相关推荐

【全解析 | PTA】浙大版《Python 程序设计》题目集-第一章

Python浙大版PTA题解

wzhh_的博客 5525

字符串对象的区别对比

创建字符串对象的区别对比 通过构造方法创建 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同 直接赋值方式创建 以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护 字符串常量池 当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在 不存在: 创建 存在: 不会创建,而是直接复用 字符串的比较 == 比较基本数据类型:比较的

weixin_50336269的博客 732

K型热电偶负电压采集难题?3种运放电路设计方案对比(含Multisim仿真)

本文针对K型热电偶在低温测量中产生的负电压采集难题,详细对比了三种运放电路设计方案,包括双电源运放反相放大、单电源仪表放大器和差分放大电路,并结合Multisim仿真数据分析了各方案的性能差异。文章还提供了PCB布局和抗干扰设计的实战技巧,帮助工程师解决热电偶信号采集中的核心挑战。

postgres8guard的博客 1017

day08-API String-StringBuilder

昨日内容回顾 面向对象 面向对象 偷懒,有事找别人完成;我们只指挥; 面向过程 自己干活;强调的是每一个步骤; 类 概述 模板,图纸,描述事物; 格式 public class 类名{ } 组成部分 成员变量 成员方法 构造方法 对象 概述 具体的事物;(个体) 创建对象 类名 对象名 = new 类名(实参); 使用对象 私有的成员变量,只能通过调用setter方法或构造方法存值;通过getter方法取值; 对象名.setXxx(实参); 关系 一个类可以创建出很多对象,(类是

InLoadwetrust的博客 237

10分钟训练你的AI歌手:RVC WebUI声音克隆保姆级教程

本文提供了一份详细的RVC WebUI声音克隆保姆级教程,指导用户如何在10分钟内利用Retrieval-based-Voice-Conversion技术训练专属AI歌手。教程涵盖从环境配置、数据准备、模型训练到最终推理应用的全流程,即使是新手也能快速上手,实现高质量的声音克隆与歌曲生成。

weixin_29073241的博客 818

R语言Dunnett’s检验实战:寻找差异组之间的效果

总结起来,本文以R语言为工具,演示了如何使用Dunnett’s检验来找出单因素方差分析中不同组之间的效果差异。在本篇文章中,我们将通过R语言实战演示如何使用Dunnett’s检验来寻找不同组之间的效果差异。在分析结果时,通常我们会关注具有显著差异的组别,并基于Dunnett’s检验结果进行进一步的解释和讨论。首先,我们需要准备一组数据,假设我们有一个实验,涉及到四个不同的处理组和一个对照组。当我们发现方差分析结果显示存在显著差异时,我们可以进一步进行Dunnett’s检验来确定具体哪些组之间存在差异。

CoderExtra的博客 1104

String常见构造方法和区别对比

1.常见的四种方法 2.构造方法和双引号创建对象的区别 注意:==号做比较 基本类型数据:比较的是具体的值 引用数据类型:比较地址值 以" "方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在程序中出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护 字符串常量池:当使用双引号创建字符串对象的时候,系统会检查字符串是否在字符串常量池存在,不存在就创建,存在就直接复用。 2.通过构造方法创建的字符串对象,在堆内存中存储 ...

FDXCG_X的博客 492

构建一个基于Simulink的LC滤波器仿真模型

需求分析LC滤波器(Inductor-Capacitor Filter)是一种常见的无源滤波器,广泛应用于电力电子、通信、音频处理等领域。其主要作用是平滑输入信号中的高频谐波成分,保留低频或直流成分,从而提高输出信号的质量。在电力电子系统中,LC滤波器常用于逆变器、整流器等设备的输出端,以减少开关噪声和电磁干扰(EMI),确保输出电压和电流的稳定性。本项目将基于Simulink平台,开发一个完整的LC滤波器仿真模型,涵盖从电源输入到滤波输出的整个过程,并通过PI控制器实现对滤波效果的闭环控制。

MHD0815的博客 733

在Java中用引号创建String对象和用构造函数的区别

创建一个String对象一般有以下两种方式: String str1 = "abcd"; String str2 = new String("abcd"); 这两种方式有什么区别呢?我们可以通过下面两个小例子来说明. Example 1: String a = "abcd"; String b = "abcd"; System.out.println(a == b); /

停止更新 3819

万字长文:YOLOv5+RK3588 NPU多线程加速全攻略——从理论到部署的终极优化

RK3588 NPU多线程加速优化教程摘要 本教程深入讲解了如何利用线程池技术优化RK3588 NPU上的YOLO目标检测模型推理性能。RK3588内置3个NPU核心,理论算力达6TOPS,为多线程优化提供了硬件基础。教程详细解析了线程池的核心组件(任务队列、工作线程、同步机制)和实现架构,包括类设计、初始化流程、工作线程逻辑(任务获取、NPU推理、结果存储三个阶段)以及任务提交/获取机制。通过预分配模型实例、线程绑定、流量控制等优化手段,实现了从单线程28FPS到多线程120FPS的显著性能提升,为边缘A

LXY_LOVE36的博客 1101

RAGFlow 系列教程 第三课:后端服务入口与请求生命周期

本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。

weixin_43674738的博客 187

Java单引号与双引号、equals和==的区别

        今天在比较两个String值的时候,以为是true的地方却是false,以为false的地方却是true。经过尝试测验,遂发现自己对Java基础部分的知识仍然有很大的欠缺。 1.单引号和双引号的区别:         单引号是char类型,双引号是String类型         char表示字符,定义时使用用单引号表示,只能存储一个字符。         String表示...

日技 9497

基于FFT的轴承故障诊断 - MATLAB代码和详细解释

最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。

COWizard的博客 612

java中String s = new String("abc")创建了几个对象

一、java中String s = new String("abc")创建了几个对象 答案是两个,现在我们具体的说一下: String s = new String("abc"); 首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。 所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中...

luzhensmart的专栏 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java基础-String对象的创建和存储

虽然堆中的对象都指向的是“xyz”中的字符串常量池中的内存地址,但栈中的x和y都指向x和y在堆内存中的不同的堆内存地址。如果堆里面new的是一个User对象,User对象里有一个String类型的name属性,则User的name里存储的并不是具体的字符串,而是存储的是字符串在字符串常量池中的内存地址。方式二的内存图,s3在内存中存在的形式就是,栈中的s3的内存地址指向堆中的String对象,堆中的String对象中的内存地址又指向方法区中“xy”的内存地址。且“==”判断的是内存地址。

flytalei的博客 3966

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【java】String创建对象的两种方式

推荐使用,性能高,适合内容固定的字符串。

m0_46692380的博客 857

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JAVA中char和string的区别

1.char表示字符,定义时用单引号,只能存储一个字符,如char c=’x’; 而String表示字符串,定义时用双引号,可以存储一个或多个字符,如String name=”tom”; 2.char是基本数据类型,而String 是一个类,具有面向对象的特征,可以调用方法,如name.length()获取字符串的长度。 ———————————————— 版权声明:本文为优快云博主「鱼米粒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://b

gb4215287的博客 8464

java 引号_java中单引号和双引号有什么区别

展开全部区别1:java中的单引号表示字符,java中的双引62616964757a686964616fe78988e69d8331333366306464号是字符串。区别2:单引号引的数据一般是char类型的;双引号引的数据 是String类型的。区别3:java中单引号里面只能放一个字母或数字或符号;java中的双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用char...

weixin_30433715的博客 6736

Java中String对象创建

字符串驻留 常量折叠 String a="abc"与String b=new String("abc")一样吗,难道也是语法糖??? String a="abc"要创建几个对象?? String a="abc";String b="abc";那么a==b吗?? String a="hello"+"world",创建几个对象?String b="hellowo

wobushixiaobailian的博客 1096

Java中单引号和双引号输出的区别

做题的时候发现的 " " 输出内容为空格的字符串;’ ’ 输出空格字符对应的ACCII码 查了一下资料 区别1:java中的单引号表示字符,java中的双引号是字符串。 区别2:单引号引的数据一般是char类型的;双引号引的数据 是String类型的。 区别3:java中单引号里面只能放一个字母或数字或符号;java中的双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用charAt(n) 来获取第几个字符。 char定义时用单引号,只能有一个字母,数字。char c=‘c’;而S

Bojun Jiang的博客 4391

String str=new String(“abc“);到底创建了几个String对象?

String str=new String("abc")创建了2个String对象

踏浪逐波 5827

JAVA中对象的创建以及String的对象个数问题

三种情况 FighterPlane fp= new FighterPlane(); FighterPlane fp; fp= new FighterPlane(); String A=”abc”; 对于第一种情况【FighterPlane fp= new FighterPlane();】 这句话都做了什么事情? 0,栈内存分配main中的fp空间。 1,因为new用到了FighterPlan

LeeBoom 1747

java string对象创建对象_Java String 创建了几个对象

我们首先来看一段代码:Java代码String str=new String("abc");紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。我们可以把上面这行代码分成String str、=、"abc"和new String()...

weixin_33334142的博客 378

String a=new String("abc")创建了几个对象

String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个。 接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。 我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待...

qq_42221826的博客 2593

Java中单引号和双引号的区别

。java中单引号里面只能放一个字母或数字或符号;java中的双引号里面是0到多个字符构成。所以字符可以直接转换成字符串。字符串需要使用charAt(n) 来获取第几个字符。char定义时用单引号,只能有一个字母,数字。char c='c';而String用双引号,可以是一个,也可能是多个字母,汉字等。就是所谓的字符串。

weixin_69229325的博客 1487
上一篇: 跳转(Forward)和页面重定向(Redirect)的区别
下一篇: 浅析Spring IoC源码(一)分析前的准备和思考
clypm
博客等级 码龄16年 165粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值