JAVA字符串的两种定义方式的区别

2023-11-15

关于JAVA中两种字符串定义方式的区别

第一次写,就当复习总结一下,希望能帮到需要的人吧= =

我们知道在JAVA中,对于字符串的实例化方式有两种:

  • 直接赋值:String str = “Hello World”;
  • 构造方法实例化:String str = new String(“Hello World”);
    对于这两种实例化有何区别,首先我们先来聊一聊直接赋值的方式
    观察下面的例子:
public class StringDemo{
	public static void main(String[] args) {
		String str1 = "Hello qty";
		String str2 = "Hello qty";
		String str3 = "Hello qty";
		String str4 = "Hello ytq";
		System.out.println(str1==str2);
		System.out.println(str1==str3);
		System.out.println(str2==str3);
		System.out.println(str1==str4);
	}
}

对于以上的输出结果
true
true
true
false

“==”虽然是一种字符串的比较,但是它实际上比较的并不是字符串的内容,而比较的是它们所在的内存地址的数值。可能会有疑惑,字符串的直接赋值,会产生一个新的堆内存空间,那么这里应该产生了三块堆内存空间,并且有不同的三个内存地址才对,但这里为什么会出现str1和str2和str3的内存地址是相同的呢?
先来个内存图简单说明一下,在这里字符串的直接赋值方式,会给字符串赋予一个“名字”(其实就是堆内存的地址),并且开辟一段新的堆内存(存数据)。
在这里插入图片描述
画图水平一般,将就看吧,为什么这里会出现str1,str2,str3同时指向同一块堆内存?

因为这里JAVA存在着共享设计池(常量池)的概念

什么是共享设计模式?
在JVM底层实际会存在一个对象池,在用户通过直接赋值的方式定义了字符串时,这时候该字符串对应的匿名对象(在上述案例中就是Hello qty和Hello ytq,字符串常量就是对应的String类的匿名对象- -)自动“入池保存”,倘若后续过程中用户再次直接赋值定义了字符串并且还使用了相同的内容,那么将不再开辟新的堆内存,而是令其指向原来已经入池的对象进行引用。
因为字符串的值一旦设定将无法改变,因此,JAVA的设计者认为共享的设计方式,可以带来更高的效率。

  • 接下来说说构造方法实例化字符串的方式
    String str = new String(“Hello qty”);
    在这里插入图片描述

看到这里就已经很清楚构造方法实例化这种方式比较于直接赋值的缺陷所在,多开辟了一块堆内存,存在垃圾问题。
再来观察一段构造方法实例化字符串的代码:

public class StringDemo{
	public static void main(String[] args) {
	String str1 = new String("Hello qty");
	String str2 = "Hello qty";
	System.out.println(str1==str2);
	}
}

对于以上输出结果:
false
先来张图片说说,在此画上常量池:
在这里插入图片描述
s1先去常量池寻找是否有“Hello qty”的字符串,若有则不创建新的,仅仅在堆内存中创建字符串(因为new关键字存在,就一定会去堆内存中开辟空间存放字符串),接着s2直接赋值定义字符串时,由于常量池存在,故不会创建新的字符串。我们说过==符号在用于引用数据类型时,比较的是两者的地址值,前者在堆内存中有指向,后者没有,因此结果会得到false。

构造方法实例化字符串会存在一部分垃圾空间,便是堆内存中重复创建的字符串字段,因此直接赋值的方式确实优于构造方法的方式,因此字符串在使用时都使用的是直接赋值的方法。

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

