首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中常量池【Class常量池、运行时常量池、字符串常量池】

我们写每一个Java类被编译后,就会形成一份Class文件;Class文件除了有类版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成各种字面量与符号引用...字面量包括: 文本字符串 声明为final常量 八种基本类型 … 符号引用包括: 类和方法全限定名 字段名称和描述符 方法名称和描述符 .class文件都包含哪些内容?...运行时常量池除了保存Class文件中描述符号引用外,还会把由符号引用翻译出来直接引用也存储在运行时常量池中。...而当类加载到内存中后,JVM就会将Class常量池中内容放到运行时常量池中,因此,每个类都有一个运行时常量池。...⚠️字符串常量池中字符串只存在一份,且被所有线程共享 ⚠️全局字符串池里内容是在类加载完成,经过验证、准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例引用存到中;中存是引用而不是具体实例对象

1.4K20

java 常量池和运行时常量池_常量池在jvm哪个部分

常量池分类 常量池大体可以分为:静态常量池,运行时常量池。 静态常量池 存在于class文件中,比如经常使用javap -verbose中,常量池总是在最前面把?...运行时常量池呢,就是在class文件被加载进了内存之后,常量池保存在了方法区中,通常说常量是运行时常量池。...所以呢,讨论都是运行时常量池 字符串常量池 最最最流行、最典型就是字符串了 典型范例: String a = "abc"; String b = new String("abc"); System.out.println...a和b是未知,static代码块,在初始化时候被执行,初始化属于类加载一部分,属于运行期。...,通过实际例子和绘图来熟悉了下字符串常量池和包装类常量使用。

35430
您找到你想要的搜索结果了吗?
是的
没有找到

MYSQL 生产环境字段更改failed问题

早上看到微信一个银行同学问了小问题,希望他不要背锅,具体问题是MYSQL 一个50G表要更改字段,将一个字段从varchar(3) 改成varchar(6). MYSQL 5.7 官版。...对于大小为0到255个字节VARCHAR列,需要一个长度字节来编码该。对于大小为256字节或更大VARCHAR列,需要两个长度字节。...在这种情况下,所需长度字节数从1更改为2,这仅由表副本支持(ALGORITHM = COPY)。...服务器通过获取事务中使用元数据锁,并将这些锁释放推迟到事务结束时,来实现这一点。表上元数据锁可以防止对表结构更改。这种锁定方法意味着一个会话内事务正在使用表,不能在DDL状态下使用。...注:到目前为止MYSQL 在修改字段方面,对比其他数据库还是要注意地方多多,当然MYSQL 8 已经添加了 instant 让修改字段变得更让人放心。

1.8K30

三、运行时动态常量(学习笔记)

s3); System.out.println(s1==s3.intern()); System.out.println(s3==s4); } } 代码执行结果...:   true   false   true   false 出现上面的 结果解释如下图 ?      ...任何一个字符串创建都会扔到常量池中,常量池是方法区一块存储空间      通过new 创建对象会放到堆上      == 比较对对象内存地址      String 在常量池中存储数据结构类似一个...HashSet ,里面存储是无序 不重复字符串,所以两个“abc” 放入到里面存储是一个      s3 和 s4 是通过new创建对象,所以放入到堆中,所以两个对象内存地址不一样。      ...而 通过 s3.intern() 这个方法,可以将s3从堆内存中放入到常量池中,所以进行比较时候两个对象地址是一样

24840

Class常量池、运行时常量池、字符串常量一些思考

Class常量池、运行时常量池、字符串常量池 class常量池 java代码经过编译之后都成了xxx.class文件,这是java引以为傲可移植性基石。...、偏移量等 运行时常量池 在《Java虚拟机规范8》中是这样描述,运行时常量池(Runtime constant pool)是class文件中每一个类或者接口常量池表(constant pool)...行时表示形式,它包含了若干常量,从编译期可知数值字面量到必须在运行期解析之后才能获得方法、字段引用。...也就是说class常量池=运行时常量池,只不过是不同表现形式而已,一个是静态,一个是动态,其中静态符号引用也都在运行时被解析成了动态直接引用。...那么运行时常量池是和类绑定,每个类、接口有自己行时常量池,每一个运行时常量内存是在方法区进行分配,这只是概念上方法区,每个虚拟机有自己实现,同一个虚拟机不同版本也有不同实现,以常用

28020

java 常量池和运行时常量池_常量池中字符串是对象吗

