最近准备转战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 - 9盒子,有一系列不同的对象,比如有cat,carrot。我们定义对象字符长度就是其哈希码。例如从对象cat名字中可知,其字符长度为3,那它哈希码就是3。carrot是6,其哈希码就是6。 -
问: 哈希码有何用?
答:方便对象在哈希表中的快速存储和获取。
例如上述例子,把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。
参考文章: