【数据结构】String类对象的创建与字符串常量池的“神秘交易”

news2024/11/13 14:41:33

作者主页:paper jie_博客

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。

本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。

其他专栏:《算法详解》《C语言》《javaSE》等

内容分享:本期将会分享java数据结构中的String对象创建的深入探索

目录

创建对象内的“那些事”

字符串常量池

对String对象创建的具体分析

直接使用字符串常量进行赋值

通过new创建String对象

intern方法


创建对象内的“那些事”

话不多说,直接上代码:

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
}

上面这个代码我们发现创建的String对象的方式类似,但是结果s1和s2是同一个对象,但s3和s4却却不是?

这就是要深究到java中的常量池了。在java中,“hello”,“1234”等常量经常被频繁使用,java为了让程序运行的速度更加快,跟节省内存,就为8种基本类型和String类提供了常量池。

java中引入了:

Class文件常量池:每个Java源文件编译后生成的.Class文件中会保存当前类中的字面常量以及符号信息

运行时常量池:在.Class文件被加载时,Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都会有一份

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

字符串常量池

字符串常量池在JVM中是一个StringTable类,实际是一固定大小的HashTable,它是一种高效查找的数据结构,在不同的JDK版本下字符串常量池的位置以及默认大小是不同的:

对String对象创建的具体分析

直接使用字符串常量进行赋值

public static void main(String[] args) {
        String str1 ="hello";
        String str2 ="hello";
        System.out.println(str1 == str2);
    }

这里直接通过画图分析:

通过new创建String对象

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

这里我们得到一个结论:只要是new出来的对象,就是唯一的

这里我们可以知道:使用常量串创建String类型对象的效率更高,更节省空间。用户也可以将创建的字符串对象通过intern方式添加进字符串常量池中

intern方法

intern方法的作用就是将创建的String对象添加到常量池中、

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

放开前返回的是false,放开后返回true:

使用方法前,常量池中没有“abc”,导致str2自己重新创建了一份abc“”

使用方法后,常量池中有了“abc”,str2直接拿过来用就可以了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【码制】原码反码补码移码浮点数

从C语言占位符到码值 学C语言的时候一定会用到printf("%d",a); 有的课程称%d为“占位符”,非常形象:%d替a占位,输出的时候a的值会替换%d的内容。 但也有课程称之为“转换规范”,官方称之为“format specifiers”格式说…

Git最佳实践:git常用命令和原理

Git 是一个开源的分布式版本控制系统。 Git 工作区、暂存区和版本库 工作区:就是你在电脑里能看到的目录。暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时…

7.20 SpringBoot项目实战【图书详情-学生端】:图书信息 + 评论列表 + 是否收藏

文章目录 前言一、接口规划二、编写服务层三、编写数据访问层四、编写控制器五、PostMan测试1. getBook 根据id获取图书2. getBookCommentList 根据id获取图书详情 - 评论列表3. getFavoriteId 获取学生收藏了某图书的收藏id 最后 前言 学生的【借阅申请】审核通过以后&#x…

nodejs+vue市民健身中心网上平台-计算机毕业设计

市民健身中心网上平台分为用户界面和管理员界面,用户界面功能模块图如图1所示,管理员界面功能模块图如图2所示。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs…

springboot+avue医院绩效考核系统源码

医院绩效考核系统是一种以人力资源管理为基础,选用适合医院组织机构属性的绩效理论和方法,基于医院战略目标,构建全方位的绩效考评体系,在科学、合理的绩效管理体系基础上,采用科学管理的方法,如平衡计分卡…

C++前缀和算法:生成数组原理、源码及测试用例

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划,日后完成。 题目 给定三个整数 n、m 和 k 。考虑使用下图描述的算法找出正整数数组中最大的元素。 请你构建一个具有以下属性的数组 arr &#…

Amazon CodeWhisperer让力扣不再用力code!

书接上文《爱编程 why not AI编程》,通过前文的对于Amazon CodeWhisperer的介绍、入门指南、相关课程以及【云上探索实验室】活动,各位读者们应该对于Amazon CodeWhisperer有了一些了解,那么作者今天将该通过本篇文章来介绍用Amazon CodeWhis…

OpenCV官方教程中文版 —— Canny 边缘检测

OpenCV官方教程中文版 —— Canny 边缘检测 前言一、原理1.噪声去除2.计算图像梯度3.非极大值抑制4.滞后阈值 二、OpenCV 中的 Canny 边界检测练习 前言 OpenCV 中的 Canny 边缘检测 • 了解 Canny 边缘检测的概念 • 学习函数 cv2.Canny() 一、原理 Canny 边缘检测是一种…

FreeRTOS深入教程(任务的引入及栈的作用)

文章目录 前言一、任务的引入二、深入理解C语言函数的调用1.ARM架构2.基础汇编指令3.函数运行流程分析 三.保存现场的几种情况1.函数调用2.中断处理3.任务切换 总结 前言 本篇文章开始带大家深入学习FreeRTOS,带大家学习什么是任务,并且深入学习栈的作用…

Openssl数据安全传输平台008:业务数据分析+工厂方法

文章目录 UML图1.1 客户端1.2 服务器端 UML图 1.1 客户端 // 准备要发送的数据 struct RequestMsg {//1 密钥协商 //2 密钥校验; // 3 密钥注销int cmdType; // 报文类型string clientId; // 客户端编号string serverId; // 服务器端编号string sign;string data; };1.2 服务器…

USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式

连接计算机外围设备最简单的方法是通过USB(通用串行总线)。USB是即插即用接口,可以将扫描仪、打印机、数码相机、闪存驱动器等计算机外围设备连接到计算机上。本篇文章就来介绍一下USB的一些基础知识,包括。 文章目录 1 接口类型和标准规范2 引脚分布3 …

前端Vue——安装和遇到的问题记录

文章目录 安装Node.js安装Vue需要的脚手架Vue Cli在PyCharm中开发Vue项目 安装Node.js 下载地址:https://nodejs.cn/download/ 下载.Msi即可,然后安装,一直next WinR,cmd,node -v可以查看node的版本,v18.1…

Deno 命令行界面

目录 1、命令行界面 ​2、脚本源 3、脚本参数 4、监听模式 5、完整性标记(lock files) 6、缓存和编译标记 7、运行时标记 7.1 类型检查标记 7.2 权限标记 7.2.1 权限 7.2.2 放心地运行不受信任的代码 7.2.3 权限列表 7.2.4 可配置权限 文件…

Vm虚拟机安装Linux(ubuntu18.04)系统教程(2023最新最详细)

软件:Linux版本:18.0.4语言:简体中文大小:1.82G安装环境:VMware硬件要求:CPU2.0GHz 内存4G(或更高) 下载通道①丨百度网盘: 1.Vm虚拟机15.5下载链接: https://pan.baidu.…

Vue项目中使用Multiavatarjs生成自定义随机头像-demo

Multiavatar & vue-color-avatar 前者使用简单一点提供的有api,后者更类似一个项目 主要使用Multiavatar去实现随机生成头像的功能 https://github.com/multiavatar/Multiavatar/blob/main/multiavatar.js 使用很简单,把js下载保存到项目中&#xff…

【Top101】002链表内指定区间反转

链表内指定区间反转_牛客题霸_牛客网 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿…

零代码编程:用ChatGPT将Mobi、epub、azw3等电子书批量转换为word文档

将ebook格式转换为PDF需要一个名为Calibre的命令行工具。这是一个开源的电子书管理工具,首先在系统上安装它,软件下载地址:https://calibre-ebook.com/download_windows 然后将其添加到PATH环境变量中: 接下来,在ChatG…

学信息系统项目管理师第4版系列35_补遗

题外话:1. 计划没有变化快,10月18日软考出了通告,10月28日和29日分别是信息系统项目管理师第一批次和第二批次考试,比原先11月4日提前一周,祝贺那一批敢为人先的幸运儿。 2. 该系列也进入了尾声,补遗是正文…

【Maven】Unknown lifecycle phase “.skip.test=true“.

idea 终端执行如下命令时 mvn clean install -Dmaven.skip.testtrue报&#xff1a; Unknown lifecycle phase ".skip.testtrue". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id&…

【ONE·C++ || 智能指针 特殊类的设计】

总言 主要介绍智能指针&#xff08;auto_ptr、unique_ptr、shared_ptr、weak_ptr&#xff09;和特殊类的设计&#xff08;单例模式&#xff09;。 文章目录 总言1、为什么需要智能指针&#xff1f;&#xff08;内存泄漏&#xff09;1.1、什么是内存泄漏1.2、内存泄漏的分类和常…