【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); // true
	System.out.println(s1 == s3); // false
	System.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的实现会有些许的差别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM 性能调优 - Java 中的四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

070:vue+cesium: 利用canvas设置径向渐变色材质

相关API参考: https://cesium.com/learn/cesiumjs/ref-doc/ColorMaterialProperty.html 第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. …

centos间文件传输

scp /home/vagrant/minio zx192.168.56.34:/home/zx /home/vagrant/minio 是你要传输的文件而且是当前机器登录用户有权限操作的文件 zx是目标机器的用户192.168.56.34是目标机器的地址 /home/zx是要传到这个文件夹下 要确保zx有/home/zx这个文件夹的操作权限 本质就是ssh文…

[leetcode] 27. 移除元素

文章目录 题目描述解题方法双指针java代码复杂度分析 相似题目 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O ( 1 ) O(1) O(1) …

分布(一)利用python绘制直方图

分布(一)利用python绘制直方图 直方图(Histogram)简介 直方图主要用来显示在连续间隔(或时间段)的数据分布,每个条形表示每个间隔(或时间段)的频率,直方图的…

2024年考PMP还有什么用?

PMP 是项目管理专业人士资格认证的意思,也是项目管理领域通用的证书, 做项目的基本都会去考。 要说 PMP 有啥作用? 个人感觉 PMP 证书更多的是跳槽、转行的敲门砖的作用,因为现在很多公司都要 PMP 证书,有了可以加分…

VS Code+Live Server插件开发游戏并结合内网穿透分享好友异地访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程,我们将通过VS Code实现远程开发MENJA小游戏,并通过cpolar内网穿透发布到公网,分…

springboot157基于springboot的线上辅导班系统的开发与设计

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

fastapi 链接数据库,并报错问题

还有一个重点需要下载 pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simplefrom fastapi import FastAPI import uvicorn from student.urls import student_id_mysql from sqlalchemy …

【sentinel流量卫兵配置持久化到Nacos】

sentinel流量卫兵配置持久化到Nacos 概述: 一、添加配置二、配置说明限流规则配置:降级规则配置:热点规则配置:授权规则配置:系统规则配置: 三、服务整合 概述: 控制台配置的参数,默…

2024/2/4学习记录

微信小程序 网络数据请求 出于安全性方面的考虑,小程序官方对数据接口得请求做出了俩个限制 只能对 https 类型的接口必须将接口的域名添加到信任列表中 需要去这里设置 域名只支持 https 协议域名不能使用 ip 地址 或者localhost域名必须经过 ICP 备案 服务器域…

【C++】基础语法:深浅拷贝

前言 在学习拷贝构造函数的时候遇到了深浅拷贝这个知识点 就写篇文章记录一下 (引用的部分不用太在意 是查的 (需要前提知识:知道默认拷贝构造函数是什么 知道默认拷贝构造函数和构造函数的关系、知道析构函数的写法和用处 浅拷贝 浅拷贝&…

周报(20240204)

日期:2024.1.29 - 2024.2.4 本周工作: 1. 阅读论文 本周主要对这篇文献进行了阅读: 《用可学习的跳跃连接缩小U-Net中的语义差距:以医学图像分割为例》 背景 医学图像分割和随后对目标对象的定量评估为疾病诊断和治疗规划提…

在Vue中如何动态绑定class和style属性

在Vue中,动态绑定class和style属性是我们经常遇到的需求。这个功能允许我们根据不同的条件来动态改变元素的样式,让我们的应用更加灵活和富有交互性。在本篇博客文章中,我将带你深入探索在Vue中如何实现这一功能。 首先,让我们了…

c++中使用ifstream对文件按照行间隔或者符号间隔来读取

简单的文本存取与读取在的程序中是比较常见的,一般为了读取的时候便于区分数据,我们常常会用空格或者空行来隔开数据字段,所以对于读取文件的操作我们肯定会有些具体的需求比如按照行读取或者按照词来读取(或者说是以空格来间隔数…

函数调用栈是什么

今天在力扣leetbook上看《图解算法数据结构》中的空间复杂度这一小节,看到如下这句话: “程序调用函数是基于栈实现的,函数在调用期间,占用常量大小的栈帧空间,直至返回后释放。” 这句话的意思是,在程序中…

SQL必知必会笔记(13~16章)

第十三章 创建高级联结 1、别名:缩短SQL语句,允许在一条Select语句中多次使用相同的表 SELECT A.Name, A.Maths, A.English FROM transcript AS A INNER JOIN student_id As B ON A.Name B.Name; 2、Oracle数据库中没有AS关键字,直接在表名或…

【计算机学院寒假社会实践】——服务走进社区,共绘幸福蓝图

为深入贯彻落实志愿者服务精神,扎实推进志愿者服务质量,2024年1月28日,曲阜师范大学计算机学院“青年扎根基层,服务走进社区”社会实践队队员周兴睿在孙宇老师的指导下,来到山东省滨州市陈集街道社区开展了为期一天的“…

Unity_ShaderGraph节点问题

Unity_ShaderGraph节点问题 Unity版本:Unity2023.1.19 为什么在Unity2023.1.19的Shader Graph中找不见PBR Master节点? 以下这个PBR Maste从何而来?

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势: 服务解耦 性能提升,吞吐量提高 服务没有强依赖,不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高,所有大多数时间用同步。而如果不需要对方的结果,且吞吐…