补坑:Java的字符串String类(3):再谈String

不太熟悉字符串的可以看看这两篇文章

补坑:Java的字符串String类(1)-CSDN博客

补坑:Java的字符串String类(2):一些OJ题目-CSDN博客

字符串创建对象

    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
    }

 

观察上面的代码,和debug结果。为什么s1=s2,而四个字符串的value和hash值相同的情况下s1!=s3, s3!=s4呢?

这就需要提到一个概念:字符串常量池

为了使程序的运行速度更快、 更节省内存Java8种基本数据类型和String类都提供了常量池

那什么是“池”呢?

“池”是编程中一种重要的提升效率的方式

比如家里向我们打生活费,有两种方法

方法1:每月定时打生活费,有可能会晚,有时候还需要我们向家里人开口要,效率很低

方法2:存到银行卡,把一年的生活费打到卡里,自己随时都可以取用

这里的方法2其实就是“池”的一种体现

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

这篇文章我们主要讲字符串常量池


字符串常量池

JVM中的StringTable类,就是一个固定大小的HashTable

那什么样的会放入常量池中呢?

1.只要是双引号引起的,都会放在常量池中

我们重新分析文章开头的代码

StringTable这张表里面存放了很多的字符串对象,每个字符串对象都有hash和value,我们随便找一个地址(0x111)的字符串对象来举例

s1本身作为一个字符串对象,也有value和hash(注意value是一个数组),而s1 = “hello"

其实相当于s1的value指向hello这个对象

此时再让刚刚StringTable里0x111的字符串对象的hash指向s1的value,这样hello就可以借助s1存进常量池里了

此时又有一个s2 = "hello",遇到双引号,先去常量池查找是否有当前这个字符串,一查还真有,那就不会再把这个对象再存一遍了,那s2就可以获得常量池中hello的字符串对象的地址0x77了

🆗我们接着来看s3

因为s3的操作是new String 创建一个新对象,把这个新对象的value指向hello,所以后面会产生s1!=s3的情况

2.intern方法

    public static void main(String[] args) {
        char[] ch = new char[]{'a', 'b', 'c'};
        String s1 = new String(ch); 
        //s1.intern();
        String s2 = "abc"; 
        System.out.println(s1 == s2);
    }

先把ch和s1对象创好

new String()里面传入一个ch,我们看看源码

源码告诉我们传入东西后将这份东西再拷贝一份,s1的value引用指向拷贝出来的ch

s2的代码就是给常量池存入abc

整个流程

我们解锁s1.intern();这行代码

这行代码意思是让s1所指的对象入池,如果常量池当中存在,就不入池

 

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

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

相关文章

compile: version “go1.19“ does not match go tool version “go1.18.1“

** 1 安装了新版本的go后 为什么go version 还是旧版本? ** 如果你已经按照上述步骤安装了新版本的 Go,但 go version 命令仍然显示旧版本,可能是因为你的环境变量设置不正确或未正确生效。你可以尝试以下方法来解决问题: 重新…

YOLOV5改进:RefConv | 即插即用重参数化重聚焦卷积替代常规卷积,无额外推理成本下涨点明显

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点 3.涨点效果:RefConv,实现有效涨点! 论文地址 …

优雅关闭TCP的函数shutdown效果展示

《TCP关闭的两种方法概述》里边理论基础,下边是列出代码,并且进行实验。 服务端代码graceserver.c的内容如下: #include "lib/common.h"static int count;static void sig_int(int signo) {printf("\nreceived %d datagrams\…

nature日报:为什么印度德里现在的空气污染如此严重?

为什么印度德里现在的空气污染如此严重? 后季风季节为印度大城市的空气污染积累创造了理想的条件。 本文整理扩展自2023年11月10日nature杂志的NEWS EXPLAINER——Why is Delhi’s air pollution so bad right now? (nature.com) Highlights 季风期间&#xff0…

经典与现代:燃木壁炉的家居装饰灵感

燃木壁炉已经成为许多家庭的温馨选择,但在选择时需要考虑一些要点,以确保它适合你的家。让我们用通俗易懂的你们看看如何选择最适合你的燃木壁炉。 首先,考虑你喜欢的风格。燃木壁炉有各种设计,从古老传统到现代时尚都有。如果你…

Centos7安装PostgreSQL 14

