【Java 数据结构】String进阶

字符串常量池

  • 1. 创建对象的思考
  • 2. 字符串常量池(StringTable)
  • 3. 再谈String对象创建

1. 创建对象的思考

下面两种创建String对象的方式相同吗?

public static void main(String[] args) {String s1 = "hello";String s2 = "hello";String s3 = new String("hello");String s4 = new String("hello");System.out.println(s1 == s2); // trueSystem.out.println(s1 == s3); // falseSystem.out.println(s3 == s4); // false
}

上述程序创建方式类似,为什么s1和s2引用的是同一个对象,而s3和s4不是呢?

在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池

“池” 是编程中的一种常见的, 重要的提升效率的方式, 我们会在未来的学习中遇到各种 “内存池”, “线程池”, “数据库连接池” …

为了节省存储空间以及程序的运行效率,Java中引入了:

  1. Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息
  2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份
  3. 字符串常量池

2. 字符串常量池(StringTable)

字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable(一种高效用来进行查找的数据结构,后序给大家详细介绍),不同JDK版本下字符串常量池的位置以及默认大小是不同的:
在这里插入图片描述
关于方法区、堆等内存结构的具体局部,后序JVM中会给大家详细介绍。

3. 再谈String对象创建

由于不同JDK版本对字符串常量池的处理方式不同,此处在Java8 HotSpot上分析

  1. 直接使用字符串常量进行赋值
public static void main(String[] args) {String s1 = "hello";String s2 = "hello";System.out.println(s1 == s2); // true
}

在这里插入图片描述
2. 通过new创建String类对象在这里插入图片描述
结论:只要是new的对象,都是唯一的。

通过上面例子可以看出:使用常量串创建String类型对象的效率更高,而且更节省空间。用户也可以将创建的字符串对象通过 intern 方式添加进字符串常量池中。

3 . intern方法

intern 是一个native方法(Native方法指:底层使用C++实现的,看不到其实现的源代码),该方法的作用是手
动将创建的String对象添加到常量池中。

public static void main(String[] args) {char[] ch = new char[]{'a', 'b', 'c'};String s1 = new String(ch); // s1对象并不在常量池中//s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中String s2 = "abc"; // "abc" 在常量池中存在了,s2创建时直接用常量池中"abc"的引用System.out.println(s1 == s2);
}
// 输出false
// 将上述方法打开之后,就会输出true

注意:在Java6 和 Java7、8中Intern的实现会有些许的差别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CIFS(Samba)服务的使用

理论部分 概念: 通用互联网文件系统CIFS使用的是公共的或者开放的SMB协议版本。SMB是在会话层和表示层以及小部分应用层上的 协议,使用了NetBIOS的应用程序接口API。该协议在局域网上用于服务器文件访问和打印。它使用客户/服务器模式,客 户…

【实训】自动运维ansible实训(网络管理与维护综合实训)

来自即将退役学长的分享,祝学弟学妹以后发大财! 一 实训目的及意义 1.1 实训目的 1、熟悉自动化运维工具:实训旨在让学员熟悉 Ansible 这一自动化运维工具。通过实际操作,学员可以了解 Ansible 的基本概念、工作原理和使用方法…

ACM训练题:Division

题意是给你N&#xff0c;打印出所有相除等于N的五位数&#xff08;包含前导零&#xff09;&#xff0c;可以枚举后五位&#xff0c;计算量是10&#xff01;/5&#xff01;&#xff0c;然后乘N&#xff0c;一起检验10个数是否都出现。 AC代码&#xff1a; #include <iostre…

读论文:DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior

DiffBIR 发表于2023年的ICCV&#xff0c;是一种基于生成扩散先验的盲图像恢复模型。它通过两个阶段的处理来去除图像的退化&#xff0c;并细化图像的细节。DiffBIR 的优势在于提供高质量的图像恢复结果&#xff0c;并且具有灵活的参数设置&#xff0c;可以在保真度和质量之间进…

智慧树考试怎么搜题找答案?分享9个有手机就能搜题的工具 #学习方法#微信#知识分享

市面上搜题软件不少&#xff0c;大部分都挺好用的&#xff0c;今天小编在这里给大家分享几个好用的搜题工具&#xff0c;都拥有丰富的题库资源&#xff1b;而且搜题功能也都很完善&#xff0c;手机端、网页端均有&#xff0c;有需要的小伙伴赶紧码住&#xff01; 1.七燕搜题 …

进程控制(Linux)

进程控制 一、进程创建1. 再识fork2. 写时拷贝 二、进程终止前言——查看进程退出码1. 退出情况正常运行&#xff0c;结果不正确异常退出 2. 退出码strerror和errno系统中设置的错误码信息perror异常信息 3. 退出方法exit和_exit 三、进程等待1. 解决等待的三个问题2. 系统调用…

springboot 拦截器

定义 拦截器类似于javaweb中filter 功能 注意: 只能拦截器controller相关的请求 作用 举一个例子&#xff0c;例如我们在Controller中都有一段业务逻辑&#xff0c;这样我们就可以都统一放在拦截器中 因此拦截器的作用就是将controller中共有代码放入到拦截器中执行,减少co…

常用Hallmark及KEGG、GO基因查询

文献&#xff1a;The Molecular Signatures Database (MSigDB) hallmark gene set collection - PMC (nih.gov) GSEA | MSigDB | Browse Human Gene Sets (gsea-msigdb.org)通过msigdb数据库可以查看各个Hallmark、KEGG、GO具体包含的基因细节。 Hallmark nameProcess categor…

MMLAB的实例分割算法mmsegmentation

当谈及实例分割时&#xff0c;人们往往只会提到一些早期的经典算法&#xff0c;比如 PSP-Net、DeepLabv3、DeepLabv3 和 U-Net。然而&#xff0c;实例分割领域已经在过去的五六年中蓬勃发展&#xff0c;涌现出许多新的算法。今天&#xff0c;让我们一起探索这个算法库&#xff…

Bootstrap5 图片轮播

Bootstrap5 轮播样式表使用的是CDN资源 <title>亚丁号</title><!-- 自定义样式表 --><link href"static/front/css/front.css" rel"stylesheet" /><!-- 新 Bootstrap5 核心 CSS 文件 --><link rel"stylesheet"…

Unity3D实现项目限制功能(使用次数限制和时间限制)

系列文章目录 unity工具 文章目录 系列文章目录前言一、时间限制1-1、代码如下&#xff1a; 二、次数限制2-1、 在Unity项目中需要对注册表进行操作&#xff0c;还需要设置一下API兼容级别设置成 .NET Framework2-2、设置如下图 Player里面2-3、代码如下&#xff1a; 三、同时…

前端超好玩的小游戏合集来啦--周末两天用html5做一个3D飞行兔子萝卜小游戏

文章目录 💖飞行兔子萝卜小游戏💟效果展示💟代码展示源码获取💖飞行兔子萝卜小游戏 💟效果展示 💟代码展示 <body> <script src=