Java 常量池技术和==比较

深度解析Java常量池 Java常量池体系Class文件常量池运行时常量池字符串常量池方法区存储堆内存存储。 阅读详情

  Java 形成的class文件中,包含有所谓的“常量池”,其类似于C/C++形成的可执行文件(或者目标文件)中的符号表和数据段。

  但是有所区别的是,C/C++的符号表,是符号(比如函数)和地址的对应关系,在最终链接形成的可执行文件中,所有对符号的引用的地址(比如函数调用指令里跳转的目标地址)都被正确的解析(更复杂的地址无关代码技术中的动态地址重定位等不进行讨论),从而在跳转指令后,跟随的是地址的实际值,即是在链接的时候,进行地址决议使用的;而Java是一种动态执行语言,其在“常量池”中仅仅保存的是调用的符号的名称(文本形式),而在进行执行过程中,由JVM对该引用进行方法查找(即不是链接时确定的地址)和转向调用。另外在对常量数据段的使用机制也不相同,这里我们的讨论主要与“常量池”中的数据段有关系。

  Java的“常量池”的数据段,是为了快速而方便的创建某些对象而出现的。需要一个对象,则从中取出,没有的话则创建。这就无需重复创建了。

  常量池中的对象和栈中的基本类型、堆中的对象在使用中的区别可以由“==”操作的结果可见一斑。

  例1:

     String类型

      1)String a=“hello” ;  String b ="hello";则a==b;

      2)String a = new String("hello");  String b = new String("hello");则a!=b。

   这是因为1)中a指向的是常量池中的“hello”即所谓字面值字符串,而实例化b的时候,由于常量池中存在“hello”所以将b也指向了对象“hello”。

   而2)中是在堆空间中分别分配的内存对象“hello”并把指针给a或者b,自然a和b不一样。


例2:

     部分基本类型的包装类

     Byte,Short,Integer,Long,Character,Boolean。 其中Byte,Short,Integer,Long,Character只是在值小于等于127的时候才使用常量池。


    因此:

   1) Integer i1=127; Integer i2=127;则i1==i2

   2)Integer i1=128;Integer i2=128;则i1!=i2


例3:

对象类型的==比较都是在比较该对象实例的地址,而不是值。基本数据类型的==比较,则是值。

int i = 1;int j =1; i和j都是在栈中分配,其地址并不一样,但是其值相同,所以i==j。


但是如果:

  public static final int  i = 1;

  public static final int  j= 1;

则是在常量池中分配的1这个常量,而i和j这些引用都指向它。因此i==j。



综上所述,分配在栈中的基本数据类型在==比较时是比较的值;分配在常量池中的基本数据类型和对象类型在==比较的时候是比较的地址;分配在堆中的对象==比较的时候,是比较的地址。分配在常量池中的都是常量。



因此,一般不要使用对象实例的==操作符来进行值比较,而应该使用equals。



Java中几种常量池比较 目录 class常量池 什么是字面量和符号引用 字符串常量池 字符串常量池的设计思想 字符串常量池的位置 字符串常量池内部结构 字符串常量池里放的是什么? 运行时常量池 总结 Java中主要有三种常量池,分别是class常量池、字符串常量池和运行时常量池。我们对这三个常量池进行对比。 class常量池 我们写的每一个Java类被编译之后都会生成一个对应的Class文件。Cl... 阅读详情

相关推荐

十分钟读懂java常量池优化技术

面试中经常问道的常量池优化技术,Java中的常量值技术是为了方便快捷的创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果没有则创建一个,创建一个比引用一个要耗时),则在需要重复创建相等变量时节省了好多时间,常量池也就是一个内存空间,常量池存在于方法区中;

java字符串常量 ==_java字符串常量池——字符串==比较的一个误区

起因再一次js的json对象的比较中,发现相同内容的json对象使用==比较并不相等。例如:var obj = {};var obj2 = {};console.log(obj == obj2); // 结果为falsejson在js中代表一个对象==比较的是对象栈中存放引用堆的地址。上面的obj和obj2创建的是两个对象地址肯定不同结果为false。但最令我不解的是为什么js的字符串比较可以用=...

weixin_42497299的博客 223

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

