Object类
作者:互联网
javaEE-2206-何川 19:42:44
Object
Object:对象,物质,客观
万物皆对象:java中所有的类都会直接或者间接继承Object这个类
getClass();
获取类对象
//程序初始化
private static native void registerNatives();//本地方法
//获取类对象
public final native Class<?> getClass();
hashCode();
hash值
散列算法(不是java实现的)
同一个对象的返回值一样
不同对象的返回值可能一样(9亿分之1)
重写之后要看没有重写的hashCode值:
System.identityHashCode(s1)
//hash值
public native int hashCode();
用处:以后我们的集合都是使用hashcode值来代表对象---对象的代表--地址值
//对象地址的映射
如果对象一样,hash值一定一样
如果对象不一样,hash值一般情况是不一样的,极特殊情况可能一样。
//散列--31是为了让这个数据更散,不容易产生碰撞
String类的hashcode方法:
public int hashCode() {
int h = hash;//private int hash;Default to 0
if (h == 0 && value.length > 0) {//private final char value[];
char val[] = value;//"黄药师"
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];//黄的编码
}
hash = h;//缓存的思想,提高效率
}
return h;
}
//如果学生对象所有的属性一样,则hash值一样:重写
hash碰撞:
两个不同东西,经过hash算法之后结果一样
//自己重写---alt+shift+s--->hashCode()
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
重写之后要看没有重写的hashCode值:
System.identityHashCode(s1)
equals()
字符串比较
public boolean equals(Object obj) {
return (this == obj);//栈里的引用地址是否相等
}
字符串这个类对equals尽心了重写:
public boolean equals(Object anObject) {
if (this == anObject) {//如果地址一样,则值肯定一样
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;//向下转型
int n = value.length;//调用者字符数组
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//一位一位的比较
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
咱们自己也可以重写equals:
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
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;
}
toString()
属性输出
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
启示:自己的类写个toString可以方便属性输出
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
finalize();
protected void finalize() { }
垃圾回收之前调用这个--垃圾被回收之前逃命的机会
clone()
- 重写父类的clone方法
- 实现Cloneable接口
- 调用对象的克隆方法得到一个新对象
-
浅复制:
-
- 只实现了栈中的复制,引用类型只是复制地址
-
深复制:
-
- 所有引用类型再复制
标签:hash,name,int,Object,hashCode,return,public 来源: https://www.cnblogs.com/liang5683/p/16452285.html