==和equals方法
Posted Tomorrow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了==和equals方法相关的知识,希望对你有一定的参考价值。
Java程序中测试两个变量时否相等有两种方法: == 和 equals。
当使用==来判断两个变量是否相等时,如果两个变量时基本类型变量,且都是数字类型(不一定要求数据类型严格相同),则只要两个变量的值相同,就将返回true。
但对于两个引用类型变量,只有它们指向同一个对象时,== 判断才会返回true。
== 不可用于比较类型上没有父子关系的两个变量。
public static void main(String[] args) { int i = 12; float f = 12.0f; // 输出true System.out.println("65和65.0f是否相等?" + (i == f)); char c = ‘A‘; // 输出true System.out.println("65和‘A‘是否相等?" + (i == c)); String s1 = new String("Test"); String s2 = new String("Test"); // 输出false System.out.println("s1和s2是否相等?" + (s1 == s2)); // 输出true System.out.println("s1和s2是否相等?" + (s1.equals(s2))); // 编译不过 // System.out.println("Test" == new EqualTest()); }
需要注意 "Test"和new String("Test")是有区别的?
“Test”是字符串直接量(即可以在编译时就计算出来的字符串值),JVM使用常量池来管理这些字符串,
当使用new String("Test")时,JVM先使用常量池来管理“Test”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。也就是说new String("Test")一共创建了两个字符串对象。
常量池(constant pool)专门用来管理在编译时被确定并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量。
以上是关于==和equals方法的主要内容,如果未能解决你的问题,请参考以下文章
代码安全 | 第十七期:对象只定义了Equals和Hashcode方法之一的漏洞