Java之String Pool

离线安装 nvidia-docker2(nvidia-container-toolkit) 很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式。 阅读详情

大家好,朽木君又回来了!今天为大家介绍一下String Pool。

一、什么是String Pool?

JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,字符串池(String Pool)。

二、String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

我们来看看例子:

String str1 = "aaa";
String str2 = "aaa";
System.out.println(str1==str2); //true

插播==的小知识:
对基本类型:比较的是值是否相同;对引用类型:比较的是引用是否相同;(代码中str1和str2属于对象、引用)

大家看一下,这里str1与str2指向同一个对象,因为str1创建后"aaa"已经放入String Pool中,所以str2会直接引用"aaa";

String str1 = "aaa";
String str2 = new String("aaa");
System.out.println(str1==str2); //1、false
System.out.println(str1=="aaa"); //2、true
System.out.println(str2=="aaa"); //3、false

在这str2会被分到堆内存中,而不是从String Pool中进行引用,所以第一个为false。
把视线移到最后两行代码,程序会先在String Pool中寻找"aaa"是否存在,存在则直接用,不存在就新创建一个,此时String Pool中已经存在了"aaa",并且被str1引用,所以第二个true。
第三个str2创建的对象在堆内存,不是常量池中的"aaa",所以false。所以有的小伙伴遇到new String后进行==操作,发现返回false,感觉莫名其妙的话,不用看 就是这个原因了。

三、String Pool的范围 and 字符串连接问题

话不多说,给各位大人上例子:

package test;

public class Interview {
    public static void main(String[] args) {
        String hello="Hello",lo = "lo";
        String world = new String("aaa");
        
        System.out.println(hello=="Hello"); //1、true
        System.out.println(Other.hello==hello); //2、true
        System.out.println(other.Other.hello==hello); //3、true
        System.out.println(hello==("Hel"+"lo")); //4、true
        System.out.println(hello==("hel"+lo)); //5、false
    }
}

class Other{
    static String hello = "Hello";
}

package other;

public class Other {
    public static String hello = "Hello";
}

由例子可以看出 第1个——同一个包同一个类,第1个——同一个包不同类,第3个——不同的包,这三种情况字符串常量的引用指向同一个字符串对象;

由4、5两个例子,可以验证:
(1)常量表达式(不含引用)计算出的字符串是在编译时进行计算,然后被当作常量。
(2)含有引用的字符串拼接是在运行时新创建出来的

讲了这么多,其实告诉我们判断字符串相等还是用equals()最方便了。但如果小伙伴们向更进一步,当高级程序员(听说大厂可能问到这类问题),这部分知识必须要了解的。

那么,再温馨提示一下,如果进行了new String()或者 str1 + str2这种引用表达式,非要用==进行判断,那么动手试试intern()吧!

今天的分享到这结束了,如果有不足的地方大家可以提提改进意见,朽木君很乐意做出改变。可以的话再给个赞啊,给卑微辛劳的大学生一点鼓励o(╥﹏╥)o

SY6982C 7.4V锂电池1A充电模块原理图设计,已量产 在手持设备、便携工具与小型无人机等场景中,7.4V(2S)锂聚合物电池的应用愈发广泛。这类电池对充电系统的安全性、效率与兼容性提出了明确要求:需支持 USB 5V 输入、1A 安全充电,同时具备多重保护机制。本文将结合一款基于 SY6982C 的充电原理图,深入解析其电路设计与技术亮点。 阅读详情

相关推荐

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 376

StringPool详解

文章目录1. String的不可变性2. StringPool结构3. 字符串拼接操作4. 拼接操作与append操作效率对比5. intern详解5.1 intern基本知识5.2 new String创建了几个对象5.3 案例 1. String的不可变性 在JDK7之后,String的内容是存放在堆中的字符串常量池(StringPool,也可叫StringTable)中的,字符串常量池中相同的字符串只会创建一份,所以定义相同的字符串变量时,多个字符串变量都是指向了同一份地址中的字符串。 示例一 pub

u010502101的博客 3096

解决银河麒麟V10分辨率问题:xrandr命令详解与常见错误排查

本文详细解析了在银河麒麟V10系统中使用xrandr命令调整屏幕分辨率的方法,包括核心功能解析、常见问题排查及持久化配置技巧。通过实战指南帮助用户解决分辨率缺失、配置失效等典型问题,提升多显示器环境下的工作效率。

weixin_30642561的博客 505

Java字符串常量池

该篇文章转载至Java字符串池(String Pool)深度解析 在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(String Pool)。字符串池由String类私有的维护。我们知道,在Java中有两种创建字符串对象的方式:1)采用字面值的方式赋值 2)采用

我就是我的博客 677

激光SLAM算法性能对比:在Ubuntu20.04上实测Point-LIO/FAST_LIO2/Faster-LIO的运行效果

