Object
- Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。即所有的类都直接或间接的继承Object类
- Object只有一个无参构造,所以子类没有构造方法时,默认调用父类的无参构造
hashcode()
- public int hashCode():返回该对象的哈希码值。
- 注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值
- hashCode是一个本地方法,没有有源码
public class Student {
private String name;
private int age;
}
//----------------------------------------------
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.hashCode()); //2018699554
System.out.println(s2.hashCode()); //1311053135
Student s3 = s2;
System.out.println(s3.hashCode()); //1311053135
}
//多次运行,一致
- 在子类中重写(eclipse自动生成)hashCode后
- 不同对象的hashCode与对象的 基本数据类型属性值 和 引用数据类型属性 的hashCode值有关
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
String str = "a";
Student s1 = new Student("a",1);
Student s2 = new Student("a",1);
Student s3 = new Student(str,1);
Student s4 = new Student(str,1);
System.out.println(s1.hashCode()); //1089
System.out.println(s2.hashCode()); //1089
System.out.println(s3.hashCode()); //1089
System.out.println(s4.hashCode()); //1089
为什么str和"a"返回同样的hashCode值?
String是引用数据类型,str中的"a"与"a"返回同样的hashCode,说明String类中重写了hashCode()
public int hashCode() {
int h = hash; //hash Default to 0
if (h == 0 && value.length > 0) {
char val[] = value; //String中每个char组成的数组
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
equals
public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
//Object中的equals,比较地址,没有意义
public boolean equals(Object obj) {
return (this == obj);
}
equals()相等hashCode()肯定相等,但hashCode()相等equals()不一定相等
重写equals();一般同时重写hashCode(),目的是提高比较的效率
@Override
public boolean equals(Object obj) {
if (this == obj) //同一个对象
return true;
if (obj == null) //形参为null,建议"a".equals(str),避免空指针异常
return false;
if (getClass() != obj.getClass()) //是否是同一个类的对象
return false;
Student other = (Student) obj; //向下转型,为了能调用子类的属性和方法
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
getClass
返回此 Object 的运行时类
System.out.println(s1.getClass()); //class com.leex.hashCode.Student
System.out.println(s1.getClass().getName()); //com.leex.hashCode.Student
toString
-
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
-
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
//getClass().getName() + '@' + Integer.toHexString(hashCode()) //Integer.toHexString(int i):将10进制转换成16进制 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
自动生成重写toString()
@Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; }
-
打印对象时,自动调用类中的toString()
finalize
protected void finalize():
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
clone
protected Object clone():创建并返回此对象的一个副本。
-
protected修饰,必须重写
-
实现Cloneable接口,Cloneable接口没有方法,此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
- java.lang.CloneNotSupportedException没有实现Cloneable接口报错
Student s2 = (Student)s1.clone(); //创建一个和s1一模一样的新对象
Student s2 = s1; //s1,s2指向同一个对象
网友评论