JAVA软开-面试经典题(7)-字符串常量池

字符串常量池

1.定义:字符串常量池(String Constant Pool),用于存放字符串常量的运行时内存结构,其底层的实现为Hashtable。
【注意】

  • 在JDK1.6之前,字符串常量池中只会存放具体的String实例,在使用String.intern方法时,若字符串常量池中有满足String.equals方法的String对象,则返回其引用;字符串常量池中没有相同的String对象,则当前String对象为堆上对象,故在字符串常量池中创建一个相同的String对象,并返回其引用。

  • 在JDK1.7之后,字符串常量池不仅可以存放String实例,同时还能存放String实例的引用。在使用String.intern方法时,若字符串常量池中有满足String.equals方法的String对象,则返回其引用,这一点和JDK1.6相同;若字符串常量池中没有相同的String对象,则当前String对象为堆上对象,故在字符串常量池中存放一个指向堆上此String对象的引用,并返回此引用。

代码例子1:

public class Test {
    public static void main(String[] args) {
        String s1 = new String("He") + new String("llo");// 堆上创建"Hello","He","llo"实例,String Pool中创建"He"和"llo"实例
        s1.intern();// 将堆上"Hello"的引用存入String Pool
        String s2 = "Hello";// 获取String Pool中的"Hello"的引用
        System.out.println(s1 == s2);// true
    }
}

代码例子2:

public class Test {
    public static String s = "Hello";
    
    public static void main(String[] args) {
        String s1 = new String("He") + new String("llo");
        // 堆上创建"Hello","He","llo"实例,String Pool中创建"He"和"llo"实例
        s1.intern();
        // String Pool中已有"Hello",故没有将s1的引用添加到String Pool中,返回的是String Pool中已有的"Hello"的引用
        String s2 = "Hello";
        // 获取String Pool中的"Hello"的引用
        System.out.println(s1 == s2);// false
        System.out.println(s == s2);// true
    }
}

字符串常量池在JVM的分布

参考《深入理解Java虚拟机》

在这里插入图片描述

intern方法

参考地址见文末

在这里插入图片描述

例子

//字符串常量池:"计算机"和"技术"     
//堆内存:str1引用的对象"计算机技术"  
//堆内存中还有个StringBuilder的对象,但是会被gc回收
//StringBuilder的toString方法会new String(),这个String才是真正返回的对象引用
String str2 = new StringBuilder("计算机").append("技术").toString();   //字面量没有出现"计算机技术"字面量,所以不会在常量池里生成"计算机技术"对象
//"计算机技术" 在池中没有,但是在堆中存在,则intern时,会直接返回该堆中的引用
System.out.println(str2 == str2.intern());  //true


//字符串常量池:"ja"和"va"    
//堆内存:str1引用的对象"java"  
//堆内存中还有个StringBuilder的对象,但是会被gc回收
//StringBuilder的toString方法会new String(),这个String才是真正返回的对象引用
String str1 = new StringBuilder("ja").append("va").toString();    //没有出现"java"字面量,所以不会在常量池里生成"java"对象
//java是关键字,在JVM初始化的相关类里肯定早就放进字符串常量池了
System.out.println(str1 == str1.intern());  //false



//"test"作为字面量,放入了池中
//而new时s1指向的是heap中新生成的string对象
//s1.intern()指向的是"test"字面量之前在池中生成的字符串对象
String s1=new String("test");  
System.out.println(s1==s1.intern());   //false


String s2=new StringBuilder("abc").toString();
System.out.println(s2==s2.intern());  //false
//同上

参考链接:
https://blog.51cto.com/u_15281317/3008750
https://code84.com/21914.html

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

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

相关文章

学生护眼大路灯哪种好啊?五款真正护眼的护眼大路灯分享

在贴吧、论坛、知乎等社区网站上,大家可能经常看到家长吐槽、讨论学生护眼大路灯哪种好啊这类话题。说是由于孩子们用了不适合的护眼大路灯后,出现了光线刺眼、疲劳感加重等诸多伤眼问题。作为测评师,我对这个问题非常关注,也特意…

prompt learning

prompt learning 对于CLIP(如上图所示)而言,对其prompt构造的更改就是在zero shot应用到下游任务的时候对其输入的label text进行一定的更改,比如将“A photo of a{obj}”改为“[V1][V2]…[Vn][Class]”这样可学习的V1-Vn的token…

UE5 C++: 插件编写06 | 移动文件时自动Fix up redirectors

目录 前言: 本文内容: WHY WHAT HOW 详细步骤 代码解析 1. Build.cs file中 2. QuickAssetAction.cpp中 IMPORTANT NOTES 中文解释: 使用 AssetToolsModule 来修复重定向器 使用 AssetRegistryModule 来过滤所有重定向器 使用 FMo…

