百度地图|你对 Java 中 HashCode 方法,有哪些思考?( 二 )


1、举例代码如下:public class StringDemo {
    public static void main(String[
args) {
        String s1 = \"Hello\";
        String s2 = \"Hello\";
        System.out.println(s1 == s2);   // true
   


2、稍微改动一下程序 , 会有奇怪的发现:public class StringDemo {
     public static void main(String args[
) {
         String str1 = \"Hello\";
         String str2 = new String(\"Hello\");
         String str3 = str2; // 引用传递
         System.out.println(str1 == str2); // false
         System.out.println(str1 == str3); // false
         System.out.println(str2 == str3); // true
         System.out.println(str1.equals(str2)); // true
         System.out.println(str1.equals(str3)); // true
         System.out.println(str2.equals(str3)); // true
   


上方我们new了一个对象 , 用“==”比较s1和s2 , 返回的结果却是false;而用用“equals”比较s1和s2 , 返回的结果是true 。
为了分析上面的代码 , 我们必须首先分析堆内存空间和栈内存空间 , 这一点非常重要:



看完上面的图 , 再结合上面的代码 , 就一目了然了 。 现在我们可以给自己出一道面试题:
面试题:请解释字符串比较之中“==”和equals()的区别?
==:比较的是两个字符串内存地址(堆内存)的值是否相等 , 属于地址值比较;
equals():比较的是两个字符串的内容 , 属于内容比较 。
以后进行字符串相等判断的时候都使用equals() 。
3、再次更改程序:public class ObjectDemo{
    public static void main(String[
args) {
        String s1 = \"Hello\";
        String s2 = new String(\"Hello\");
        s2 = s2.intern();
        System.out.println(s1 == s2);       //  true
        System.out.println(s1.equals(s2));  //  true
   



上述代码的第5行中 , java.lang.String的intern()方法\"abc\".intern()方法的返回值还是字符串\"abc\" , 表面上看起来好像这个方法没什么用处 。 但实际上 , 它做了个小动作:检查字符串池里是否存在\"abc\"这么一个字符串 , 如果存在 , 就返回池里的字符串;如果不存在 , 该方法会 把\"abc\"添加到字符串池中 , 然后再返回它的引用 。
4、比较两个对象的值:代码如下:
public class Demo6 {
   public static void main(String args[
) {
       Student student1 = new Student(\"生命壹号\" 22 \"成都\");
       Student student2 = new Student(\"生命壹号\" 22 \"成都\");
       System.out.println(student1 == student2);         //false
       System.out.println(student1.equals(student2));         //true
   


class Student {
   private String name;
   private int age;
   private String address;

   public Student(String name int age String address) {
       this.name = name;
       this.age = age;
       this.address = address;
   

   //重写Object类中的equals方法(比较两个对象的值是否相等)