JAVA字符串的两种定义方式的区别 的相关文章

  • 如何将字符串方法应用于数据帧的多列

    我有一个包含多个字符串列的数据框 我想使用对数据帧的多列上的系列有效的字符串方法 我希望这样的事情 df pd DataFrame A 123f 456f B 789f 901f df Out 15 A B 0 123f 789f 1 45
  • 如何在 LLVM 中实现字符串数据类型?

    我一直在看LLVM http llvm org 最近 我发现它是一个非常有趣的架构 然而 浏览教程和参考材料 我看不到任何关于如何实现的示例string http en wikipedia org wiki String computer
  • 一起使用 String 和 int 时的 System.out.println 行为 [重复]

    这个问题在这里已经有答案了 考虑下面的代码片段 public class Student public static void main String args int a 3 int b 4 System out println a b
  • 如何在C中递归地找到另一个字符串中的字符串位置?

    我们有一个任务来创建带有两个字符串参数的递归函数 原型应该是这样的 int instring char word char sentence 如果我们愿意调用函数 instring Word Another Word 它应该具有以下返回值
  • VBA按空格分割字符串

    我想要一个 Excel 函数 我可以调用该函数并将单元格传递到其中 输入 Firstname Lastname email protected cdn cgi l email protection Firstname midname Las
  • 在 Swift 中删除字符串中第一个字符的最简洁方法是什么?

    我想删除字符串中的第一个字符 到目前为止 我想到的最简洁的事情是 display text display text substringFromIndex advance display text startIndex 1 我知道我们不能用
  • 在字符串中每个字母后面添加数字

    我有几个具有固定格式的字符串 格式为一个字母后跟一个数字 例如 A3B1C7D1 但是 如果字母后面的数字为 1 则字符串将写为 A3BC7D 我想做的是插入数字 1 然后将字符串转换为A3BC7D to A3B1C7D1 我的示例数据是
  • 如何在Powershell控制台中分配多行字符串

    当我在 powershell 控制台中输入此内容时 test Test Test 并且输入多次 它会一直打印 gt gt 所以我永远无法完成命令 该怎么办 应该是行中的第一件事 或者它被认为只是字符串的一部分 test Test Test
  • R:变换不规则时间字符串

    我有两个不同的时间序列 来自不同的数据帧 具有不同的不规则格式 但问题是相同的 我只想提取小时 分钟 秒和毫秒 时代系列看起来像这样 ts1 08 27 23 445 08 27 24 280 08 27 25 115 I tried st
  • Pandas - 修改每个单元格中的字符串值

    我有一个 pandas 数据框 我需要修改给定字符串列中的所有值 每列包含相同长度的字符串值 用户提供他们想要为每个值替换的索引 例如 1 3 和重置价值 AAA 这会将值 1 到 3 中的字符串替换为值AAA 我怎样才能使用applyma
  • Java:一种将 Mime(内容)类型与 CommonsMultipartFile 中的文件扩展名相匹配的方法

    在我的公司 出于额外原因 我需要将 mime 类型与文件扩展名进行比较 我有一个CommonsMultipartFile 我正在尝试找出进行这种比较的最佳方法 我见过一个MimetypesFileTypeMap 但不确定这是否适用于此 我试
  • 如何使用逗号和行分隔符对字符串进行标记

    我正在 Swift 中制作一个简单的 String Tokenizer 就像在 Java 中一样 但这对我来说确实不起作用 我的数据源中每行的末尾用 分隔 数据用逗号分隔 例如 字符串 1 字符串 2 字符串 3 字符串 1 字符串 2 字
  • 将 NSAttributedString 的子字符串替换为另一个 NSAttributedString

    我想替换一个子字符串 例如 replace of an NSAttributedString和另外一个NSAttributedString 我正在寻找一种等效的方法NSString s stringByReplacingOccurrence
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但
  • 正则表达式 匹配捕获组内的文本

    示例文本 ruby object DynamicAttribute attributes resource id 1 resource type Applicant string value Michael int value id 359
  • 如何将 SQL 结果存入 STRING 变量?

    我正在尝试获取 C 字符串变量或字符串数 组中的 SQL 结果 是否可以 我需要以某种方式使用 SqlDataReader 吗 我对 C 函数和所有功能非常陌生 曾经在 PHP 中工作 所以如果可以的话请给出一个工作示例 如果相关 我已经可
  • 属性文件中的字符串主机名:Java

    这听起来可能是一个非常简单的问题 但我无法找到解决方法 我有一个 config properties 文件 其中包含两个键值 IP 地址和端口号 我读取此配置文件以提取字符串格式的键值 但是 当我尝试使用这些值时 我无法连接到从配置文件中检
  • 如何在 JScript 中解码 Base64 字符串

    我必须在 JScript 中解码 Base64 字符串 并且我已经尝试使用此代码来执行目的操作 var xmlDom new ActiveXObject Microsoft XMLDOM var el xmlDom createElemen
  • 如何在Python中不使用库函数将字符串转换为整数?

    我正在尝试转换 a 546 to a 546 不使用任何库函数 我能想到的 最纯粹 gt gt gt a 546 gt gt gt result 0 gt gt gt for digit in a result 10 for d in 01

