💡 一则也许对你有用的小广告 🏆

欢迎飞飞程序员   ,你将获得:专属的实战项目(已更新的所有会员标识的项目都能学习) / 1v1 提问 / Java 学习路线 / PHP 学习路线 / 学习打卡 / 社群讨论

  • 正在进行中的项目:《FFBlog知识付费博客项目》 正在持续更新中,基于 Spring Boot 3.x + JDK 21...,点击查看 ;
  • 《从零开发:FFBlog知识付费博客项目(全栈开发)》 演示链接: https://ffblog.ffcxy.com/  ;

截止目前, 飞飞  正在疯狂爆肝实战项目,后续还会上新更多项目,目标是将所学知识开发成项目并且分享给大家,如知识付费系统, Ai系统, CMS系统,在线商城系统,等等 ,欢迎点击围观

为什么 str1 == str2 返回 false

在 Java 中,== 运算符用于比较两个变量的内存地址(即是否指向同一个对象),而不是比较对象的内容。

代码分析

String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2);  // false
  1. new String("hello") 创建新对象

    • str1str2 分别指向两个不同的 String 对象,尽管它们的内容都是 "hello"
    • 每次 new 都会在堆内存中创建一个新对象,即使内容相同。
  2. == 比较的是引用地址

    • str1str2 存储的是不同的内存地址,所以 str1 == str2 返回 false

对比 equals() 方法

System.out.println(str1.equals(str2));  // true
  • String 类重写了 equals() 方法,比较的是字符串内容,而不是内存地址。
  • 只要两个字符串的字符序列相同,equals() 就返回 true

特殊情况:字符串字面量(String Pool)

如果使用字符串字面量(而不是 new),情况会不同:

String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);  // true
  • 字符串常量池(String Pool) 会复用相同的字符串对象,所以 s1s2 指向同一个内存地址。
  • "hello" 是编译期确定的,JVM 会优化存储,避免重复创建。

总结

比较方式 比较内容 示例 结果
== 内存地址 new String("hello") == new String("hello") false
equals() 字符串内容 new String("hello").equals(new String("hello")) true
字符串字面量 == 常量池优化 "hello" == "hello" true

关键点

  • == 比较的是对象地址new 会创建新对象,地址不同。
  • equals() 比较的是内容String 类已重写该方法。
  • 字符串字面量会复用常量池对象,所以 == 可能返回 true
上一篇 java中equals的详细用法
下一篇 Spring Boot框架中Import和@Autowired的区别和使用场景

全部评论(0)

头像
😃 😁 😅 😂 😍 😜 😝 🤑 🥵 🥰 😙 😎 😵 😭 😱 😖 🥳 👽 🙈 🤡 😤 💣 💯 💢 ❤️ 👍 👏 👋 👌 🤏 🙏
还没有任何评论哟~