Java String类两种实例化方式

Java中String类的两种对象实例化方式 当我们使用相同的字符串字面值创建多个String对象时,实际上它们会引用同一个字符串常量池中的对象。这是因为Java中的字符串是不可变的,即一旦创建就不能被修改,所以可以共享相同内容的字符串对象以节省内存。综上所述,Java中String类的两种对象实例化方式的区别在于,使用字面值创建的String对象会被放入字符串常量池中并共享内存,而使用构造函数创建的String对象则会在堆内存中创建新的对象,不共享内存。需要注意的是,虽然使用构造函数创建的String对象不会共享内存,但是它们的内容是相同的。 阅读详情

String类的两种实例化方式与区别

在Java中只有字符char这一数据类型的存在,并没有字符串这一数据类型的存在,但是通过设计的形式提供了String类,并且还有两种实例化方法

1.通过直接赋值的形式为String类对象实例化
Public class Demo{
	Public Static void main(String args[]) {
		String str = "www.youkuaiyun.com";					//【直接赋值实例化】String类对象实例化
		System.out.println("str");
	}
}

String本身属于一个系统类,除了可以利用直接赋值的形式进行对象实例化之外,同时也提供了相应的构造方法进行实例化。

2.通过构造方法实例化String类对象
public class Demo{
	public static void main(String args[]){
		String str = new String("www.youkuaiyun.com");			//【构造方法实例化】String类对象实例化
		System.out.println(str);
	}
}

两种实例化方式比较

1.直接赋值的对象实例化模式
Public class Demo{
	Public Static void main(String args[]) {
		String str = "www.youkuaiyun.com";					//采用直接赋值实例化对象
	}
}

这时候在内存中会开辟出一块堆内存,内存空间中保存有“www.youkuaiyun.com”字符串数据,并且栈内存中将直接引用此堆内存空间,如图所示:
在这里插入图片描述
通过直接赋值的方式为String类对象实例化会开辟一块堆内存空间,而且对同一字符串的多次赋值还可以实现对堆内存空间的重用,即采用直接赋值的方式进行String类对象实例化,在内容相同的情况下不会开辟新的堆内存空间,而会直接指向已有的堆内存空间。
(1).观察直接赋值时堆内存的内存自动引用:

public class Demo{
	public static void main(String args[]){
		String strA = "csdn";
		String strB = "csdn";
		String strC = "string";
		System.out.println(strA == strB);		//在java中,关系运算符==如果用在String类上则表示内存地址数值的比较是否相同
		System.out.println(strA == strC);
	}
}

程序运行结果:
true (“strA == strB”代码执行结果)
false (“strA == strC”代码执行结果)

在本程序中,由于使用了直接赋值实例化操作方式,而且内容相同,所以即使没有直接发生对象的引用操作,最终两个String对象(strA、strB)也都自动指向了同一块堆内存空间。但是如果在直接赋值时内容与之前不一样,则会自动开辟新的堆内存空间(String strC = “string”;),如图所示:
String strA = "csdn"
String strA = “csdn”;
(a)直接赋值

在这里插入图片描述
String strB = “csdn”;
(b)自动引用

在这里插入图片描述
String scrC = “string”;
(c)开辟新内存



Tips:
       实际上,在JVM的底层存在有一个对象池(String只是对象池中保存的一种类型,此外还有多种其他类型),当代码中使用了直接赋值的方式定义了一个String类对象时,会将此字符串所使用的匿名对象入池保存,如果后续还有其他String类对象也采用了直接赋值的方式,并且设置了同样内容,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。




2.构造方法实例化

       如果要调用String类中的构造方法进行String类对象的实例化操作,那么一定要使用关键字new,而每当使用关键字new就表示要开辟新的堆内存空间,而这块堆内存空间的内容就是传入构造方法中的字符串数据。


构造方式实例化对象

public class Demo{
	public static void main(String args[]){
		String str = new String("csdn");
	}
}

如图所示:
在这里插入图片描述

由于每一个字符串都是一个String的匿名对象,所以当使用构造方法实例化String对象时会先在堆内存中开辟一块空间来保存字符串,之后再使用运算符new来新开辟一块内存空间来实例化的那个字符串。而之前定义的字符串所开辟的堆内存空间将不会被任何栈内存所指向,而是成为一片垃圾空间等待被回收。






参考资料:
[1]:《Java:从入门到项目实战》中国水电水利出版社
[2]:https://www.runoob.com/java/java-string.html

【Java基础教程】(九)面向对象篇 · 第三讲:深入探究String类——实例化方式及其区别、字符串常量说明、享元设计模式解析、不可改变性特征以及String类的常用方法~ 在本文中,我们探讨了关于Java中String类的一些重要概念和方法。首先,我们学习了String类的实例化方式,并比较了直接赋值和使用`new`关键字的区别。接着介绍了字符串常量的概念,并解释了享元设计模式如何优化字符串存储。我们还提到了字符串的不可改变性,说明了其在多线程环境下的好处。 随后,详细讨论了String类的常用方法。了解了如何获取字符串的长度以及访问特定索引处的字符、如何截取子字符串、比较字符串是否相等等各种操作方法。 最后,我们简要概述了一些字符串操作的使用场景。 阅读详情