随机推荐

  • 剑指offer 学习笔记 二叉树的深度

    面试题55 二叉树的深度 1 输入一棵二叉树 求该树的深度 只需遍历整棵树的每一条路径找出最长的即可 以下代码中的树结构为 include
  • .777勒索病毒数据恢复

    引言 在当今数字化时代 勒索病毒威胁日益严峻 其中 777 勒索病毒 是近期备受关注的一种恶意软件 本文91数据恢复将介绍 777 勒索病毒 的特点和工作原理 并探讨在遭受该病毒攻击后 被加密的数据文件如何进行恢复 如不幸感染这个勒索病毒
  • 初时Python博大精深

    Python是解释型语言 编译型vs解释型 编译型优点 编译器一般会有预编译的过程对代码进行优化 因为编译只做一次 运行时不需要编译 所以编译型语言的程序执行效率高 可以脱离语言环境独立运行 缺点 编译之后如果需要修改就需要整个模块重新编译
  • 卸载阿里云的mysql_阿里云linux上,记一次mysql重装——卸载,安装 mysql 5.7

    上一次的挖矿病毒可是搞惨我了 虽然勉强清掉了 但是不知道为什么mysql后来无法登录了 找了一切办法来解决 from百度 然并卵 好吧 重装 1 备份 备份原来的数据库 里面有我的所有数据库脚本文件 一一拷出来 root jun cd us
  • ABTest灰度发布

    ABtest一个总的目的和意图是 判断哪种种UI或rerank策略更优 通过事实的依据 CTR或下单率 判断哪种策略更符合用户的习惯和需求 我们经常会面临多个设计方案的选择 比如app或pc端某个界面的某个按钮是用红色还是用蓝色 是放左边还
  • mysql生成随机时间,随机整数

    SELECT FLOOR 7 RAND 6 取7到12的随机整数 包括7到12 SELECT FLOOR 12 rand 13 取12到24的随机整数 包括12到24 LPAD FLOOR 0 RAND 23 2 0 取0 24之间的随机数
  • JUC-13. JMM

    想了解更多JUC的知识 JUC并发编程合集 1 Java内存模型 JMM Java内存模型Java Memory Model 简称JMM 本身是一种抽象的概念 并不真实存在 它描述的是一组规则或规范 通过规范定制了程序中各个变量 包括实例字
  • 凌乱的日期

    import java util ArrayList import java util Arrays import java util Collections import java util HashSet import java uti
  • ubuntu安装驱动 USB转转串口 232串口 PL2303 DB9

    ubuntu安装驱动 USB转串口 RS232串口 PL2303 DB9 工具 安装软件minicom minicom功能快捷键 minicom的使用 cutecom软件安装 cutecom使用 工具 因为我使用的是rs232串口设备芯片为
  • 6.Docker容器底层实现了解与安全机制

    原文地址 点击直达 文章目录 0x00 底层实现 基本架构 简述I O设备 1 命名空间 2 控制组 子系统之Devices 子系统之cpuset 子系统之cpu 子系统之cpuacct 子系统之memory 子系统之blki
  • 一看就懂TCP/IP协议族全析

    TCP IP协议族 计算机与网络设备要相互通信 双方就必须基于相同的方法 如何探测到通信目标 由那一边现发起通信 使用哪种语言 使用那种操作系统 怎样结束通信等都需要事先确定 不同的硬件 操作系统之间的相互通信 所有的这一切都需要一种规则
  • QDialog、QWidget、QMainWindow的区别

    QDialog QWidget QMainWindow的区别 dialog有exec函数 如果是dialog窗口 后边的窗口是不可选的 widget和dialog都有show函数 如果通过这个函数显示这两种类型的窗口 则两个窗口都是可选的
  • 国际带宽市场的发展趋势和前景

    随着全球互联网的不断普及和云计算 人工智能等新技术的迅猛发展 国际带宽市场在不断扩大 成为了全球信息通信领域的重要组成部分 本文将就国际带宽市场的发展趋势和前景进行探讨 一 市场概况 国际带宽是指一个国家或地区连接国际互联网所拥有的带宽资源
  • VMware Workstation Pro 16.2.4安装教程

    VMware Workstation Pro 16 2 4 安装教程 文章目录 VMware Workstation Pro 16 2 4 安装教程 下载最新版VMware 双击打开 自定义安装位置 把 去掉 点击下一步 等待安装 点击许可
  • 主从服务器 共用文件,Docker+keepalived+nginx实现主从热备的方法示例

    前言 为解决单点故障 我们需要配置主从热备方案 服务器数量有限 故使用Docker模拟安装配置 本次配置默认已经安装了Docker 配置环境 centos7 64位 docker版本 Docker version 17 12 1 ce bu
  • Apache Storm之集群安装

    1 环境 storm 1 2 1 Java 7 storm 1 x对java 7 和 java 8均进行了测试 Pytho 2 6 6 Python 3 x理论上也可以 但是并不作为storm的测试 以上是storm的环境 如果不匹配的ja
  • python-异常处理汇总

    1 需求 当程序遇到问题时 不让程序结束 而越过错误继续向下执行 格式 try 语句t except 错误码 语句1 except 错误码 语句2 except 错误码 语句3 except 错误码 语句n else 语句e 注意 else
  • 数字IC秋招面试专题(二)verilog的signed和unsigned

    数字IC秋招面试专题 二 verilog的signed和unsigned 前言 一 右值按signed还是unsigned 二 signed的自动扩位 三 系统函数 signed 和 unsigned 总结 声明 未经作者允许 禁止转载 推
  • ​【UI界面】Foobar2000 FlatLite 整合版

    Foobar2000 是一款本地音乐播放器 这里我就不再做介绍了 不懂的请自行了解 此 Foobar2000 FlatLite 主题包为整合版本 下载既可用 主题界面是模块化的 JS 面板 每个面板都是独立的 面板里的图标也是由 JS 脚本
  • JAVA字符串的两种定义方式的区别

    关于JAVA中两种字符串定义方式的区别 第一次写 就当复习总结一下 希望能帮到需要的人吧 我们知道在JAVA中 对于字符串的实例化方式有两种 直接赋值 String str Hello World 构造方法实例化 String str ne