java中为啥有的直接打印对象输出的是哈希值,打印date对象输出的是时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中为啥有的直接打印对象输出的是哈希值,打印date对象输出的是时间相关的知识,希望对你有一定的参考价值。

参考技术A java.util.Date 这个类自己重写了toString方法
直接打印对象的时候是调用父类也就是Object的toStirng方法
public String toString()
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY)
index = 8;

convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null)
sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
else
sb.append("GMT");

sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
参考技术B System.out.println()方法会自动调用参数的toString()方法
如果你传进去的参数没有重写过toString()方法,那么就会输出改被打印对象的hash值
如果有重写toString()方法,那么就会按照重写后的toString()方法来输出内容

date类重写了toString()方法,这个可以去看源码本回答被提问者和网友采纳
参考技术C 因为JDK封装date是时间啊

Java学习:Object类

Object:是所有类的根类。所有的类都直接或者间接的继承自该类
1
创建学生对象打印学生对象的地址值(本质上是将地址通过哈希算法算出的哈希值)
同一个对象的哈希值肯定是一样的。
哈希值相同的对象的地址值未必一样。
新华字典,zhu -- 456(哈希值) -- 猪(第三个),朱(第5个),珠(第9个)

2
为什么重写toString()方法
默认情况下,打印的是对象的字符串表示,意义不大。
包名...类名[email protected]+该对象的哈希值的十六进制
所以,我们建议,所有子类重写该方法。
自动生成即可。
表示该对象的数据:
[类名 成员变量1=数据值1,成员变量2=数据值2,...]

技术分享
 1 class Student{
 2     //姓名和年龄
 3     private String name;
 4     private int age;
 5     //自动生成的快捷键shift+alt+s
 6     public String getName() {
 7         return name;
 8     }
 9     public void setName(String name) {
10         this.name = name;
11     }
12     public int getAge() {
13         return age;
14     }
15     public void setAge(int age) {
16         this.age = age;
17     }
18     public Student(String name, int age) {
19         super();
20         this.name = name;
21         this.age = age;
22     }
23     public Student() {
24         super();
25     }
26     //重写Object类中的toString方法,自动生成即可
27 
28     public String toString() {
29         return "Student [name=" + name + ", age=" + age + "]";
30     }
31 
32 }
33 
34 
35 public class StudentDemo {
36     public static void main(String[] args) {
37         //创建学生对象,并打印学生对象
38         Student s1 = new Student("林志玲", 50);
39         Student s2 = new Student("刘德华", 55);
40         
41         //打印两个学生对象
42         System.out.println(s1);//[email protected]
43         System.out.println(s2);//[email protected]
44         /**
45          * [email protected],我们之前称他为地址值其实是不够准确的,
46          * 因为当时为了让大家好理解,我们就暂且称他为地址值。
47          * 注意:他其实说白了是一个对象的字符串表示形式--格式:包名+类名[email protected]+该对象的哈希码值
48          * 
49          * 什么是哈希吗值呢?
50          * 有一种哈希算法,可以将对象的哈希吗值算出来,同一个对象的哈希吗值是一样的,
51          * 但是记住,哈希吗值一样不代表就是同一个对象
52          * 
53          * 举例:新华字典
54          * zhu  465页(哈希吗值)          猪 (第1个)                住(第四个)                   祝(第六个)
55          */
56     }
重写toString()方法

运行结果如下:

Student [name=林志玲, age=50]
Student [name=刘德华, age=55]



3
equals():
默认情况下,比较的是地址值。没有意义。
所以,建议子类重写该方法。
自动生成即可。
这个生成的方法作用是比较对象的成员变量值是否相同。

技术分享
 1 class Student2{
 2     private String name;
 3     private int age;
 4     public Student2(String name, int age) {
 5         super();
 6         this.name = name;
 7         this.age = age;
 8     }
 9     public Student2() {
10         super();
11         // TODO Auto-generated constructor stub
12     }
13     public String getName() {
14         return name;
15     }
16     public void setName(String name) {
17         this.name = name;
18     }
19     public int getAge() {
20         return age;
21     }
22     public void setAge(int age) {
23         this.age = age;
24     }
25     
26     public int hashCode() {
27         final int prime = 31;
28         int result = 1;
29         result = prime * result + age;
30         result = prime * result + ((name == null) ? 0 : name.hashCode());
31         return result;
32     }
33     
34     //equals()方法在这里比较的是对象的成员变量值,当一个对象和另一个对象的成员变量值完全相同的时候,equals()
35     //就可以认为这两个对象时同一个对象
36 
37     public boolean equals(Object obj) {
38         if (this == obj)
39             return true;
40         if (obj == null)
41             return false;
42         if (getClass() != obj.getClass())
43             return false;
44         Student2 other = (Student2) obj;
45         if (age != other.age)
46             return false;
47         if (name == null) {
48             if (other.name != null)
49                 return false;
50         } else if (!name.equals(other.name))
51             return false;
52         return true;
53     }
54 }
55 
56 
57 public class ObjectDemo {
58     public static void main(String[] args) {
59         //创建两个学生对象
60         Student2 s1 = new Student2();
61         Student2 s2 = new Student2();
62         //equals()方法是Object类中的方法,默认比较的是对象的地址值
63         System.out.println(s1.equals(s2));
64         System.out.println(s1==s2);// ==完全就可以比较地址值
65         
66         //创建两个学生对象
67         Student2 s3 = new Student2("刘德华", 55);
68         Student2 s4 = new Student2("刘德华", 55);
69         System.out.println(s3.equals(s4));
70         
71     }
equals()方法演示

运行结果如下:

true
false
true

 

























以上是关于java中为啥有的直接打印对象输出的是哈希值,打印date对象输出的是时间的主要内容,如果未能解决你的问题,请参考以下文章

Rails 视图从哈希中打印我们想要的某些值,然后是完整的哈希 - 为啥?

直接打印Java的对象时输出的到底是什么

JAVAjava中char类型数组用数组名打印结果不是地址值而是数组内容

如果 char 数组是 Java 中的 Object,为啥打印它不显示其哈希码?

Java Object类

vue监听一个对象属性变化为啥打印不出来对象