Object方法

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

 

 

 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方法,则会将等待池中所有线程全部放入锁池,并争抢锁。

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

 

面试题:equals()与==区别

==比较的是两个对象的地址是否一样,equals重写比的是两个对象的内容是否一样。

1)对于==

如果作用于基本数据类型的变量,则直接比较其存储的值是否相等。

如果作用于引用数据类型的变量,则比较的是所指向的对象的地址。

2)对于equals方法,不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象。

如果没有重写equals方法,则比较的是引用类型的变量所指向的对象的地址;比如:String,Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

 

equals和hashcode

1.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;
    }

为什么重写equals还要重写hashcode?

1)效率:集合中采用重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数。

2)保证是同一个对象

如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

(1)相同的对象必须具有相等的哈希码。

(2)如果两个对象的hashcode相同,他们并不一定相同。

 

深拷贝与浅拷贝

浅拷贝:

1) 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。

2) 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值

3) 浅拷贝,使用默认的 clone()方法来实现

深拷贝:

1) 复制对象的所有基本数据类型的成员变量值

2) 为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象(包括对象的引用类型)进行拷贝

3) 深拷贝实现方式1:重写clone方法来实现深拷贝

4) 深拷贝实现方式2:通过对象序列化实现深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值