经常看到很多人讨论java中关于String的问题,我也就有点兴趣了,鉴于网上很多人写的都差别很大, 同样的问题都是不同的说法,我很迷糊,花了一晚上读了Java Virtual Machine Specification和 The Java Language Specification的一些章节,做了很多试验,总结了一下关于String的内容,还 有很多内容我也不确定,在下面也都提出来了,希望高手能指正. Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太 明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容. String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为 String Constant Pool.好像没有正式的命名?? 在java编译好的class文件中,有个区域称为Constant Pool,他是一个由数组组成的表,类型 为cp_info constant_pool[],用来存储程序中使用的各种常量,包括Class/String/Integer等各 种基本Java数据类型,详情参见The Java Virtual Machine Specification 4.4章节. 对于Constant Pool,表的基本通用结构为: cp_info { u1 tag; u1 info[]; } tag是一个数字,用来表示存储的常量的类型,例如8表示String类型,5表示Long类型,info[]根据 类型码tag的不同会发生相应变化. 对于String类型,表的结构为: CONSTANT_String_info { u1 tag; u2 string_index; } tag固定为8,string_index是字符串内容信息,类型为: CONSTANT_Utf8_info { u1 tag; u2 length; u1 bytes[length]; } tag固定为1,length为字符串的长度,bytes[length]为字符串的内容. (以下代码在jdk6中编译) 为了详细理解Constant Pool的结构,我们参看一些代码: String s1 = "sss111"; String s2 = "sss222"; System.out.println(s1 + " " + s2); 由于"sss111"和"sss222"都是字符串常量,在编译期就已经创建好了存储在class文件中. 在编译后的class文件中会存在这2个常量的对应表示: 08 00 11 01 00 06 73 73 73 31 31 31 08 00 13 01 ; ......sss111.... 00 06 73 73 73 32 32 32 ; ..sss222 根据上面说的String常量结构,我们分析一下 开始的08为CONSTANT_String_info结构中的tag,而11应该是它的相对引用,01为 CONSTANT_Utf8_info的tag,06为对应字符串的长度,73 73 73 31 31 31为字符串对 应的编码,接着分析,会发现后面的是对应"sss222"的存储结构. 经过上面分析,我们知道了11和13是两个字符串的相对引用,就可以修改class文件 来修改打印的内容,把class文件中的 00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 12 4D 改成 00 6E 00 04 00 03 00 00 00 24 12 10 4C 12 10 4D 程序就会输出sss111 sss111,而不是和原程序一样输出sss111 sss222,因为我 们把对"sss222"的相对引用12改成了对"sss111"的相对引用10. ------------分割线 public class Test { public static void main(String[] args) { String s1 = "sss111"; String s2 = "sss111"; } } 在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中 只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示: 000000abh: 08 00 11 01 00 06 73 73 73 31 31 31 ; ......sss111 在程序执行的时候,Constant Pool会储存在Method Area,而不是heap中. 另外,对于""内容为空的字符串常量,会创建一个长度为0,内容为空的字符串放到Constant Pool中, 而且Constant Pool在运行期是可以动态扩展的. 关于String类的说明 1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能 再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable). 2.String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("i am")实际创建了2个 String对象,一个是"i am"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同, 一个是编译期,一个是运行期! 3.java对String类型重载了+操作符,可以直接使用+对两个字符串进行连接. 4.运行期调用String类的intern()方法可以向String Pool中动态添加对象. String的创建方法一般有如下几种 1.直接使用""引号创建. 2.使用new String()创建. 3.使用new String("someString")创建以及其他的一些重载构造函数创建. 4.使用重载的字符串连接操作符+创建. 例1 /* * "sss111"是编译期常量,编译时已经能确定它的值,在编译 * 好的class文件中它已经在String Pool中了,此语句会在 * String Pool中查找等于"sss111"的字符串(用equals(Object)方法确定), * 如果存在就把引用返回,付值给s1.不存在就会创建一个"sss111"放在 * String Pool中,然后把引用返回,付值给s1. * */ String s1 = "sss111"; //此语句同上 String s2 = "sss111"; /* * 由于String Pool只会维护一个值相同的String对象 * 上面2句得到的引用是String Pool中同一个对象,所以 * 他们引用相等 */ System.out.println(s1 == s2); //结果为true 例2 /* * 在java中,使用new关键字会创建一个新对象,在本例中,不管在 * String Pool中是否已经有值相同的对象,都会创建了一个新的 * String对象存储在heap中,然后把引用返回赋给s1. * 本例中使用了String的public String(String original)构造函数. */ String s1 = new String("sss111"); /* * 此句会按照例1中所述在String Pool中查找 */ String s2 = "sss111"; /* * 由于s1是new出的新对象,存储在heap中,s2指向的对象 * 存储在String Pool中,他们肯定不是同一个对象,只是 * 存储的字符串值相同,所以返回false. */ System.out.println(s1 == s2); //结果为false 例3 String s1 = new String("sss111"); /* * 当调用intern方法时,如果String Pool中已经包含一个等于此String对象 * 的字符串(用 equals(Object)方法确定),则返回池中的字符串.否则,将此 * String对象添加到池中,并返回此String对象在String Pool中的引用. */ s1 = s1.intern(); String s2 = "sss111"; /* * 由于执行了s1 = s1.intern(),会使s1指向String Pool中值为"sss111" * 的字符串对象,s2也指向了同样的对象,所以结果为true */ System.out.println(s1 == s2); 例4 String s1 = new String("111"); String s2 = "sss111"; /* * 由于进行连接的2个字符串都是常量,编译期就能确定连接后的值了, * 编译器会进行优化直接把他们表示成"sss111"存储到String Pool中, * 由于上边的s2="sss111"已经在String Pool中加入了"sss111", * 此句会把s3指向和s2相同的对象,所以他们引用相同.此时仍然会创建出 * "sss"和"111"两个常量,存储到String Pool中. */ String s3 = "sss" + "111"; /* * 由于s1是个变量,在编译期不能确定它的值是多少,所以 * 会在执行的时候创建一个新的String对象存储到heap中, * 然后赋值给s4. */ String s4 = "sss" + s1; System.out.println(s2 == s3); //true System.out.println(s2 == s4); //false System.out.println(s2 == s4.intern()); //true 例5 这个是The Java Language Specification中3.10.5节的例子,有了上面的说明,这个应该不难理解了 package testPackage; class Test { public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " "); System.out.print((Other.hello == hello) + " "); System.out.print((other.Other.hello == hello) + " "); System.out.print((hello == ("Hel"+"lo")) + " "); System.out.print((hello == ("Hel"+lo)) + " "); System.out.println(hello == ("Hel"+lo).intern()); } } class Other { static String hello = "Hello"; } package other; public class Other { static String hello = "Hello"; } 输出结果为true true true true false true,请自行分析! 结果上面分析,总结如下: 1.单独使用""引号创建的字符串都是常量,编译期就已经确定存储到String Pool中. 2.使用new String("")创建的对象会存储到heap中,是运行期新创建的. 3.使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存储到String Pool中. 4.使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中. 6.使用"aa" + s1以及new String("aa" + s1)形式创建的对象是否加入到String Pool中我不太确定,可能是必须 调用intern()方法才会加入,希望高手能回答 @_@ 还有几个经常考的面试题: 1. String s1 = new String("s1") ; String s2 = new String("s1") ; 上面创建了几个String对象? 答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个. 2. String s1 = "s1"; String s2 = s1; s2 = "s2"; s1指向的对象中的字符串是什么? 答案: "s1"
(http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html)
发表评论
-
[转]java中类型所占字节数以及可表示的数字个数
2012-10-08 17:24 1029基本概念 字节的单位是byte。位的单位是bit。 ... -
[转]java位操作符总结
2012-10-08 15:32 1199二进制负数以它正值的补码形式表达 补码:反码+1 ... -
EL访问作用域变量与javaBean的作用域
2012-07-19 16:06 0稍后 -
[转] final、finally和finalize的区别是什么?
2012-07-13 16:56 873final、finally和finalize虽然长得像孪生 ... -
[转]java代理模式与动态代理
2012-07-06 18:18 8071、代理模式 所谓代理,就是一个人或者一个机构代 ... -
[转]关于hashcode与equal函数
2012-07-01 11:28 864hashcode:独一无二地代表了一个对象,并且通过ha ... -
关于Iterator使用时应该注意的一个小问题
2012-05-11 16:02 1839今天在用java编程时遇到一个小问题,记下来备忘: It ...
相关推荐
TinyYolo2实时视频流物体检测ONNX模型 运行 ONNX 模型,并结合 OpenCV 进行图像处理。具体流程包括: 1. 加载并初始化 ONNX 模型。 2. 从摄像头捕获实时视频流。 3. 对每一帧图像进行模型推理,生成物体检测结果。 4. 在界面上绘制检测结果的边界框和标签。
chromedriver-linux64-134.0.6998.23(Beta).zip
Web开发:ABP框架4-DDD四层架构的详解
chromedriver-linux64-135.0.7029.0(Canary).zip
实现人脸识别的考勤门禁系统可以分为以下步骤: 1. 采集人脸图像数据集:首先需要采集员工的人脸图像数据集,包括正面、侧面等多个角度的图像。可以使用MATLAB中的图像采集工具或者第三方库进行采集。 2. 预处理人脸图像数据:对采集到的人脸图像数据进行预处理,包括人脸检测、人脸对齐、人脸裁剪等操作。MATLAB提供了相关的图像处理工具箱,可以用于实现这些处理步骤。 3. 特征提取与特征匹配:使用人脸识别算法提取人脸图像的特征,比如使用人脸识别中常用的特征提取算法如Eigenfaces、Fisherfaces或者基于深度学习的算法。然后将员工的人脸数据与数据库中的人脸数据进行匹配,判断是否为注册员工。 4. 考勤记录与门禁控制:如果人脸匹配成功,系统可以记录员工的考勤时间,并且控制门禁系统进行开启。MATLAB可以与外部设备进行通信,实现门禁控制以及考勤记录功能。
yugy
企业IT治理体系规划.pptx
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
基于多目标粒子群算法的冷热电联供综合能源系统优化调度与运行策略分析,基于多目标粒子群算法的冷热电联供综合能源系统优化调度与运行策略分析,MATLAB代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:《基于多目标算法的冷热电联供型综合能源系统运行优化》 仿真平台:MATLAB 平台采用粒子群实现求解 优势:代码注释详实,适合参考学习,非目前烂大街的版本,程序非常精品,请仔细辨识 主要内容:代码构建了含冷、热、电负荷的冷热电联供型综合能源系统优化调度模型,考虑了燃气轮机、电制冷机、锅炉以及风光机组等资源,并且考虑与上级电网的购电交易,综合考虑了用户购电购热冷量的成本、CCHP收益以及成本等各种因素,从而实现CCHP系统的经济运行,求解采用的是MOPSO算法(多目标粒子群算法),求解效果极佳,具体可以看图 ,核心关键词: 综合能源系统; 冷热电三联供; 粒子群算法; 多目标优化; MOPSO算法; 优化调度模型; 燃气轮机; 电制冷机; 锅炉; 风光机组; 上级电网购售电交易。,基于多目标粒子群算法的CCHP综合
DSP28379D串口升级方案:单核双核升级与Boot优化,C#上位机开发串口通信方案,DSP28379D串口升级方案:单核双核升级与Boot优化,C#上位机开发实现串口通信,DSP28379D串口升级方案 单核双核升级,boot升级,串口方案。 上位机用c#开发。 ,DSP28379D; 串口升级方案; 单核双核升级; boot升级; 上位机C#开发,DSP28379D串口双核升级方案:Boot串口升级技术使用C#上位机开发
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
基于PLC的双层自动门控制:光电传感触发,有序开关与延时功能实现,附程序、画面及参考文档。,基于PLC的双层自动门控制系统:精准控制,保障无尘环境;门间联动,智能安防新体验。,基于plc的双层自动门控制系统,全部采用博途仿真完成,提供程序,画面,参考文档,详情见图。 实现功能(详见上方演示视频): ① 某房间要求尽可能地保持无尘,在通道上设置了两道电动门,门1和门2,可通过光电传感器自动完成门的打开和关闭。 门1和门2 不能同时打开。 ② 第 1 道门(根据出入方向不同,可能是门 1 或门 2),是由在通道外的开门者通过按开门按钮打开的,而第 2 道门(根据出入方向不同,可能是门 1 或门 2 )则是在打开的第 1 道门关闭后自动地打开的(也可以由通道内的人按开门按钮来打开第2 道门)。 这两道门都是在门开后,经过 3s 的延时而自动关闭的。 ③ 在门关闭期间,如果对应的光电传感器的信号被遮断,则门立即自动打开。 如果在门外或者在门内的开门者按对应的开门按钮时,立即打开。 ④ 出于安全方面的考虑,如果在通道内的某个人经过光电传感器时,对应的门已经打开,则通道外的开门者可以不按开门按钮。
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
DeepSeek+DeepResearch——让科研像聊天一样简单 (1)DeepSeek如何做数据分析? (2)DeepSeek如何分析文件内容? (3)DeepSeek如何进行数据挖掘? (4)DeepSeek如何进行科学研究? (5)DeepSeek如何写综述? (6)DeepSeek如何进行数据可视化? (7)DeepSeek如何写作润色? (8)DeepSeek如何中英文互译? (9)DeepSeek如何做降重? (10)DeepSeek论文参考文献指令 (11)DeepSeek基础知识。
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
1、文件内容:jdepend-demo-2.9.1-10.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/jdepend-demo-2.9.1-10.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
内容概要:本文档详细介绍了如何利用 MATLAB 实现鲸鱼优化算法 (WOA) 和长短期记忆网络 (LSTM) 相结合的技术——WOA-LSTM,在数据分类和预测领域的应用。文章首先概述了LSTM在网络训练中超参数依赖的问题以及WOA作为一种新颖的全局优化算法的优势。接着阐述了该项目的研究背景、目的及其重要意义,并深入讨论了项目面临的六大主要挑战,从模型优化到超参数空间管理。文档特别强调WOA-LSTM融合所带来的性能提升、降低计算复杂度的能力及其实现自动化的超参数优化流程。除此之外,文中展示了模型的应用广泛性,覆盖了从金融市场的股票预测到智能制造业的各种实际场景,并提供了具体的模型架构细节和代码实例,以帮助理解模型的工作原理和技术要点。 适合人群:具有一定编程技能的研究人员、工程师和科学家们,尤其是对深度学习技术和机器学习感兴趣的专业人士。 使用场景及目标:该文档的目标是向用户传授使用MATLAB实现WOA-LSTM进行复杂数据分类和预测的方法论,旨在指导读者理解和掌握如何利用WOA进行超参数寻优,从而改善LSTM网络性能。 其他说明:通过阅读这份文档,使用者不仅能够获得有关WOA-LSTM技术的具体实现方式的知识,而且还可以获取关于项目规划和实际部署过程中的宝贵经验。
tomcat安装及配置教程.md
**MATLAB下微电网两阶段鲁棒优化经济调度策略:基于CCG算法与min-max-min结构求解**,MATLAB微电网两阶段鲁棒优化经济调度程序:构建min-max-min结构模型,实现恶劣场景下的低成本调度,灵活调整调度保守性,利用列约束生成算法求解,MATLAB代码:微电网两阶段鲁棒优化经济调度程序 关键词:微网优化调度 两阶段鲁棒 CCG算法 经济调度 参考文档:《微电网两阶段鲁棒优化经济调度方法》 仿真平台:MATLAB YALMIP+CPLEX 优势:代码注释详实,出图效果非常好(具体看图),非目前烂大街版本,请仔细辨识 主要内容:构建了微网两阶段鲁棒调度模型,建立了min-max-min 结构的两阶段鲁棒优化模型,可得到最恶劣场景下运行成本最低的调度方案。 模型中考虑了储能、需求侧负荷及可控分布式电源等的运行约束和协调控制,并引入了不确定性调节参数,可灵活调整调度方案的保守性。 基于列约束生成算法和强对偶理论,可将原问题分解为具有混合整数线性特征的主问题和子问题进行交替求解,从而得到原问题的最优解。 最终通过仿真分析验证了所建模型和求解算法的有效性,具体内容可自行查