应优先用.equals()比较内容,==仅适用于基本类型或明确需比引用的场景;字符串比较须用.equals()或objects.equals()防null;数值比较用compareto()而非>、

Java里==和.equals()到底该用哪个?
==比较的是引用(内存地址),.equals()比较的是内容——但前提是对象重写了这个方法。没重写的类(比如自定义类不写equals())调用的还是父类Object.equals(),本质还是==。
- 字符串字面量比较可以用
==(因为字符串常量池),但只要涉及变量、拼接、new String(),就必须用.equals() -
null调用.equals()会抛NullPointerException,推荐用Objects.equals(a, b)来安全比较 - 数值类型包装类(
Integer、Boolean等)在-128~127范围内用==可能“碰巧”成立(自动装箱缓存),超出范围就不可靠
String s1 = "hello";
String s2 = new String("hello");
s1 == s2; // false
s1.equals(s2); // true
Objects.equals(s1, s2); // true,且能防null
数值比较时>、、<code>!=能用在哪些类型上?
Java只允许基本数值类型(byte、short、int、long、float、double、char)和它们的包装类(自动拆箱后)使用关系运算符。
- 包装类之间直接用
>会触发自动拆箱,如果其中一个是null,运行时抛NullPointerException -
boolean不能参与>或比较,只能用<code>==或!= -
char可以和数字比较(按Unicode码点),比如'a' > 97是false(因为'a'就是97)
Integer a = 1000, b = null; a > b; // 抛NullPointerException!
字符串怎么安全地做大小比较?别硬套>和<p>Java中字符串不支持<code>>、运算符——写了直接编译报错:<code>The operator > is undefined for the argument type(s) String, String。
Java Maven Common
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
下载
- 正确做法是用
String.compareTo():返回负数、0、正数分别表示小于、等于、大于
- 如果只需要判断是否相等或不等,用
.equals()或!s1.equals(s2),别用s1 != s2(那是引用比较)
- 忽略大小写用
equalsIgnoreCase(),按自然语言顺序用Collator(比如中文排序)
"apple".compareTo("banana"); // 负数
"Apple".equals("apple"); // false
"Apple".equalsIgnoreCase("apple"); // true
浮点数用==或!=比较为什么经常出错?
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
String.compareTo():返回负数、0、正数分别表示小于、等于、大于.equals()或!s1.equals(s2),别用s1 != s2(那是引用比较)equalsIgnoreCase(),按自然语言顺序用Collator(比如中文排序)==或!=比较为什么经常出错?浮点数在二进制中无法精确表示大部分十进制小数(比如0.1 + 0.2 != 0.3),所以用==判断相等大概率失败。
- 判断“是否相等”应改为“是否落在误差范围内”,即用
Math.abs(a - b) -
epsilon不能固定写成0.000001,要根据数量级调整;对double常用1e-15,float用1e-6 -
Double.compare(a, b)可安全处理NaN和无穷大,比直接减法更健壮
double a = 0.1 + 0.2; double b = 0.3; a == b; // false! Math.abs(a - b) <p>浮点数精度问题不是bug,是所有IEEE 754语言共有的底层限制,绕不开,只能换思路处理。</p>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










