关于JAVA中String="abc"和String=new String("abc")的区别与联系

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

String a = new String("PushYE");

String b = "PushYE";

这是对两个字符串的声明,从正常的角度来看,我们会认为a和b没有区别。但是,

a==b系统报错误

a.equals(b)系统报正确

这就让我们很不能理解了。


首先,我们要知道“==”和“equals”的区别,“==“是判断两个对象是否是同一个对象,而“equals”则是仅仅对值进行判断。那说明a和b是两个值相同的字符串,但是它们并不是同一个对象,而是以不同的方式存储在机器中。


其次,我们来看一下String对象的创建,我在网上搜到了四种String对象的创建方法。

原理1:当使用任何方式来创建一个字符串对象s=X时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。


原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。


原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。


原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。

所以,让我们来看看String="abc"和String=new String("abc")各自的定义方式。

1.String a = "PushYE";

步骤:

1) 栈中开辟一块空间存放引用str2; 
2) 堆中开辟一块空间存放一个新建的String对象"abc"; 
3) 引用str2指向堆中的新建的String对象"abc";

2.String b = new String("PushYE");

步骤:

1) 栈中开辟一块空间存放引用str3;
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象; 
3) 引用str3指向另外新建的那个String对象;


以上。




 


 





ros2笔记-4.6使用launch启动脚本 ros2 4.6 使用launch启动多节点 阅读详情

相关推荐

学习Fidder主要掌握的技术——流量篡改

本文介绍了Fiddler工具的三种常用调试方法:1)本地映射-通过保存修改JSON响应文件实现接口数据模拟;2)Composer接口调试-通过修改请求参数快速测试接口异常处理;3)断点调试-在请求/响应过程中拦截并修改数据。这三种方法分别适用于前端开发、接口测试健壮性验证等场景,能够有效提高调试效率。操作步骤包括保存响应、修改数据、配置规则等关键环节,并提供了详细的界面操作指引。

2301_79022773的博客 334

String a = new String(“abc“); 创建了几个对象?String a =abc“; 呢?

可以看到String类的equals方法**先比较两个对象的引用地址,此时运用了 == 的关系运算符。如果两个对象的引用地址不同,会比较字符串中的每个字符是否相同,全部相同则返回true,否则返回false。编译器通过语法分析,会将常量表达式计算求值,并用求出的值来替换表达式,而不必等到运行期间再进行运算处理,从而在运行期间节省处理器资源。所以上面的语句在运行期就等同于String a =abcd”;通过之前的几个问题可知变量a、b、c的引用地址相同。故a == ba == c的结果为true。

qq_46601365的博客 3645

01-SA8155 QNX 虚拟机Hypervisor

Hypervisor运行在Host OS操作系统上,其他操作系统均在Hypervisor上运行。:Hypervisor直接运行在硬件上,操作系统在Hypervisor之上运行。终止(关闭):echo control 0 dev/vmm。路径:qnx_ap/AMSS/platform/vm/resources/关闭/终止 qvm(GVM):slay -s SIGQUIT qvm。", //host PVM --- 主机。不直接操作/dev/vmm 实现关闭,启动vm。

静虚待令,有物混成 1万+

String a =abc“; String b = new String(“abc“);的区别是什么?

String a = "abc"; String b = new String("abc");的区别是什么

小白的博客 833

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

String a =new String(“abc”) 实际上是创建了两个对象(假设之前String的常量池中没有创建任何对象), 一个是“abc”,一个是new String()。 “abc”创建后就会放入常量池中(下次创建 String对象时先查找常量池 有需要的就使用, 没有就重新创建并存入常量池),如果常量池中有的话,则就创建了一个new的对象,每new一次就创建一个对象。 而String a=new String(“abc”)这是在堆里面创建了一个空白对象 ,并将a初始化(如图),在去查找常量池是

Rick的博客 8298

String s; String s = null; String s = ""; .intern()

String abc=null;String abc="";String abc;三种写法有什么区别? 1:创建一个空字符串对象,  2:创建一个字符串为空的字符串对象。  3:声明一个字符串对象,但并没有分配内存,而1,2已经分配了内存  对于最后一种表示,你不能if(abc==null),或者int   length   =   abc.length();编译的时候会提示可能没有初

w46434137的专栏 2492

JavaString a =abc String a = new String(“abc“) 创建字符串的区别

Java中的所有的对象都存储在堆内存当中,空间大,但是读取速度比较慢。 字符串常量池就是比如是String a = "abc"String a = "ac"这些都是存储在字符串常量池中。在字符串常量池中,不管String a = "abc"String b = "abc"...这些在字符串常量池中只会存储一个,然后a,b都指向字符串常量池中的同一个字符串常量"abc"【指向的是地址】。字符串常量池空间不大,读取速度比较快。