相关推荐

Java中如何使用字符串来实例化类以及调用类

Java中如何使用字符串来实例化类以及调用类

详述String实例化方法

三、String 1. 简介 ​ java.lang.String 字符串就是一个字符序列,由多个字符组成,是Java中最常用的类型 public final class String implements java.io.Serializable, Comparable<String>, CharSequence ​ 创建字符串的方式: 直接创建 使用构造方法创建 /*...

qq_32430605的博客 386

ZYNQ学习:PL端DDR3 读写测试

DDR SDRAM 的最大特点是双沿触发,即在时钟的上升沿和下降沿都能进行数据采集和发送,同样的工作时钟, DDR SDRAM 的读写速度可以比传统的 SDRAM 快一倍。本次实验使用的 DDR3 芯片是南亚的 NT5CC256M16ER-EKI, NT5CC256M16ER-EKI 的 bank 位宽为 3,行位宽为 15,列位宽为 10,所以它的地址大小等于 2^3*2^15*2^10(即 2^28=256M),数据位宽为 16bit,所以容量大小为 256M*16bit,也就是 512MByte。

shuidiQAQ的博客 3035

笔试题总结——String类的两种实例化方式

笔试题总结——String类的两种实例化方式   首先看String类的实例化方式    直接赋值,在堆上分配空间,只有String可以直接赋值进行实例化,其他类必须new一个对象出来才能完成实例化。 String str = "hello";    传统方法:通过new 构造方法()实例化String对象。 String str = new String("hello");   除了会使...

xiaoaxiao 724

Arcgis填补栅格空缺值Nodata

Arcgis填补栅格空缺值Nodata

pass17的博客 1万+

MCU 微控制器,在实际项目中如何选型(以 STM32为例)

1.MCU 选型需要考虑的一些因素 2.案例:传感器设备的 MCU 选型

创享 AIOT 的专栏 1万+

Java从入门到精通—String类【String类两种实例化方式】

String类两种实例化方式的区别? 直接赋值: - 产生一个实例化对象; - 对象会自动入池; - 实现字符重用 构造方法: - 产生两个实例化对象; - 不会自动入池; - 无法实现字符重用; - String类提供有intern()方法可以主动入池。

Da_Xiong的博客 759

利用Python爬虫获取淘宝商品评论:实战案例分析

在数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Python爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。

2401_87849335的博客 2835

【伍】一篇让你搞懂Java中的字符串,两种实例化方式的差异以及String常用方法的使用(附示例)

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串 1 String类对象的两种实例化方式 String并不是一个基本数据类型,它本身属于一个类,但是这个类在设计的过程之中加入了一些Java自己的特殊支持所以对于这个类的对象实例化方式就有两种形式: 直接赋值:String 对象=“内容” 构造方法;public String(String s) //直接赋值法 String str1="Hello"; //构造方法 St.

不负时光可怜人 626

详述字符集与汉字编码

字符集与字符编码是文本处理的基础概念。字符集定义字符集合(如ASCII、GB2312、Unicode),字符编码则规定字符如何存储为二进制数据。汉字编码经历了从区域化(GB2312、GBK、BIG5)到全球化(Unicode)的演进,Unicode通过UTF-8、UTF-16等编码方案实现跨语言兼容。UTF-8因兼容ASCII、节省空间且无乱码风险,成为中文互联网的主流编码。正确处理编码问题需统一标准、明确声明格式,并注意生僻字的特殊处理。

零零发不爱ai的博客 808

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。

啤酒鸭的物联网开发记录博客 5291

阿里Java学习路线:阶段 1:Java语言基础-Java面向对象编程:第10章: String类特点分析:课时45:String类对象两种实例化方式比较

现在已经清楚了在String类对象实例化的过程之中一共提供有两种处理模式,那么现在就需要区分好这两种处理模式到底该使用哪种会更好。 1.分析直接赋值的对象实例化模式 在程序之中只需要将一个字符串赋值给String类的对象就可以实现对象的实例化处理,现在假设只有如下一行代码: public class StringDemo { public static void main(String[] args) { String str = "mldn" ; } } 这种情况下肯定只会开辟出一块堆内存空间

Kenny C 259

OceanBase数据库:与MySQL和Oracle的函数差异分析

OceanBase数据库兼容性解析:MySQL与Oracle模式深度比较 摘要:OceanBase通过独特的双模式架构,实现了对MySQL和Oracle的高度兼容。文章首先分析了OceanBase的兼容性架构,包括SQL解析层、优化器层和执行引擎层的差异化设计。随后对比了两种模式在数据类型、SQL语法、函数支持等方面的兼容性差异,其中MySQL模式兼容5.7版本大部分功能,Oracle模式则支持155个内置函数和PL/SQL特性。最后提出了模式选择的六大考量因素,包括现有系统基础、功能需求和迁移成本等,为数

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1231

Java里String类的字符串比较、两种实例化方式的比较、字符串连接的方法

字符串比较 字符串比较有四种常用方法: (一)比较字符串里的内容,返回布尔型的值 1.public boolean equals(String anObject)(判断时区分字母大小写) 2.public boolean equalsIgnoreCase(String anotherString)(判断时不区分字母大小写) public class Java { public static void main(String[] args) { String stra = "abc"; Stri

NightReality的博客 808

YOLO26全新改进 | 最全损失函数改进篇 | SIoU 、WIoU、GIoU、DIoU、EIOU、CIoU, InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

🔥本文详细介绍了如何修改YOLO26中的损失函数。首先提供了完整的损失函数核心代码,包括WIoU_Scale类和各种IoU计算方法。然后分三步指导修改:1)替换metrics.py中的bbox_iou方法;2)修改loss.py中的iou计算代码;3)更新tal.py中的相关代码。文中特别强调了修改损失函数应在模型结构调整后使用,并提供了多种IoU损失函数的参数配置建议,包括SIoU、WIoU、GIoU等,可根据实际需求灵活选择搭配使用。

Ai缝合怪、助力小伙伴高效发论文 455

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java之String类常用操作

public String(byte[] bytes,String charsetName)':通过使用指定的字符集解码当前参数中的字节数组来构造新的String。public String(byte[] bytes):通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。2、常量+变量 或者 变量+常量:都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址。Serializable:可序列化的接口,凡是实现此接口的类的对象就可以通过网络或者本地流进行数据的传输。

python全栈 6386

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java面向对象-String类

1,实例化String对象 有两种方式,我们直接看代码: 1 package com.java1234.chap03.sec08; 2 3 public class Demo1 { 4 5 public static void main(String[] args) { 6 // 实例化String的方式一 7 St...

weixin_30561425的博客 644

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深入理解String、StringBuffer和StringBuilder

本文主要针对面试中经常被问到的String的热点、难点进行深入分析,祝你备战秋招,直通BAT

Mr_wxc的博客 6万+

String类的两种实例化方式的使用与区别

String类实例化有两种方式: 通过直接赋值的形式为String类对象实例化 package com.yao.test; public class StringTest { public static void main(String[] args) { String str= "hello word"; System.out.println(str); } } 运行结果:hello word 通过构造方法实例化String类对象 packa

努力进阶的菜鸟的博客 808

java 不能实例化类型_java不能实例化类型

8.String类对象的两种实例化方式_计算机软件及应用_IT/计算机_专业资料。Java8面向对象编程视频课程 1、 课程名称:String 对象的两种实例化方式 2、知识点 2.1、......当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,......Jav...

weixin_36179402的博客 3347

String类对象两种实例化方式比较

String类两种对象实例化的区别现在已经给出了String类两种实例化的操作模式,那么在实际的开发之中使用哪一种会更好,以及彼此之间的区别。1、采用直接赋值: 代码略那么随后按照同样的模式继续进行新的字符串对象的创建public class StringDemo{ public static void main(String args[]){ String str1="hello"; Strin...

编程语言基础知识 580

Java之String类与StringBuffer类

一、String类 1.实例化方式 1)直接赋值法 String str="abc"; String类的设计采用了共享设计模式。在JVM底层实际上会自动维护一个对象池(字符串对象池),如果采用直接赋值法赋值,JVM会先在对象池中查找,如果有,则直接引用;如果没有,则将该实例化对象放到对象池中。 所谓对象池就是一个对象数组。优点:减少内存的开销。 2)构造法 String st...

smell201611010513的博客 1808

JAVA常用类库之String类

Java类库之StringString两种实例化方式比较:String类一旦申明则不可改变,两种实例化方式为: 方式一:使用构造方法String str = new String("hello"); 方式二:采用直接赋值的方式:String str = "hello";   一个字符串其实就是一个String类的匿名对象,匿名对象就是已经开辟了堆内存空间并且可以直接使用的的对象。实际

Just do it right now 752

Java——String类使用详解(实例化、字符串比较、匿名对象、两种实例化方法的区别)

dd

数字世界 万物互联 999

Java中String类两种实例化的区别

一、String类的第一种方式 1、直接赋值 例:String str = "hello"; 直接赋值实际上就是相当于一个匿名对象(“hello”)设置了一个名字(str),String类的匿名对象是由系统自动生成,不在由用户自己创建,产生了匿名对象就一定在堆内存在开辟了一块堆内存空间,并且由一块栈内存指向这块堆内存 2、采用直接赋值的String类对象的内存地址完全相同,stra,strb

wangdajiao的博客 4372

Java基础进阶1——String类讲解-上

我将发布一系列Java学习日记,帮助读者学习和巩固Java技术,希望各位多多支持,这是我Java系列第一篇,决定从String类开始讲起,结合开发经验和优快云上的java相关课程,写成文章。

weixin_49856935的博客 737
下一篇: Java中抽象类和接口的区别
String456
博客等级 码龄7年 0粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值