JAVA--String str=““与new String()的区别

「JDK」解析 String str=““与 new String() 一、基础概念 为了讲清楚他们的差异,这里先介绍几个概念。 1.1 常量池 所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。 1.2 字符串常量池 在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。 当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。 1.3 阅读详情

目录

常量池:

使用String直接赋值:

使用new String创建字符串:

String拼接字符串:

String.intern():

总结:


常量池:

       常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

       在常量池中存储字符串常量的内存空间,即字符串常量池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。

       从字符串角度思考:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接赋值字符串)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

使用String直接赋值:

String str = “abc”:可能创建一个或者不创建对象。如果”abc”在字符串池中不存在,会在java字符串池中创建一个String对象(”abc”),然后str指向这个内存地址,无论以后用这种方式创建多少个值为”abc”的字符串对象,始终只有一个内存地址被分配;如果“abc” 在字符串池中存在, str直接指向这个内存地址。

实例:

String str = "abc";

String str1 = "abc";

String str2 = "abc";

System.out.println(str==str1);//true

System.out.println(str==str2);//true

使用new String创建字符串:

String str = new String(“abc”):至少会创建一个对象,也有可能创建两个。因为用到new关键字,肯定会在堆中创建一个String对象,如果字符池中已经存在”abc”,则不会在字符串池中创建一个String对象,如果不存在,则会在字符串常量池中也创建一个对象。

实例:

String str = new String("abc");

String str1 = new String("abc");

String str2 = new String("abc");

System.out.println(str==str1);//false

System.out.println(str==str2);//false

String拼接字符串:

除了直接使用=赋值,也会用到字符串拼接,字符串拼接又分为变量拼接和已知字符串拼接。

只要拼接内容存在变量,那么该拼接后的新变量就是在堆内存中新建的一个对象实体。

实例:

String str = "abc";//在常量池中创建abc

String str1 = "abcd";//在常量池中创建abcd

String str2 = str+"d";//拼接字符串,此时会在堆中新建一个abcd的对象,因为str2编译之前是未知的

String str3 = "abc"+"d";//拼接之后str3还是abcd,所以还是会指向字符串常量池的内存地址

System.out.println(str1==str2);//false

System.out.println(str1==str3);//true

String.intern():

       当调用 intern 方法时,如果常量池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到常量池中,并返回此 String 对象的引用。

实例:

String s1=new String("abc");

String s2=s1.intern();

System.out.println( s1==s2 ); //false

System.out.println( s1+" "+s2 ); // abc abc

System.out.println( s2==s1.intern() ); //true

s1==s1.intern()为false说明原来的“abc”仍然存在;

总结:

String str=“abc”和String str=new String(“abc”); 产生几个对象?
     前者1或0,后者2或1,先看字符串常量池,如果字符串常量池中没有,都在常量池中创建一个,如果有,前者直接引用,后       者在堆内存中还需创建一个“abc”实例对象。

      2.对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

      3.为了提升jvm(JAVA虚拟机)性能和减少内存开销,避免字符的重复创建 项目中还是不要使用new String去创建字符串,最好使用String直接赋值。

      4.关于equals()和==:对于String类简单来说,equals()就是比较两字符串的内容是否相等,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用,如果是返回true。

      5.String字符串是不可变的。

 

可参考:

https://www.cnblogs.com/guozhenqiang/p/5633269.html

https://blog.youkuaiyun.com/weixin_41098980/article/details/80060200

https://blog.youkuaiyun.com/u014082714/article/details/50087563

基于数字图像处理方法的迷宫问题图解 : 基于骨架提取、四邻域 问题是,这条红色的线是人为标记出来的能通的路线,对计算机来看,黑色和红色的线没有任何差异,所以之前的想法压根不起作用。对应于数字图像的表达,就是从远离主干的分支端点出发,如果4邻域中只有一个可以通的道路,那么这个点在分支上。闪电划过,有一道连接了天空和大地,就是迷宫的解,其余的分支就是迷宫中对应的死路。类似这个闪电图,假设图中最粗的主干(迷宫解的路线)是最先形成的,其余的细小的分支是慢慢从主干上形成的。因此,只要在端点的4邻域中,找到可以走的道路,那么一定就是分支,也就是要移除的路线。 阅读详情

相关推荐

