public class Test {
public static void main(String[] args) {
String a=new String("foo");
String b=new String("foo");
String c="hello";
String d="hello";
System.out.println("memory address hashcode a:"+System.identityHashCode(a));
System.out.println("memory address hashcode a:"+System.identityHashCode(b));
System.out.println("String hashcode a: "+a.hashCode());
System.out.println("String hashcode a: "+b.hashCode());
System.out.println("a==b: "+(a==b));
System.out.println("a.equals(b): "+a.equals(b));
System.out.println("");
System.out.println("memory address hashcode c:"+System.identityHashCode(c));
System.out.println("memory address hashcode d:"+System.identityHashCode(d));
System.out.println("String hashcode c: "+c.hashCode());
System.out.println("String hashcode d: "+d.hashCode());
System.out.println("c==d: "+(c==d));
System.out.println("c.equals(d): "+c.equals(d));
}
}
输入结果:
memory address hashcode a:8222510
memory address hashcode a:18581223
String hashcode a: 101574
String hashcode a: 101574
a==b: false
a.equals(b): true
memory address hashcode c:3526198
memory address hashcode d:3526198
String hashcode c: 99162322
String hashcode d: 99162322
c==d: true
c.equals(d): true
结论:
==比较的是对象的地址
equals比较的是被String类重写的对比字符串的内容值
hasCode也是被String重写,已经不是对象内存地址的hash码,因为a、b是两个完全不同的对象,也满足这条规律“equals相等的两个对象,hasCode也相等”。
System.identityHashCode是未被重写的获取对象内存地址hash码的函数,可以发现a、b的内存地址不同
c、d的比较结果全部一致,这是java的一种优化 ,它会先把"hello"这个字符串放在字符缓冲区中,如果有出现一个String x = "hello",就直接把缓冲区中的地址赋给x,就会出现c与d指向的内存地址相同的。
分享到:
相关推荐
如果我们定义两个字符串 s1 和 s2,並将它们赋值为 "abc",然后使用 equals 方法比较它们,结果当然是 true。 最后,hashcode 方法是一个对象的散列码,它是用来唯一标识一个对象的。hashcode 方法可以将一个对象...
例如,在String类中,`equals()`方法会比较两个字符串的字符序列是否相同,而不关心它们是否是同一个对象实例。因此,对于以下代码: ```java String str1 = new String("foo"); String str2 = new String("foo"); `...
对于字符串,`s1.equals(s2)`返回真,因为尽管`s1`和`s2`是独立创建的,但它们包含相同的字符序列"abc",所以内容相等。而`s1 == s2`为假,因为它们是两个不同的对象实例。 问题1的答案就在于此:`==`比较的是对象...
在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...
例如,在 String 类中,equals 方法的实现是比较两个字符串的字符序列是否相等。如果两个字符串的字符序列相同,那么它们就是相等的。 public boolean equals(Object anObject) { if (this == anObject) { return...
例如,String类的`equals()`方法会比较两个字符串的字符序列是否相同: ```java String s1 = new String("Hello"); String s2 = new String("Hello"); boolean contentResult = s1.equals(s2); // contentResult为...
以下是关于 Java 基础知识点的总结,包括 ==、equals 和 hashCode 的区别、基本数据类型、多态、字符串类、内部类等。 1. ==、equals 和 hashCode 的区别 在 Java 中,==、equals 和 hashCode 是三种不同的比较...
例如,在String类中,“equals()”用于比较两个字符串的字符序列是否相同。如果两个字符串包含相同的字符,并且这些字符的顺序也相同,那么“equals()”将返回true。这就意味着即使两个字符串对象位于堆的不同位置,...
例如,有两个只包含两个字符的字符串,它们的字符可能不同,但由于ASCII码的关系,它们的`hashCode()` 可能相同。ASCII码是一种7位二进制编码,用于表示128个不同的字符。例如,'A'和'a'的ASCII值相差32,但它们的...
Java中==运算符与equals方法的区别是Java程序设计语言中的一個非常重要的概念,它們兩者都是用來比较字符串是否相等,但是它们的比较方式完全不同。 ==运算符是Java中的一个比较运算符,它用来比较两个对象是否是同...
例如,字符串`String`类就重写了`equals()`,使得它比较的是字符串内容而不是引用。 `==`操作符在Java中有两种用法:对于基本类型,它直接比较值;对于对象,它比较的是对象的引用,即两个引用是否指向内存中的同一...
- **比较**:`equals()`方法用于比较两个字符串的内容是否相同,`compareTo()`或`compareToIgnoreCase()`用于比较字符串的顺序。 - **查找与替换**:`indexOf()`和`lastIndexOf()`查找子字符串的位置,`replace()`...
在 `EqualsTest.java` 文件中,我们可以预期会找到一个测试类,该类可能包含对 `equals()` 和 `hashCode()` 方法的实现和测试。测试通常会使用 `assertEquals()` 来验证 `equals()` 和 `hashCode()` 方法的正确性,...
在`StringPerformanceTest.java`文件中,我们可以预计会找到一个测试用例,展示了不同的字符串比较策略对性能的影响。例如,可能包含了使用`String#equals()`、`String#compareTo()`或自定义比较逻辑的基准测试。 `...
对于字符串,`String` 类已经重写了 `equals()` 方法,以比较字符串内容而不是引用: ```java String s1 = "hello"; String s2 = "hello"; String s3 = new String("hello"); System.out.println(s1 == s2); // ...
例如,在`String`类中,`equals`方法是比较字符串的内容而非引用。 - **性能考虑**: 为了提高性能,只有当两个对象的`hashCode`相同的情况下,才会调用`equals`方法进行深度比较。 - **一致性要求**: `equals`方法...
// s1 和 s2 都引用了常量池中的同一个字符串对象 System.out.println(s1 == s2); // 输出:true String s4 = "hello"; String s5 = "Java"; String s6 = s4 + s5; // 字符串连接在运行时创建新的对象 System...
例如,在 String 类中,我们可以比较字符串的字符序列是否相等。 在实现 hashCode 方法时,我们需要遵守 API 中的约定,即相等对象必须具有相等的哈希码。这是因为,在 Java 集合对象中,判断两个对象是否相等的...
1. Java中==和equals和hashCode的区别 Java中的数据类型可以分为两类:基本数据类型和引用类型。基本数据类型包括byte、short、char、int、long、float、double、boolean等,它们之间的比较使用双等号(==),比较...
例如,如果你有两个字符串变量`str1`和`str2`,并分别赋值为"hello",`str1 == str2`会返回`false`,因为它们指向不同的内存地址,即使它们的内容相同。 接下来,我们来讨论`equals()`方法。这个方法是Object类的一...