环境: Centos7安装PostgreSQL_14版本数据库; 打开官方网站:PostgreSQL: Linux downloads (Red Hat family) 一、 版本选择 复制、粘贴并运行如下脚本: 二、安装步骤 这些命令是在 CentOS 7.x 系统上安装和配置 PostgreSQL 14 的步…

Install Nginx in Linux

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。 1.yum 安装 nginx [rootVM-8-7-centos nginx]# yum install -y nginx Loaded plugins: fastestmirror, lang…

经典猜数游戏(python类封装)

五次机会猜测100以内随机正整数,我用初通的python类封装了代码并清屏上一次猜测提示,难有所增加咯。 (笔记模板由python脚本于2023年11月09日 12:31:30创建,本篇笔记适合掌握python循环和条件分支语句用法,初通python类的coder翻阅…

为什么审计平台不适合进行数据库变更管理?

关于视源电子 广州视源电子科技股份有限公司 (CVTE) 成立于 2005 年 12 月,旗下拥有多家业务子公司。 截至 2022 年底,公司总人数超 6000 人,约 60% 为技术人员。公司的主营业务为液晶显示主控板卡和交互智能平板等显控产品的设计、研发与销…

Shopee收款账户怎么设置?shopee收款方式选哪种

Shopee作为一家领先的电子商务平台,为卖家提供了多种收款方式。无论是在线支付、虚拟账户余额还是线下支付,卖家可以根据自己的需求和交易情况来进行选择。然而,在选择收款方式时,安全性、便捷性和市场适应性是需要考虑虾皮Shopee…

ChatGLM3 langchain_demo 代码解析

ChatGLM3 langchain_demo 代码解析 0. 背景1. 项目代码结构2. 代码解析2-1. utils.py2-2. ChatGLM3.py2-3. Tool/Calculator.py2-4. Tool/Weather.py2-5. main.py 0. 背景 学习 ChatGLM3 的项目内容,过程中使用 AI 代码工具,对代码进行解释,…

SpringMvc 常见面试题

1、SpringMvc概述 1.1、什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦&am…

C++算法:矩阵中的最长递增路径

涉及知识点 拓扑排序 题目 给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允…

学习美团推荐系统质量模型建设

目录 一、背景引入 (一)基本背景说明 (二)从推荐系统“数据飞轮”看质量建设必要性 二、质量的定位和考量思考 (一)对推荐系统质量的思考迭代 (二)可用性计算的关注点 &#…

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合,包括任务与任务间的消息交换,队列是 FreeRTOS 主要的任务间通讯方式,可以在任务与任务间、中断和任务间传送信息,发送到 队列的消息是通过拷贝方式实现的,这意味着队列存储…

【原创】java+swing+mysql爱心捐赠管理系统设计与实现

摘要: 爱心捐赠管理系统旨在管理和优化捐赠过程,提高效率,增强透明度,并鼓励更多的个人和企业参与公益捐赠,用户可以捐款或者捐物。本系统采用javaswing界面可视化技术,数据库使用mysql。 功能分析&#…

Python高级语法----深入理解Python迭代器与生成器

文章目录 1. 迭代器协议代码示例:2. 生成器基础代码示例:3. 使用yield的高级技巧代码示例:4. 生成器表达式代码示例:迭代器和生成器是Python中实现迭代的两种主要方式,它们都允许用户创建可以遍历数据集的对象。在Python中,迭代器协议是指对象需要遵守__iter__()和__next…

【大数据】NiFi 中的处理器(一):GenerateTableFetch

NiFi 中的处理器(一):GenerateTableFetch 1.简介2.应用场景3.示例3.1 案例一:无输入流文件,来源表含增量字段3.2 案例二:无输入流文件,不含增量字段3.3 案例三:无输入流文件&#xf…

通用文件在线预览软件kkFileView

什么是 kkFileView ? kkFileView 为文件文档在线预览解决方案,基本支持主流办公文档的在线预览,如 doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip&…

如何配置《动手学强化学习》的环境

如何配置《动手学强化学习》的环境 网站:https://hrl.boyuai.com/chapter/intro github仓库:https://github.com/boyu-ai/Hands-on-RL/tree/main 可以看到该教程要求使用gym0.18.3版本的gym库,本教程可以用于解决绝大多数需要使用Pendulum-…
最新文章