您的位置:首页 > 移动开发 > Objective-C

Object类中方法总结:基于Java8

2018-03-14 11:05 405 查看
今天看了下别人的阿里面经,总结了以下问题:
1.Object类有哪些方法?

2. hashcode方法有什么用
3.hashcode和equals的区别,引申到map,扩容的实现,时间复杂度
首先有以下几个方法:



1.hashCode和equale函数用来判断对象是否相同

2.wait(),wait(long),wait(long,int),notify(),notifyAll() 
3.toString()和getClass()

4.clone()
5.finalize()用于在垃圾回收
6.registerNatives() 本地注册

1.hashCode和equals函数用来判断对象是否相同  (参考:http://blog.csdn.net/hla199106/article/details/46907725)

这里面牵扯到的就比较多了,我们再加一个与“==”的比较。
1.1     ==基本数据类型:(==),比较的是他们的值。 
引用类型(类、接口、数组)   :用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

**** 对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。
1.2     equals    默认的equals: public boolean equals(Object obj) {
return (this == obj);
}这是java中默认的equals(obj) 方法,判断是不是同一个对象。
    覆盖了的equals方法:
    **以下是String的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;
}    判断流程为:
   即String中equals方法判断相等的步骤是:
1.若A==B 即是同一个String对象 返回true
2.若对比对象是String类型则继续,否则返回false
3.判断A、B长度是否一样,不一样的话返回false
4。逐个字符比较,若有不相等字符,返回false
 重新实现equals()方法需要满足以下5个特性:自反:对称,传递,一致,非空性。
1.3   hashcode()      hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。
     初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。   
[b] 1.4  hashcode() 和 equals() 的区别[/b]      1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。 
      2、如果两个对象不equals,他们的hashcode有可能相等。 
      3、如果两个对象hashcode相等,他们不一定equals。 

      4、如果两个对象hashcode不相等,他们一定不equals。 

2.wait(),wait(long),wait(long,int),notify(),notifyAll() 

这几个函数体现的是Java的多线程机制
在使用的时候要求在synchronize语句中使用
wait()用于让当前线程失去操作权限,当前线程进入等待序列
notify()用于随机通知一个持有对象的锁的线程获取操作权限
notifyAll()用于通知所有持有对象的锁的线程获取操作权限
wait(long) 和wait(long,int)用于设定下一次获取锁的距离当前释放锁的时间间隔

3.toString()和getClass()

toString()返回一个String对象,用来标识自己 
如Object类默认的:public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}getClass()返回一个Class对象。

4.clone()

    其实是使用了原型模式,
    使用clone方法的几个条件:
    1)在派生类中实现Cloneable借口。
 2)为了获取对象的一份拷贝,我们可以利用Object类的clone方法。
 3)在派生类中覆盖积累的clone方法,声明为public。

 4)在派生类的clone方法中,调用super.clone()。
     具体:http://www.cnblogs.com/gw811/archive/2012/10/07/2712252.html

5.finalize()用于在垃圾回收

   

6.registerNatives() 本地注册

    native修饰的方法表示本地方法(跟系统有关,也可以理解为这个方法不是在java中实现的),据说这个方法在一个名为java.dll的动态库文件中。Object类中第40行(我的是jdk1.8)开始的 static{ registerNatives(); } 表示的是在类被加载时,调用 registerNatives()方法进行一些跟系统有关的方法调用,而这个方法的实现就在java.dll中(里面会根据不同系统来执行不同的底层操作)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: