当前位置:网站首页>String类创建的对象在JVM中的内存分配和equals与==的区别
String类创建的对象在JVM中的内存分配和equals与==的区别
2022-08-09 07:24:00 【哈希疯】
定义:
String s1 = "uml";
String s2 = "uml";
String s3 = new String("uml");
String s4 = new String("uml");
System.out.println(s1==s2);
System.out.println(s3==s4);
System.out.println(s1.equals(s4));
判断代码输出结果
A. true false true
B. false true false
解析
该题考察的是String类创建的对象在JVM中的内存分配和equals与==的区别。
==比较的是地址和值equals比较的是值

s1==s2比较的是地址和值,由上图得知两个引用指向的是同一个地址,所以返回true.s3 == s4比较的是两个new出来开辟的空间对象地址,所以值相同,但地址不同,返回false.s1.equals(s3)比较的是内容,返回true。
- 用
new创建的对象在堆区- 函数中的
临时变量在栈区- java中的
字符串在字符串常量区
此题极为不严谨,答案与具体的JVM类型和具体的JVM版本都有关系。以下分析基于广泛使用的Oracle HotSpot虚拟机:
首先,String str1 = “abc” 编译为字节码后,实际上相当于:String str1 = “abc”.intern()对于JDK 1.6,intern()方法是这样的:如果“abc”是首次遇到,则字符串“abc”本身会被复制到字符串常量池中,且以后如果再遇到“abc”,直接返回常量池的引用。注意,JDK 1.6的常量池存在于JVM的永久代中,而对于Hotspot虚拟机的实现,永久代事实上对应java虚拟机规范中的方法区!
对于JDK 1.7,intern()方法不会对字符串实例进行复制,而只是在字符串常量池中记录首次出现的实例引用。当然,最关键的是,JDK 1.7中的字符串常量池是在堆中的!
具体请参考 “深入理解JAVA虚拟机”一书中 第 42页 和 第57页 的讨论
边栏推荐
- rsync:recv_generator: mkdir (in backup) failed:Permission denied (13) |failed to set times on '.'
- SSL证书最长有效期13个月,还有必要一次申请多年吗?
- 链表专项练习(四)
- 先序遍历,中序遍历,后序遍历,层序遍历
- The maximum validity period of an SSL certificate is 13 months. Is it necessary to apply for multiple years at a time?
- c语言位段
- car-price-deeplearning-0411
- Lottie系列四:使用建议
- 细谈VR全景:数字营销时代的宠儿
- web自动化测试有哪些工具和框架?
猜你喜欢
随机推荐
vlucas/phpdotenv phpdotenv获取变量内容偶尔出现返回false
Colors that Tkinter can choose from
【报错】Root Cause com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
PyTorch中 torch.nn与torch.nn.functional的区别
子路由及路由出口配置
postgresql Window Functions
Invoker 2019CCPC秦皇岛站I题 简单DP
unity第一课
car-price-deeplearning-0411
Rsync常见错误
RestFul,会话技术,Fiddler
物理层课后作业
【Reprint】Deep Learning (deep learning) study notes arrangement
Tkinter可以选择的颜色
【修电脑】系统重装但IP不变后VScode Remote SSH连接失败解决
洛谷P1110 报表统计 multiset stl好题
数据一致性架构
入门cv必读的10篇baseline论文
2022 年全球十大最佳自动化测试工具
长沙学院2022暑假训练赛(一)六级阅读