本文在Ubuntu 20.04平台上对Point-LIO、FAST-LIO2和Faster-LIO三款激光SLAM算法进行了深度实测与性能对比。通过量化分析绝对轨迹误差、CPU/内存占用及单帧处理延迟等核心指标,结合室内外场景数据,为高精度测绘、服务机器人及自动驾驶等不同应用场景提供了清晰的选型指南和实战调优建议。

weixin_28335283的博客 369

【软件介绍】RVC本地部署使用方法

【摘要】RVC是一款功能强大的开源语音转换工具,具有实时处理、多音效选择、高质量音频处理等特点。文章详细介绍了RVC的安装与使用方法:1)配置Python环境;2)根据电脑系统选择对应安装包解压;3)启动程序进入浏览器操作界面。重点讲解了声音克隆的关键步骤:建议使用短音频素材,选择合适训练方法(推荐pm或rmvpe),设置100次训练轮数,生成的模型文件存入weights文件夹。最后通过上传音频即可实现声音克隆。操作过程需注意保持程序运行状态,并提供了相关资源下载地址。

心动的那一刻,记忆便盛开了花 2982

【JavaSE】字符串常量池、String详解

1.String Pool 1.1字符串常量池产生时间 1.2字符串常量池的位置 1.3字符串常量池的优点 2.String 2.1不可变性 2.2定义方式 2.2.1 字面量的方式 2.2.2 new的方式 2.2.3 intern()的方式

远赴山河万里的博客 2664

软考高级信息系统项目管理师系列论文之:百篇软考高级信息系统项目管理师论文范文

软考高级信息系统项目管理师系列论文之:百篇软考高级信息系统项目管理师论文范文

zhengzaifeidelushang的博客 3581

JVM 学习笔记——字符串常量池(String Pool)

详解字符串常量池的原理、作用、并介绍相关面试题

猫头夜鹰的小屋 1169

Windows11上pip安装IsaacSim5.1.0与IsaacLab

本文详细介绍了CUDA Toolkit 12.8.0、IsaacSim和IsaacLab的安装过程。首先从NVIDIA官网下载并安装CUDA Toolkit 12.8.0,然后通过miniforge创建conda环境(env_isaacsim)安装IsaacSim相关Python包,解决了Windows长路径问题。成功运行IsaacSim后,克隆IsaacLab仓库并完成安装验证,最后通过创建空场景测试环境配置。整个安装过程包含详细的命令行操作和问题解决方法,为机器人仿真开发环境搭建提供了完整指导。

拥抱具身智能,昇腾Ascend C 378

事件驱动的 SAP 工作流:从 BOR 事件到 Event Linkage 的落地与排障全景图

摘要: SAP工作流中的Event是业务对象状态变化的系统广播机制,如发票录入、采购订单释放等事件。通过事件驱动,业务程序与流程引擎解耦,业务只需发布事件,流程引擎负责后续处理。文章详细解析了SAP工作流事件的完整链路,包括事件定义、触发机制、事件容器传递、SWE2配置的关键作用,以及事件不触发时的排查方法。重点介绍了事件在启动流程、终止任务、等待步骤和主动创建中的应用,并结合采购订单审批案例说明事件的实际使用场景和配置要点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 190

字符串池(String Pool)是一种存储字符串的特殊数据结构,它的主要目的是节省内存空间和提高性能

当程序创建一个字符串时,如果字符串池中已经存在相同内容的字符串,则直接返回该字符串的引用,而不会创建新的字符串对象。在运行时,如果程序中使用了相同内容的字符串字面量,会直接从字符串常量池中获取对应的引用,而不需要再次创建字符串对象。如果存在,则直接返回池中的引用;提高性能:由于字符串池中的字符串对象是共享的,可以通过比较字符串的引用来判断是否相等,而不需要逐个比较字符串的内容。总结一下,字符串池是一种用于存储字符串的特殊数据结构,它可以避免重复创建相同内容的字符串,节省内存空间,并提高字符串的比较效率。

[Blog][Domain] programb.blog.youkuaiyun.com 576

PyTorch深度学习实战(39)——少样本学习(Few-shot Learning)

小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分类和推理的问题。在小样本学习中,我们希望通过利用已有的少量样本和先验知识来进行泛化,以便在面对新的、未见过的类别时能够做出准确的预测。这就要求模型能够从有限的训练样本中提取出有用的信息,并能够将这些信息应用到新类别的样本中去。在本节中,将介绍孪生、原型和关系网络的原理,并使用 PyTorch 实现孪生网络。

盼小辉丶的博客 1万+

java7,8中的String pool

参考文献: http://blog.youkuaiyun.com/chen1280436393/article/details/51768609 http://java-performance.info/string-intern-in-java-6-7-8/ http://blog.youkuaiyun.com/heiyouhei123/article/details/51560166关于String poolwh

随心的专栏 2036

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java】Java创建String时,什么情况放进String Pool?

