java - 为什么jvm在比较两个相同类型的对象时返回false?
问题描述
public class Test
{
public static void main(String[] args)
{
String s = new String("test");// ***
String s1 = s.toUpperCase();
String s2 = s.toLowerCase();
String s3 = s1.toLowerCase();
System.out.println(s==s1);//first case
System.out.println(s==s2);//second case
System.out.println(s==s3);//third case
}
}
1)为什么它在第三种情况下返回false(评论)。s3 和 s 都指向测试是吗?但似乎 JVM在堆内存中为 s3创建了另一个名为test的对象。但对于第二种情况(评论)是不一样的。它使用之前创建为 s 的对象(在代码中注释为 ***)。这是为什么?
2) s1 对象TEST会发生什么,因为 s3 是从 s1 创建的。s1 会被销毁还是在堆中?
解决方案
此处String s = new String("test");
对象将在堆区(不在字符串池区内)创建,但任何操作后返回的任何其他字符串都将在字符串池区创建。要回答您的问题:
s==s3
返回 false 因为它们是两个不同的对象。s1
在被引用之前不会被垃圾收集器收集。
推荐阅读
- python - 哪个 python 函数可以帮助我从一长段输出中只提取一行输出?
- gitlab - Gitlab 使用 Kubernetes 机密作为 Helm 值文件
- flutter - Flutter DataTable 获取所有行值
- python - 用缺失的日期填充其他列 Nan Pandas DataFrane
- java - javafx字体渲染系统中如何使用swing字体渲染系统?
- mysql - 尝试更改节点 js 的密码时:ERROR 1819 (HY000): Your password does not meet the current policy requirements
- qemu - 无法运行“/etc/init.d/rcS”:没有这样的文件或目录
- vue.js - 从另一个按钮取消选中 vue 单选按钮
- amazon-web-services - 使用 AWS 命令行界面 (CLI) 从 Amazon S3 批量下载文件
- python - 从服务器请求文件时出现烧瓶错误