toString() 及其引出的HashCode

最近准备转战Java,学几个月准备去应聘试试。
在Coursera学课程,其中测验的一段代码让我很好奇。


class Simple代码如下:

public class Simple{ 
     private String word; 
     private String phrase; 
     public Simple(int number, String w) { 	
          word = w; 	
          phrase = mystery(number, w);          
     }  
      
     private String mystery(int num, String s) {  	
          String answer = "";  	
          for (int k=0; k<num; k++) {     	
               answer = answer + s;  	
          }  	
          return answer; 
     } 

     public String toString() { 	
          return phrase + " is " + word + " repeated";
     }
}

class TestSimple如下,用来测试Simple

public class TestSimple{
     public void print() {  	
          Simple item = new Simple(3, "blue");     	
          System.out.println(item);             
     }      
}

实例化TestSimple中的之后,运行print()System.out.println()竟然能把blue is blue repeated打印出来。

问题在于,对象实例化之后,没有调用类里的任何方法,居然能打印出有内容的字符串。

查询了之后了解到:
每个对象都有一个toString()方法,每次尝试打印一个对象时,这个方法就会被调用。 因为在Simple类中,重新定义的toString()方法覆盖了默认值,并且return phrase + " is " + word + " repeated";,所以可以打印出字符串。

:那如果不覆盖toString()方法,直接打印一个对象会发生什么呢?
:会返回className@HashCode的字符串(类名@哈希码)。例如上文中的代码就会返回Simple@1f1f778。
具体一些,com.foo.MyType@2f92e0f4中,

  • com.foo.MyType表示com.foo包中MyType
  • @表示连接字符串
  • 2f92e0f4该对象的哈希码,不同对象的哈希码可能相同。

下面收集了一些关于toString()HashCode的知识点


toString()的用法

自定义输出
自动生成输出
打印成组的对象

以上用法,详见参考文章1


HashCode知识点

  1. : 什么是哈希码?
    :哈希码是从对象中生成的一串数字。
    例子:有编号从1 - 9盒子,有一系列不同的对象,比如有cat,carrot。我们定义对象字符长度就是其哈希码。例如从对象cat名字中可知,其字符长度为3,那它哈希码就是3。carrot是6,其哈希码就是6。

  2. : 哈希码有何用?
    :方便对象在哈希表中的快速存储和获取。
    例如上述例子,把cat长度为三,放在3号盒子,carrot长度为6,放在6号盒子,就可以利用这种关系快速知道一个对象放在哪个盒子。

    如下代码。要查询Baeldung是否在列表里,如果列表长度很长,linear search会很慢。

    List<String> words = Arrays.asList("Welcome", "to", "Baeldung");
    if (words.contains("Baeldung")) {
        System.out.println("Baeldung is in the list");
    }
    

    可以利用哈希码,把每个对象存在哈希表中索引。就可以快速根据对象获取其位置。

  3. :如何生成哈希码?
    : 未完待续。先参考参考文章3。

参考文章:

  1. How do I print my Java object without getting “SomeType@2f92e0f4”?
  2. Java toString() method
  3. Guide to hashCode() in Java
  4. What is HashCode
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值