美文网首页
2018-07-12Java面试题(偏线程)

2018-07-12Java面试题(偏线程)

作者: 行者和他的钢笔 | 来源:发表于2018-09-18 08:41 被阅读9次

    4、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

    Java对于eqauls方法和hashCode方法是这样规定的:
    (1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
    (2)如果两个对象的hashCode相同,它们并不一定相同。

    hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

    哈希冲突:不同的键值对,哈希值相等

    hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。但是只有在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,这个方法才有用

    eqauls方法
    Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,此时定义的equals()方法的功能与“==”一样,都是根据地址判断是否是同一个对象。

    当我们对equals()方法进行重写之后,equals()方法的功能就是判断两个对象的内容是否相等。相等返回true

    “==”一直都是根据地址判断两个对象是否相等

    6、简诉synchronized和java.util.concurrent.locks下的Lock的异同?

    相同点:二者都可以实现线程同步
    不同点:
    (1)synchronized是Java语言的关键字,因此是内置特性。Lock是一个接口,通过这个接口的实现类可以实现线程同步;
    (2)用法不一样。synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象。而Lock需要显示地指定起始位置和终止位置。synchronzied是托管给jvm执行的,Lock锁定是通过代码实现的。
    (3)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生,但是如果获取到锁的线程阻塞之后其他线程会一直等待,性能不高。;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
    (4)Lock可以让等待锁的线程响应中断,通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。Lock可以提高多个线程进行读操作的效率。要比synchronized更加灵活。(Lock接口常用的实现类ReentrentLock和ReentrentReadWriteLock)

    相关文章

      网友评论

          本文标题:2018-07-12Java面试题(偏线程)

          本文链接:https://www.haomeiwen.com/subject/oykdpftx.html