java常量池详解

s0还是常量池 中"zhangsan”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”zhangsan”的引用,s2因为有后半部分 new String(”san”)所以也无法在编译期确定,所以也是一个新创建对象”zhangsan”的引用;所以此时的"a" + bb和"a" + "b"效果是一样的。分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。

weixin_43134177的博客 2620

从RJPG到温度地图:基于大疆TSDK的热红外数据精准处理与Pix4D拼接实战

本文详细解析了如何利用大疆TSDK将无人机拍摄的热红外RJPG图像精准转换为带有地理坐标的温度TIFF文件,并完成Pix4D拼接生成正射温度地图的全流程。文章重点阐述了辐射定标的原理、TSDK关键参数(测量距离、湿度、发射率、反射温度)的设置与微调方法,以及Pix4D处理中的常见报错解决方案,旨在帮助用户实现从原始数据到可分析温度地图的精准处理。

docker7nomad的博客 464

最优化问题——一维搜索(一)

最优化问题——一维搜索 1. 一维搜索的引入 1.1 从非线性规划问题到一维搜索 在前面的文章中,我们提到了基于迭代的非线性规划问题的求解思路。在求解过程中,我们提到了在每一步的迭代中都需要对计算步长因子,其计算公式为: λk=minλf(xk+λp)λ_k=min_{λ}f(x_k+λp)λk​=minλ​f(xk​+λp) 我们将f(xk+λp)f(x_k+λp)f(xk​+λp)视为λ的一元函数,我们的目标就是求这个一元函数的极小值。对于这个问题,我通常的求解方式为一维搜索。 1.2 一维搜索的基本形

hei653779919的博客 7358

java中常量池

java 中常量池,字符串常量池,intern() 方法详解,基本对象常量池

a141210104的专栏 1188

Unity Addressable资源缓存路径自定义指南:告别C盘爆满烦恼

本文详细介绍了如何自定义Unity Addressable系统的资源缓存路径,解决其默认存储在C盘导致的磁盘空间不足问题。通过配置CacheInitializationSettings并编写编辑器脚本,开发者可以将缓存迁移至项目目录,实现资源的集中管理,提升团队协作效率与开发环境一致性。

pytorch8learner的博客 474

java 常量池详解

java、jvm、常量池、虚拟机

李帅的博客 1874

新能源知识库(62)组串式、集中式和高压直挂式

因需多台PCS及独立监控设备,单位功率成本比集中式高15%–20%。高压直挂式因省去变压器,大容量项目成本更低(>5MW时优势显著)。组串式储能、集中式储能和高压直挂式储能是当前主流的三类技术路线,其核心差异源于系统架构和控制逻辑的设计差异。组串式交流侧需变压器升压至10kV/35kV,高压直挂式可直接输出6kV/35kV电压,减少转换损耗。多台小功率PCS并联(每簇独立管理)单台大功率PCS(多簇直流侧并联)环流导致容量衰减(损失5%–8%)无变压器损耗(效率>99%)高压直挂电站(≥10MW)

竹君子之家 1514

Windows 10/11下R与RStudio最新版安装避坑指南(含镜像加速配置)

本文提供了Windows 10/11系统下R与RStudio最新版的详细安装指南,包含镜像加速配置和常见问题解决方案。通过分步教程帮助用户避开安装陷阱,优化开发环境设置,特别适合国内用户快速搭建高效的数据分析平台。

weixin_29065959的博客 1003

Java 常量池 6 + 1 :「Byte | Short | Character | Integer | Long | Boolean」 + 「String」

1. 6个包装类 1.1 Integer 1.1.1 Integer指向常量池的时机 1.1.2 Integer 与 int 使用 == 比较 1.2 Byte | Short | Character | Long | Boolean 2. String

渐渐的忘记,赶不上明天(读研ing,2024年毕业) 180

从 VS Code 登录 ABAP Destination,一次把前后端连接跑通

最近很多 ABAP 开发者开始把 VS Code 纳入日常开发环境,原因很直接,VS Code 的轻量体验、命令面板、文件树、插件生态和 AI 编程能力,已经深深影响了现代开发者的工作方式。SAP 官方发布的 ABAP Development Tools for VS Code,也把 ABAP Cloud 开发模型带进了这个编辑器里。

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