对Java创建String是否放入String pool作代码性的试验。 参考的优秀文章 JAVA面试题解惑系列(二)——到底创建了几个String对象? public String(String original) API public String intern() API 版本说明 JDK 1.7.0_71 new String() 与 intern...

dongjizheng9270的博客 111

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java string 创建_【Java】Java创建String时,什么情况放进String Pool?

对Java创建String是否放入String pool作代码性的试验。参考的优秀文章版本说明JDK 1.7.0_71new String() 与 intern()package com.nicchagil.commonstudy.No01String的池;public class Call {public static void main(String[] args) {String a = "...

weixin_36259655的博客 88

Java string和 String,理解Java String和String Pool

本文转载自:http://blog.sina.com.cn/s/blog_5203f6ce0100tiux.html要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。java为什么要把Stri...

weixin_34475212的博客 331

Java 中的 String Pool 简介

在 Java 中String对象是我们最常用的对象。在本文章中,我们主要对 String 对象使用的 String Pool 进行一些简单的介绍。Java 定义 String 后,String 是存储在 String Pool 中的,以便于加快字符串的访问和处理。正是有这个方面的访问需求,JVM 为 String 对象在内存中特地开辟了一个存储区域来加快对 String 对象的访问,这个特定的内存区域就是我们说的了。

Maisu的博客 211

java里的String Pool

其实只要理解以下知识:     String 是存放在java栈中,当创建一个String对象时(其他存放在栈中的基本类型变量类似),会去栈中查找是否有相同值的String,如果有则将变量地址赋给变量引用,没有则创建一个变量,同时将地址赋给引用。以上不适用于new 申明的变量; 因为new 关键字创建的变量都是存储与堆中的。 以下是转载文章:

baoendemao的专栏 436

Java String Pool深度解析:内存模型、intern陷阱与JVM调优

String Pool是Java中实现字符串复用的核心机制,其本质是元空间内由哈希表(StringTable)维护的引用集合,而非独立内存池。它通过存储堆中String对象的oop指针,实现字面量和intern()调用的快速查重,但过度使用会绑架GC——导致元空间膨胀、STW扩容停顿及老年代对象无法回收。技术价值在于减少重复字符串内存开销,但代价是将内存生命周期控制权让渡给JVM内部结构。典型应用场景包括HTTP状态码缓存、固定枚举去重等低变异性短字符串管理;而用户输入、动态拼接、UUID等高熵字符串一旦i

weixin_30952535的博客 411

java constantpool_Constant Pool和String Constant Pool详解

Constant Pool常量池的概念:在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容.String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Poo...

weixin_36129381的博客 462

java string pool 栈_Java的String常量池在哪里存在,堆还是堆栈?

String pooling字符串池(有时也称为字符串规范化)是使用单个共享String对象替换具有相同值但不同标识的多个String对象的过程 . 您可以通过保留自己的Map(根据您的要求可能有软或弱引用)并使用map值作为规范化值来实现此目标 . 或者您可以使用JDK提供给您的String.intern()方法 . 在Java 6时,使用String.intern()被许多标准禁止,因为如果池...

weixin_42168230的博客 346

常量缓存与integer比较_Java 字符串常量池介绍,String Pool 的实现

本文将介绍 HotSpot 中的 String Pool,字符串常量池。相对是一篇比较简单的文章,大家花几分钟就看完了。在 Java 世界中,构造一个 Java 对象是一个相对比较重的活,而且还需要垃圾回收,而缓存池就是为了缓解这个问题的。我们来看下基础类型的包装类的缓存,Integer 默认缓存 -128 ~ 127 区间的值,Long 和 Short 也是缓存了这个区间的值,Byte 只能表示...

weixin_34596480的博客 149

JAVA String Pool

<br />    要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。java为什么要把String设计为非可变类呢?你可以问问 james Gosling :)。但是非可变类确实有着自身的优势,如状态单一,对象简单,便于维护。其次,该类对象对象本质上是线程安全的,不要求同步。此外用户可以共享非可变对象,

IPJMC的专栏 806

Java基础——String和String Pool

String基础以及String Pool的理解

cgmf3434的博客 274

java String深入constant pool

<br />声明 来源于:http://hi.baidu.com/boywell/blog/item/a069bccbc45e7c4cf31fe758.html<br /> <br />Constant Pool常量池的概念:<br />在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太<br /> 明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容.<br />

jingtao.gao的专栏 3291

java string pool 栈_Java字符串常量池String Pool的理解

Java中String是一个非常特殊的数据类型,在学习JVM虚拟机的时候,才真正意识到为了让String类型在运行过程中速度更快、更节省内存,才提供了字符串常量池的概念。概念字符串常量池(String Pool)保存所欲字符串字面量(literal strings),这些字面量在编译时期就确定,不仅如此,还可以使用String的intern()方法在运行时添加到常量池中。常量池的使用主要有两种方法...

weixin_35544017的博客 171
上一篇: Java的String (一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值