class文件;class文件中除了包含类版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成各种字面量(Literal)和符号引用...2.2:什么是字面量和符号引用: 字面量包括:1.文本字符串 2.八种基本类型 3.被声明为final常量等; 符号引用包括:1.类和方法全限定名 2.字段名称和描述符 3.方法名称和描述符...3.运行时常量池(Runtime Constant Pool): 运行时常量池存在于内存中,也就是class常量池被加载到内存之后版本,不同之处是:它字面量可以动态添加(String#intern...而当类加载到内存中后,jvm就会将class常量池中内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。...在解析阶段,会把符号引用替换为直接引用,解析过程会去查询字符串常量池,也就是我们上面所说StringTable,以保证运行时常量池所引用字符串与字符串常量池中是一致

44730

常量引用左问题

今日,我在写数据结构作业时,编写程序中出现了这样一段报错,有点懵我遍历四方博客终于发现了问题所在 让我们聚焦到出错代码段 inline bool Initial(List &q) { q->...scanf("%lld",&q->data[i]); //coutdata[i]<<endl; } return ok; } 很明显这是一个典型顺序表初始化...invalid initialization of non-const reference of type 'Sqlist*&' from an rvalue of type 'Sqlist*' 这就是我们所说...非常量引用必须是左 问题 什么意思呢,具体而言就是我初始化三个顺序表,分别把它们常地址传入,可是在定义函数处未加const关键字导致编译错误 再举个例子 void fun(string& i)...return 0; } 这种情况和我之前出现错误大同小异,常字符串引入与函数参数定义不匹配导致编译错误 C++中, 编译器规定:常量(右量)不能作为非const引用,解决方案一律是加上const

1K30

字符串常量池 运行时常量池_常量池中字符串是对象吗

(很多包装类都有缓冲空间,Integer 默认缓存 -128 ~ 127 区间,Long 和 Short 也是缓存了这个区间,Byte 只能表示 -127 ~ 128 范围,全部缓存了,Character...这些类型为了使它们在运行过程中速度更快、更节省内存,都提供了一种常量概念。 常量池就类似一个Java系统级别提供缓存。...:使用是上一行代码代码执行时,在常量池中生成"11"地址 System.out.println(s3 == s4);// jdk6:false jdk7/8:true }...因为对字符串常量池进行了优化,所以 s3也是在堆中String类型对象引用。...= 45 个字符 鉴于我们只对字符数组进行重复数据删除,我们仍将承担String对象(对象头、字段和填充)开销。

25220

Java中怎样由枚举常量ordinal获得枚举常量对象

当然,假设valueOf(String)方法參数不是该枚举类型合法字符串,则会抛出IllegalArgumentException异常。...对于枚举类型,Java内部实际上还是转换为java.lang.Enum子类,能够通过“javap -c Season”命令反编译来观察这一点。...Enum类提供了一个ordinal()方法,用来返回枚举对象序数,比方本例中SPRING, SUMMER, AUTUMN, WINTER序数就分别为0, 1, 2, 3。...对于这个问题,实际上能够利用枚举类型values()方法间接做到。values()方法返回一个枚举对象数组,比方本例就是Season[],数组元素依照序数排列。...在自己定义枚举类型中,我们仅仅要定义自己valueOf(int)方法,并返回该数组下标对象对象就能够了。

1.7K10

JDK1.8关于运行时常量池, 字符串常量要点

首先自行区分运行时常量池与Class文件常量池(静态常量池)概念, JVM内存模型 ,方法区与永久代区别, 有些在我其他博客有介绍, 连接在文尾 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区..., 此时hotspot虚拟机对方法区实现为永久代 在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下东西还在方法区, 也就是...hotspot中永久代 在JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区实现从永久代变成了元空间...“abcdef”字符串常量 而不把 “abc” “def”放进常量池) 对于先声明字符串字面量常量,会放入字符串常量池,但是若使用字面量引用进行运算就不会把运算后结果放入字符串常量池中了 (...,只放结果;已经声明,只放声明 常量池中同时存在字符串常量和字符串引用。

70420

GORM 读取别名字段(非表结构字段方法

问题是查询结果中包含了表中不存在一个别名字段,如何将这个非表结构字段查询结果通过 GORM 读取到表对应模型结构体中?...方案一 意思是说,如果没有使用 GORM 自动迁移,可以把结构体中 MoreInfo 字段 gorm 标签改成 ->,告诉 GORM 这是一个只读字段,就能够把查询结果中字段读取到模型结构体中。...然后原结构体只保留表结构中存在字段,将原结构体嵌入到扩展结构体,再将表结构中不存在别名字段添加到扩展信息结构体中,gorm 标签还是设置成只读权限。...这样在使用 GORM 时,将 Model 设置成原结构体 &Test{},查询结果接收器设置为扩展信息结构体 &TestExt{},就可以完美解决啦,即不影响原结构体自动迁移,也可以正常读取到别名字段...---- 内容声明 标题: GORM 读取别名字段(非表结构字段方法 链接: https://zixizixi.cn/golang-gorm-reads-value-of-the-alias-field

3.6K10

Serializable接口中serialVersionUID字段作用

实现Serializable接口类建议设serialVersionUID字段,如果不设置,那么每次运行时,编译器会根据类内部实现,包括类名、接口名、方法和属性等来自动生成serialVersionUID...如果类源代码有修改,那么重新编译后serialVersionUID取值可能会发生改变。因此实现Serializable接口类一定要显示定义serialVersionUID属性。...修改类时候需要根据兼容性决定是否修改serialVersionUID属性。...- 如果是兼容升级,请不要修改serialVersionUID属性,避免反序列化失败(在反序列化未升级对象时候) - 如果是不兼容升级,需要修改serialVersionUID属性,避免反序列化混乱...(不修改的话, 有可能将未升级对象反序列化出来) 使用Java原生序列化需要注意,Java反序列化时,不会调用类无参构造方法,而是调用native方法将成员变量赋值为对应类型初始

97820

VFP在运行时扩展报表系统,这是报表转换任意格式秘决

在这一章中,你将学到有 VFP 9 report listener 概念、它是如何在一个报表正在运时候接收事件、以及除了经典打印和预览之外你可以如何通过建立自己 listener 来提供不同类型输出...在一个报表运行过程中,VFP 会触发在一个 report listener 上那些事件,好像这些事件发生了一样。例如,当一个报表在运行前被 Load 时候会触发它 LoadReport 事件。...FRXDataSession N FRX游标(为让一个 ReportListener 使用而打开、当前报表引擎正在运那个报表一个只读拷贝)数据工作期ID GDIPlusGraphics N 用于绘制那个...StartDataSession N REPORT 或者 LABEL 命令开始执行时所在数据工作期 Summary L 如果 REPORT 命令指定了 SUMMARY 关键词则为 .T....第一个参数表示该带区在FRX表中记录OBJCODE字段,第二个参数是该带区在FRX游标中记录记录号 AfterBand nBandObjCode,nFRXRecno 在一个带区被处理之后触发。

96121

VBA技巧:记住单元格更改之前

标签:VBA,工作表事件 当工作表单元格中被修改后,我需要将修改前放置到其右侧单元格中。例如,单元格A1中输入有数值1,当我将其内容修改为2之后,之前数值1被放置到单元格B2中。..."Sheet1").Range("B1") = sOldValue Application.EnableEvents = True End If End Sub 这样,当在单元格A1中重新输入时...当一列单元格区域中发生改变时,需要将修改之前放置到相邻列对应单元格中,例如对于单元格区域A1:A10,其发生改变时,原来会自动放置到单元格区域B1:B10对应单元格中。...Value = Target.Value Target.Value = sNewValue Application.EnableEvents = True End If End Sub 有兴趣朋友可以试试看

14110

EasyGBS平台如何更改token时效性?

EasyGBS国标视频云服务可支持通过国标GB28181协议将设备接入,实现视频实时监控直播、录像、语音对讲、云存储、告警等功能,同时也支持将接入视频流进行全终端、全平台分发,分发视频流包括RTSP...平台部署简单,无需插件就能实现web浏览器播放,也支持手机浏览器、微信、PC等各种终端无插件播放。 image.png EasyGBS平台也提供丰富API接口,便于用户根据需求进行集成或二次开发。...基于接口文档,用户可以通过相关接口来获取对应信息,并对接到自己开发平台。 用户反馈,EasyGBS平台token过了一天之后就无效了,不知道什么原因,请求我们协助排查。...因为用户开启了接口鉴权,所以调用接口需要添加token才能实现。我们排查用户配置文件,发现token有效期只设置了一天时效。...所以,解决上述问题,可以在此位置更改token时效,如下图所示: image.png 用户可以根据自己需求,自定义更改token时效。

2.5K20

Mysql8之获取JSON字段

问题是这样,接到一个需求:         要从其它系统数据库中导出一些数据,发现其中有个字段是json字符串,而需求要是该JSON字符串中某个key对应value。    ...需求有了,这个如果只用SQL来处理,能否实现呢,SQL能否处理JSON数据呢,这个数据库是Mysql,看了下版本,发现是8.x,Mysql8中有json函数支持json处理,so开工探索。..."key": { "innerKey": "This is test" ... }, ... } ]     字段json如List-1所示,对应用json_extract...函数,json_extract(列名称,'$[0].key.innerKey')这样就取出innerKey值了。...要注意是该字段中不能含有非json字符串,不然json_extract会报错。如下List-2是SQL例子。

6.6K10
领券