EastWave应用案例:机箱屏蔽效能仿真

如何使用EastWave对机箱的电磁屏蔽效能进行仿真

2201_76034687的博客 1395

String str=““与new String()的区别

一、基础概念 1.1 常量池 用来存放一些常量,该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。 1.2 字符串常量池 在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。当我们需要使用字符串时,首先会在字符串常量池中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。 1.3 在编译期间创建的常量和运行期间创建的常量保存的地址 对象的引用都是存

dreaming9420的博客 1698

Android Display Graphics #1 整体框架介绍一

手机屏上显示的内容,2D或3D ,如果是 3D 的,不管是 App 还是游戏,或者简单的图片界面,底层都是通过 GPU、 通过 OpenGL(ES)绘制出来的。是Java层的一个类,提供了一系列API,使用这些API可以实现各种的产品经理要求的效果。显示的不同阶段对这块内存的叫法不同,在上层可以是Window、ANnativeWindow、Surface、SurfaceView、layer、buffer,这些本质上没啥区别,可以广泛意义上理解为用于显示内容的那块内存,只不过各个阶段的操作接口不同。

oDwyane03的博客 1387

JAVA--String str=""与new String()的区别

目录 常量池: 使用String直接赋值: 使用new String创建字符串: String拼接字符串: String.intern(): 总结: 常量池: 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 在常量池中存储字符串常量的内存...

Xin6Yang的博客 1万+

python blp模型 估计_随机系数Logit模型及Stata实现

欢迎投稿(荐稿)计量经济圈,计量相关都行邮箱:econometrics666@sina.cn作者:北京交通大学经济管理学院博士生,王琦珀。欢迎你加入计量经济圈社群,一起探讨前沿计量理论和实证方法。一、随机系数Logit模型1.背景实证产业组织(Empirical Industrial Organization,EIO)是目前产业组织理论的前沿,其中又以Ariel Pakes为带头人,其近期工作论文...

weixin_42298927的博客 2641

【机械视觉】C#+VisionPro实战:位深图(CogImage8Grey)与Bitmap互转技巧及工业检测应用

本文详细介绍了在工业检测中如何使用C#和VisionPro实现位深图(CogImage8Grey)与Bitmap的高效互转技巧。通过实战代码示例和工业应用案例,帮助开发者解决图像处理中的常见问题,提升检测精度和系统性能,适用于半导体、汽车零部件等高精度检测场景。

weixin_29250573的博客 186

浅谈String str = "" 和 new String()的区别

关于String类的知识经常出现在面试题中,在此先记录自己的理解。 首先明白一个事,java存在一个常量池,可以用来存储字符串常量。 1 创建的字符串变量在内存中的区别 两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。 String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就...

Double的博客 4万+

Python RK3588 MPP 8路视频硬解码!全体目光向我看齐!

本文重写了官方demo、加入了Zlmediakit进行拉流并通过pybind11将代码封装成so库,现在,在python中直接通过import的方式,就能完成基础的拉流解码操作,目前支持8路拉流解码!!!

m0_46303486的博客 4880

String str=null与String str=“”的区别

String str=null    这句话的意思就是定义一个字符串,变量str,字符串的内容为空值。String str=“”    定义一个String类型的变量str,并为其赋值。String str=null与String str=“”区别1.""分配了内存;null没有分配内存。2.""是一个字符串(String).它在内存中是存在的.而null它是一个空对象.在内存中是不存在的。3."...

谷伊阳的编程技术博客 1万+

FDTD仿真实战:从材料导入到反射率曲线分析

本文提供了一份完整的FDTD仿真实战指南,详细讲解了从自定义材料(如WO3)数据导入、结构建模、仿真区域与网格设置,到光源与监视器配置、运行仿真并提取反射率数据的全流程。重点解决了材料库缺失、网格优化、边界条件设置等常见难题,旨在帮助研究人员高效、准确地通过FDTD仿真获取材料的关键光学特性——反射率曲线。

elastic6hunter的博客 341

四旋翼飞行器建模(一)

四旋翼飞行器的姿态运动学和姿态动力学建模方法。

加斯顿工程师的博客 686

C#基础——字符串(string str = null 与string str = ““的区别)