java 基本类型 常量池_Java基本类型包装类和常量池

Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean 直接返回True Or False。如果超出对应范围仍然会去创建新的对象。Integer举例说明publi...

weixin_39620001的博客 101

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 607

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Java】Java中的==

Java中的== Java中的==表示的是什么呢?有时候很令人费解。比如,以下例子输出是什么? // 例一 String str = "wo"; String str1 = "wo"; System.out.println("例一:" + (str == str1)); // 例二 String str2 = new String("wo"); String str3...

It一zhai男 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java 中 == 比较的是什么?

1、对于对象引用类型:“==”比较的是对象的内存地址。 例子: public class ArrayTest { public static void main(String[] args) { String a = new String("aw"); String b = new String("aw"); System.out.p...

AlbenXie的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java字符串比较==和equals()的区别

当我们想要比较两个字符串是否相同时,要特别注意,我们实际上是想比较字符串的内容是否相同。必须使用equals()方法而不能用==。 public class Main { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); System.out.println(s1

zhang5207892的博客 5333

Java中比较两个字符串==和.equals()区别

在 Java 中,== 和 .equals() 都是用于比较两个字符串是否相等的运算符,== 比较的是两个字符串的引用地址,而 .equals() 比较的是两个字符串的内容。只有当两个字符串变量指向同一个字符串对象时,== 和 .equals() 才会返回相同的结果。

weixin_42098295的博客 1279

Integer的比较==和String的比较==总结

坑: Integer的值为-128-127之间的时候就会自动的从Integer的缓存(IntegerCache)中去取,如果超过这个范围就会新建一个Integer的对象。   所以a==b(a=10,b=10)为true,c==d(c=150,d=150)为false。 nteger的值为-128-127的时候用==会返回true 不再这个区间要用equals才会返回true ...

王侯将象的博客 2597

为什么String比较是否相等的时候用equals而不用==

为什么String比较是否相等的时候用equals而不用==为什么String比较是否相等的时候用equals而不用== 为什么String比较是否相等的时候用equals而不用== 初学Java的时候,经常会搞混String的比较,为什么两个String在做比较的时候,老师说让我们不要用==,要用equals进行比较,我试了一下发现了一个很有意思的情况。 代码片. /** * 测试String...

qq_37465844的博客 2166

Java中的==和equals,常量池

对于Java基本类型(byte,char,short,int,long,double,float,boolean),利用==判断相等。 对于基本类型的包装类(Integer,Boolean等),integer1.equals(int1)==true,integer1.equals(integer2)==false 对于普通对象,==运算符判断是否指向同一引用对象,equals通过对象所属类的e...

whan8080的专栏 223

Java比较String ==和equals() 解析

先看一个例子 equals() 比较Stringpublic class TestString { public static void main(String[] args) { String strOne = "testString"; String strTwo = "testString"; System.out.println(strO

手把手教你学安卓 2757

String类的equals方法和==方法的比较

String类的equals方法和==方法的比较 先看下面的例子:01: public class StringExample02: {03: public static void main (String args[])04:   {05: String s0 = "Programming";06: String s1 = new String ("Programming");07: Str

清水雨潭 3753

==和equal的区别

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。 equal 1.在重写equal方法的时候,一定要重写hashcode方法,因为两个对象相同的话,它们的hashcode值一定相同,反之,不一定相同, 2.equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,...

qq_37745636的博客 2360

Java中堆、栈、常量池以及==和equals的区别

堆、栈、常量池 Java中把内存分为两种:堆内存和栈内存。 栈内存中存放基本类型的变量和对象的引用变量。 堆内存中存放new创建的数组和对象。 常量池中存放常量(字符串常量等)。 栈的优势是存取速度快,但存在栈里的数据的生存周期是确定的, 局部变量存放在栈里,当超出作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。当正因为在运行时动态分配内存,存取速度较慢。

D_Bamboo_的博客 248
上一篇: LeakDiag的使用和形成的LOG文件的分析方法
下一篇: Java 空指针异常(java.lang.NullPointerException)
IterZebra
博客等级 码龄16年 56粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值