功能强大且简单易用的实时算法视频监控,智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…

Ngin入门套餐

快速了解Nginx 一、代理1.1 正向代理1.2 反向代理1.3 正向代理和反向代理的区别 二、Nginx负载均衡策略2.1 轮询(Round Robin)2.2 加权轮询(Weighted Round Robin)2.3 IP 哈希(IP Hash)2.4 最少连接&#x…

Unite Shanghai 2024 团结引擎专场 | 团结引擎 OpenHarmony 工程剖析

在 2024 年 7 月 24 日的 Unite Shanghai 2024 团结引擎专场演讲中,Unity中国 OpenHarmony 技术负责人刘伟贤对团结引擎导出的 OpenHarmony 工程进行了细节剖析,详细讲解 XComponent 如何与引擎结合,UI 线程和引擎线程的关联以及 ts/ets 的代…

PostgreSQL学习笔记六:模式SCHEMA

模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…

Linux命令——ls

命令格式:命令本身选项命令的指向目标 1.ls命令作用为列出目录下的内容 #lls后的选项有[-a,-l,-h]##注意ls与选项间应用空格隔开. 如下图为(ls命令体-l选项/根文件)的命令行 # ls -a 为:列出所有文件(包括隐藏文件&…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

接口性能测试,这个还真有用啊。

一、概述 性能测试按照不同视角,可以分为以下几类: a. 用户视角的性能 用户角度感受到的网站响应速度的快和慢。从用户在浏览器输入网址/打开应用,到整个页面呈现给用户的耗时。包含了用户端发送请求,服务端收到并执行请求&…

【2024版】Pycharm安装教程+汉化教程(零基础小白都能学会)

PyCharm安装教程 点击右边链接→PyCharm安装包 以专业版为例,继续进行安装(安装内容没啥太大区别,所以两版本都适用) 2.打开解压后的文件夹,右击pycharm 2024.1.4 3.点击下一步。 4.更改安装位置,点击下一步…

海外云手机:出海电商养号智能化方案

随着出海电商的迅猛发展,使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面,海外云手机不仅提高了流量的精准度,还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…

机载交互详解!

一、机载交互网络 机载交互网络是指飞机内部用于传输飞行员指令、飞行数据以及系统状态信息的通信网络。它通常由多个节点(如传感器、控制器、显示器等)和连接这些节点的通信链路组成。 节点: 传感器节点:负责采集飞机的各种飞…

基于YOLOv11的车辆行人实时检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

上百种【基于YOLOv8/v10/v11的目标检测系统】目录(pythonpyside6界面系统源码可训练的数据集也完成的训练模型)-CSDN博客 ............................................................................................ 摘要: 本文提出了…

人工智能AI与机器学习ML基础入门

小学生都能看懂的人工智能入门书籍 第一章 入门简介 TensorFlow 入门 如果你想入门人工智能(AI)?机器学习(ML)和深度学习是很好的起点。不过,一开始接触这些概念时,可能会被各种选项和新术语搞…

WebGl 使用uniform变量动态修改点的颜色

在WebGL中,uniform变量用于在顶点着色器和片元着色器之间传递全局状态信息,这些信息在渲染过程中不会随着顶点的变化而变化。uniform变量可以用来设置变换矩阵、光照参数、材料属性等。由于它们在整个渲染过程中共享,因此可以被所有使用该着色…

前端开发攻略---使用AJAX监控网络请求进度

1、XHR实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title></head&…

用AI生成rtl设计(a simple synchronous FIFO)的一个实验

目录 1. 前言 2. RTL and testbench generation 2.1 RTL generation Explanation: Assumptions: 2.2 Testbench generation Explanation: 2.3 Add fsdb dump to testbench 3. 仿真与调试 3.1 RTL中的语法问题 3.2 testbench的问题 3.3 RTL中empty/full状态…

VS Code创建VUE项目(一)工具安装与项目创建

一.安装与配置npm 1.下载安装Node.js 安装Node.js 下载地址&#xff1a; Node.js — 在任何地方运行 JavaScript (nodejs.org)或下载 | Node.js 中文网 下载后一步步安装就好&#xff08;安装过程基本一路直接“NEXT”就可以了&#xff0c;直到Finished&#xff09;&#x…

第十五届蓝桥杯C/C++学B组(解)

1.握手问题 解题思路一 数学方法 50个人互相握手 &#xff08;491&#xff09;*49/2 &#xff0c;减去7个人没有互相握手&#xff08;61&#xff09;*6/2 答案&#xff1a;1024 解题思路二 思路&#xff1a; 模拟 将50个人从1到50标号&#xff0c;对于每两个人之间只握一…