一、字符串 ToLower、Toupper:大小写字母转换 str=str.ToLower():得到字符串的小写形式 str=str.Toupper():得到字符串的大写形式 sq.Equals(s2,StringComparison.OrdinallgnoreCase):两个字符串进行比较不区分大小写的比较str.Split:切割字符串 替换字符串(Replace) 判断这个字符串中是否包含这个字符串(Contains) Substring:截取字符串(注:截取长度不能超过字符串) Sub

一起加油吧~ 2049

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 849

Java学习记录 1 - String str=““与new String()的区别

常量池: 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 在常量池中存储字符串常量的内存空间,即字符串常量池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。 从字符串角度思考:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接赋值字符串)的就存储在...

c123m的专栏 473

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JAVA--String str=““与new String()的区别,linux视频学习

String str = “abc”; String str1 = “abc”; String str2 = “abc”; System.out.println(str==str1);//true System.out.println(str==str2);//true 使用new String创建字符串: ================== String str = new String(“abc”):至少会创建一个对象,也有可能创建两个。因为用到new关键字,肯定会在堆中创建一个String对象,如果

m0_64867047的博客 145

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java中String str1 = “123“;与String str1 = new String(“123”);的区别

Java中String类的两种定义方式 前言 这里将讨论字符串的两种定义方式的使用与区别以及“==”的各种判断 一、字符串有哪两种定义方式 1.String str1 = “123”; String str1 = "123"; String str2 = "123"; 在这里首先要了解一下这样子定义在内存中是什么样的。 栈中存贮对象的引用(保存着对象的地址值),字符串常量储存在方法区中。 方法区中不含相同的值,因此以此种方式定义的时候str1与str2中存放的地址值相同。 因此 @Test

Buwi的博客 3543

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

踏浪逐波 5827

String str =“a“ + “b“ 与 String str = new String(“a“) + new String(“b“) 的区别(jdk1.8环境利用javap命令探究)

今天,又在思考一个常见的问题,那就是字符串创建对象系列。发现了一个很多人都模糊不清的问题,那就是 String str =“a” + “b” 与 Strin str = new String(“c”) + new String(“d”) 把对象创建在了哪里?创建了几个字符串对象? 话不多出,show my code: String str =“a” + “b” package com.bestqi...

BestQiang的博客 1万+

【JDK】分析 String str=““ 与 new String()

一、基础概念 为了讲清楚他们的差异,这里先介绍几个概念。 1.1 常量池 所谓常量池:顾名思义就是用来存放一些常量的。该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。 1.2 字符串常量池 在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。 当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。 1.3 在编译期间创建

风尘博客 266

String str1="abc";和String str2=new String("abc");的区别

 http://tech.techweb.com.cn/viewthread.php?tid=525631 String str1="abc";和String str2=new String("abc");的区别 Java把内存划分成两种:一种是栈内存,一种是堆内存。           在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内

u012572538的专栏 2263

浅谈String str = ““ 和 new String()的区别

java存在一个常量池,可以用来存储字符串常量。! 1 创建的字符串变量在内存中的区别 两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。 String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。 String str2 = new String("abc") ;在编译阶段JVM先去常

mayaohao的博客 1609

Java中的String str="abc"; String str=new String("abc");和String str = new String();的区别以及==与equals()的不同。

        Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"a

gzwilliam的专栏 1832

String str = i 与String str = new String(i)的区别

String str = “i” 与String str = new String(“i”)的区别 1. 创建的对象在内存中的区别 两者都会在编译时检测常量池中是否存在"i",如果不存在则创建一个空间来存储"i"。 然后前者在**栈内存**中开辟一个名为str的空间,用来存储"i"在常量池中的地址; 后者则是在运行时,通过String类的构造器在堆内存中new了一个空间,用以存储常量池中"i"的复制,然后再在栈内存中开辟一个名为str的空间,用来存放堆内存中"i"的地址 2. ==与equals()的区别

Shalick的书架 945

8.String str=“i“与 String str=new String(“i”)一样吗?

不一样 因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”)方式,则会被分到堆内存中。 String str1 = "i"; String str2 = "i"; String str3 = new String("i"); System.out.println(str1 == str2);//ture System.out.println(str2 == str3);//false 解

py1215的博客 5674
上一篇: mybatis学习二之增删改查
下一篇: 深入理解Java类实例化时jvm执行顺序
给自己加加油
博客等级 码龄8年 302粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值