Object方法

 java中Object(java.long)主要的方法如下:

Object方法

 1.clone   返回的对象为浅拷贝

clone()方法是一个被声明为native 的方法,不是java的原生方法,具体的实现由c/c++实现。目的就是创建并返回此对象的一个副本。

形象点说:这有一副漂亮的画,你也想要个一模一样的,就可以调用此方法像变魔术一样变出来一模一样的画。但从此刻起,之前的那副画如果进行了新的改动,与你克隆出来的画没有任何关系了。你克隆出来的对象变不变完全取决于你对克隆出来的画有没有进行过什么操作。用java术语来说就是:clone函数返回的是一个引用,指向的是新的clone出来的对象,此对象与原对象分别占用不同的堆空间

 

2.equals

equals()方法是对象比较函数,按照对象比较,系统默认四个类覆写该方法:Integer , String,Date,file
没有覆写equals()方法的类会调用Object的equals()方法,Object类的equals()方法直接用==实现
比较过程:
    1.首先判断两个比较对象类型是否相同
    如果不同返回false
    2.如果相同继续判断对象内容是否相同
    如果相同返回true
    如果不同返回false


“==”是等值比较,比较的是变量的内容
1.当比较对象为基本数据类型时,比较的是数据的大小
2.当比较对象为引用类型时,比较的是引用类型中存放的地址

使用方法以及注意事项

e.g.:

String s1=new String("aaa");
String s2=new String("aaa");
s1.equals(s2)

即使s1与s2并不是同一个对象,但s1与s2的类型相同并且内容一样,此时equals方法返回值为true。

 

String s1=new String("aaa");
String s2=new String("bbb");
s1.equals(s2);

s1与s2的类型相同并但内容不一样,此时equals方法返回值为false。

 

String s1=null;
String s2=new String("bbb");
s1.equals(s2);

返回false

使用方法以及注意事项

e.g.:

1).
int n1=10;
int n2=10;
n1==n2;

因为n1,n2是基本数据类型,并且数据值相等所以此时返回true。

2).
String s1="aaa";
String s2="aaa";
n1==n2;

由于字符串”aaa”创建时是在方法区的常量池中开辟的空间,并且下次使用时可以重复使用,s1,s2指向的地址是相同的,所以判等的结果是true

3).
Integer n1=new Integer(45);
Integer n2=new Integer(45);
n1==n2;

n1与n2分别在堆区开辟了空间,两个变量所指向的地址不同,即使指向地址中的内容相同,判等的结果也是为false。

 

3.finalize

finalize方法主要与java垃圾回收机制有关。

4.hashCode

  Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

 其主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。   这样解决了向含有大量数据的集合中添加元素时,大量频繁的操作equals方法的问题。

5.getClass()

java的getClass()方法利用的就是反射机制

6.notify与notifyAll

notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复,然后继续运行wait()后面的语句;只会唤醒等待该锁的其中一个线程。

notifyAll()方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从wait()方法后的语句开始运行; 唤醒等待该锁的所有线程。

对象内部锁

其实,每个对象都拥有两个池,分别为锁池(EntrySet)和(WaitSet)等待池。

锁池:假如已经有线程A获取到了锁,这时候又有线程B需要获取这把锁(比如需要调用synchronized修饰的方法或者需要执行synchronized修饰的代码块),由于该锁已经被占用,所以线程B只能等待这把锁,这时候线程B将会进入这把锁的锁池。
等待池:假设线程A获取到锁之后,由于一些条件的不满足(例如生产者消费者模式中生产者获取到锁,然后判断队列为满),此时需要调用对象锁的wait方法,那么线程A将放弃这把锁,并进入这把锁的等待池。
如果有其他线程调用了锁的notify方法,则会根据一定的算法从等待池中选取一个线程,将此线程放入锁池。
如果有其他线程调用了锁的notifyAll方法,则会将等待池中所有线程全部放入锁池,并争抢锁。

锁池与等待池的区别:等待池中的线程不能获取锁,而是需要被唤醒进入锁池,才有获取到锁的机会。