java中的字符串(String)常量池理解

下面创建String对象的方式一样吗?

上述程序创建对象类似,为什么s1和s2引用对象一样,但是s3和s4不一样呢?

在java程序中,许多基本类型的字面常量会经常用到,例如2,3.11,“hyy”等。为了提升程序的运行效率,节省内存,java为八种基本数据类型(int float long double char byte boolean short)提供了常量池

池是编程中,常见的提高效率的一种方式。

例如:

家庭条件不是太好的人,每个月定期打生活费,但有时紧急情况,急需用钱,需要打电话找父母要,比较麻烦,费时间。

如果家里有矿,父母直接把一整年的生活费都放到卡里,随用随取,很方便,效率就更高。

常量池有很多,今天我们聚焦学习字符串常量池(StringTable)

字符串常量池在JVM中是,StringTable类,实际上底层就是固定大小的HashTalble(一种搜索效率很高的数据结构,详细见【什么是哈希表(HashTable)? - CSDN App】)

好回到刚才提到的问题,为什么s1==s2?

s1和s2都是用“”双引号创建的String对象,这种创建方式的特点是至多只会创建一个相同的对象

在最初创建“hello”时,首先会用StringTable(也就是字符串常量池)寻找是否有“hello”,

如果没有:

创建一个创建一个指向“hello”的对象,然后返回指向这个对象的引用。

如果有:

直接返回指向“hello”对象的引用。


而对于s3和s4这种new String对象的创建方式,特点是

至少会创建一个对象(在堆区)

因此,s3(s3创建了两个对象,一个在字符串常量池一个在堆区)和s4(s4创建了一个对象,在堆区)分别都创建了至少一个对象,其引用,自然也就不一样。

关于字符串常量池的形象理解(看懂就会了)

注意虽然两种创建方式,一定会在常量池创建一个对象,但是两个对象是分开创建的,不是在常量池共用一个对象。

另外,关于字符串常量池,介绍一个方法:

intern()方法

观察这个程序:

如果理解前文所说的,s2==s3是false就很好理解了。

那么intern()是用来干嘛的呢?

英文就是“进入”的意思:

调用完这个方法后,我们发现,s2真的等于s3了!

这就是intern()方法的作用(手动入池):

可以把没有(有,就不塞)在常量池中的String对象,塞进字符串常量池。

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

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

相关文章

一文读懂Vue生命周期(Vue2)

一文读懂Vue生命周期(Vue2) 目录 一文读懂Vue生命周期(Vue2)1 前言2 Vue生命周期2.1 基本生命周期2.1.1 8个生命周期2.1.2 案例 2.2 组件生命周期2.2.1 父子生命周期2.2.2 案例 2.3 keep-alive生命周期2.3.1 案例 2.4 其他 3 总结…

OpenHarmony实战开发-应用侧调用前端页面函数

应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。 在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触发前端页面的htmlTest()方法。 前端页面代码。 <!-- index.html --> <!DOCTYPE html> <html> <…

迭代器解释(C++)

一、什么是迭代器 为了提高C编程的效率&#xff0c;STL&#xff08;Standard Template Library&#xff09;中提供了许多容器&#xff0c;包括vector、list、map、set等。然而有些容器&#xff08;vector&#xff09;可以通过下标索引的方式访问容器里面的数据&#xff0c;但是…

php基础知识快速入门

一、PHP基本知识 1、php介绍&#xff1a; php是一种创建动态交互性的强有力的服务器脚本语言&#xff0c;PHP是开源免费的&#xff0c;并且使用广泛。PHP是解释性语言&#xff0c;按顺序从上往下执行&#xff0c;无需编译&#xff0c;直接运行。PHP脚本在服务器上运行。 2、ph…

【STM32嵌入式系统设计与开发】——18StaticNixite(静态数码管应用)

这里写目录标题 STM32资料包&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码&#xff1a;88881、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;主函数头文件函数&#x…

Vue 介绍

【1】前端发展史 前端的发展史可简述为&#xff1a; 从最初的静态页面编写&#xff0c;依赖后端模板渲染逐步演化为通过JavaScript&#xff08;特别是Ajax技术&#xff09;实现前后端分离&#xff0c;使得前端能够独立地加载数据和渲染页面随后&#xff0c;Angular、React、Vu…

CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

在我遇到的题目中&#xff0c;想要读取文件必然是要执行cat /flag这个命令&#xff0c;但是题目当然不会这么轻松。让你直接cat出来&#xff0c;必然会有各种各样的滤过条件&#xff0c;你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。 下面我…

Vite构造Vue3

环境安装 node.js安装-CSDN博客 初始化Vue项目安装脚手架_vue init webpack安装脚手架-CSDN博客 选择Vue框架 &#xff0c;项目名称可以自定义&#xff0c;我使用默认的 vite-project 选择JS 进入项目安装依赖 安装路由

Leetcode编程练习

面试题-消失的数字 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& …

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;2、3、1、5、0、6 十位&#xff1a;4、3、6、8、0、9 个位&#xf…

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…

嵌入式学习

笔记 作业 有如下结构体 struct Student{ char name[16]; int age; double math_score; double chinese_score; double english_score; double physics_score; double chemistry…