m0_64210833的博客 1483

javaString s="abc"String s=new String("abc")区别

String的特性》 1、String类是final的,不可被继承。 2、String类是的本质是字符数组char[], 并且其值不可改变。 3、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法

淡然坊 5015

Java面试常出现解答】中String s="abc"String s=new String("abc")区别

String的特性》 1、String类是final的,不可被继承。 2、String类是的本质是字符数组char[], 并且其值不可改变。 3、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区...

程序猿开发日志【学习永无止境】 1358

java基础之:String s=abcString s=new String(“abc“)的区别?

java基础之:String s="abc"String s=new String(“abc”)的区别? 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验;

weixin_47024670的博客 718

关于JavaString a ="abc"String a=new String("abc")区别

String a ="abc"是指如果在字符串常量池中没有这个字符串, 则在字符串常量池中新建一个 abc 的字符串,如果常量池中 有这个字符串,则只需要把这个字符串的地址赋给 a这个引 用即可,注意,字符串常量池在方法区中。 ...

xie1147641046的博客 2892

java面试题15_String str1=abcString str2=new String(“abc“)的区别

Java字符串创建方式主要有两种:String str1="abc"String str2=new String("abc")。关键区别在于: 内存分配:字面量方式使用常量池,new创建堆对象 对象复用:相同字面量共享常量池对象,new每次创建独立对象 比较结果:==比较时,字面量引用相同返回true,new的对象返回false 内存效率:字面量方式更高效,避免重复创建 最佳实践是优先使用字面量赋值,字符串比较用equals()方法。intern()方法可强制从常量

qq_39275653的博客 599

java面试题:new String(“abc“)创建几个对象;String a=abcd“,String b=new String(“abcd“),String c=“ab“+“cd“区别

java面试题:new String(“abc“)创建几个对象;String a=abcd“,String b=new String(“abcd“),String c=“ab“+“cd“区别

qq_44700578的博客 1423

java string s_javaString s="abc"String s=new String("abc")区别

String的特性》1、String类是final的,不可被继承。2、String类是的本质是字符数组char[], 并且其值不可改变。3、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。Str...

weixin_28810315的博客 208

javaString str="abc"String str1=new String("abc")区别

原文地址:http://781588100.blog.51cto.com/9429625/1558888

Alvin_CSDN_blog的博客 4728

JavastringString区别_javaString str="abc"String str1=new String("abc")区别

1. 栈(stack)堆(heap)都是Java用来在Ram中存放数据的地方。C++不同,Java自动管理栈堆,程序员不能直接地设置栈或堆。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器...

weixin_29587979的博客 576

Java基础:创建String对象时,String s=new String("abc")String s="abc"区别

我们在学习过程中,创建String对象时,接触到两种方法分别是: 调用String类的构造方法;使用双引号”“; 然而这两种方法生成的字符串对象,在内存中的存储机制是不同的。 1.调用String类的构造方法: 在使用String构造方法定义对象时,Java环境会在每次调用的时候创建一个新的对象。如下代码所示: String a=new String("tom"); Stri

一珄筱歌的博客 575

Java堆 数据类型包装类的值不可修改 String a =abc String b = new String("abc")区别

1. 栈(stack)堆(heap)都是Java用来在Ram中存放数据的地方。C++不同,Java自动管理栈堆,程序员不能直接地设置栈或堆。 <br /><br />2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。 <br

rovingxx的专栏 1271

String s =abcString s = new String(“abc“)的区别

对于String s = new String(“abc“),不管字符串常量池中是否存在值为“abc”的字符串对象,它都会在堆中创建一个字符串对象。对于String s =abc“,如果字符串常量池中已经存在值为“abc”的字符串对象,那么变量s会指向已存在的对象;否则会在字符串常量池中新创建一个字符串对象,并将它赋值给变量s。答:String s =abc“会创建1个或者0个对象,而String s = new String(“abc“)会创建1个或者2个对象。

qq_66452396的博客 541

第2章 Java编程基础——FAQ2.22 创建String对象时, 使用String s=new String (“abc”)String s=abc”语句有什么区别?...

FAQ2.22 创建String对象时, 使用String s=new String (“abc”)String s=abc”语句有什么区别? 答: Java运行环境有一个字符串池,由String类维护。执行语句String s="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给s,如果不存在则先在字符串池中新建一个字符串 "abc",...

dengyansui9157的博客 176
下一篇: 输油管道问题(分治算法)
Jerry24ever
博客等级 码龄10年 5粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry24ever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值