这些Object类的常见面试题,你了解吗?

更新时间:2023-07-25 16:00:31 阅读: 评论:0

这些Object类的常见⾯试题,你了解吗?
Java基础:Object类⾯试点
1. 为什么线程通信的⽅法wait()、notify()、notifyAll()被定义在Object类⾥⾯?⽽不能定义在Thread类中?
因为Java中每个对象都有⼀把称之为monitor(监视器)的锁,由于每个对象都可以上锁,这就要求在对象头中有⼀个⽤来保存锁信息的位置。这个锁是对象级别的,⽽不是线程级别的,wait()/notify()/notifyAll()也都是锁级别的操作,它们的锁属于对象,所以把它们定义在Object类中最合适。因为Object类是所有对象的⽗类,也就是说所有的对象都可以成为⼀个锁对象,所以
synchronized是保证只有⼀个对象能在同⼀时刻获得锁的⼀种机制。
⽽把wait()/notify()/notifyAll()⽅法定义在Thread类中,会带来很⼤的局限性,⽐如⼀个线程可能持有多把锁,以便实现相互配合的复杂逻辑,假设此时wait ⽅法定义在Thread 类中,如何实现让⼀个线程持有多把锁呢?⼜如何明确线程等待的是哪把锁呢?
没有办法灵活的实现这样的多锁逻辑,也会增加编程难度。
2. 为什么wait(), notify()和notifyAll()必须在同步⽅法或者同步块中被调⽤?
(1)在同步⽅法或者同步块中被调⽤就不会抛出java.lang.IllegalMonitorStateException的异常。
(2)避免wait()和notify(),notifyAll()之间产⽣竞态条件。
(3)wait()是让线程等待并将锁释放出来,让给期限线程使⽤;notify(),notifyAll()是该线程在使⽤完锁后,通知其他线程可以获取锁继续执⾏下去。notify()是唤醒其中⼀个线程,notifyAll()是唤醒全部线程使其争抢。
(4)当⼀个线程需要调⽤对象的wait()⽅法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进⼊等待状态直到其他线程调⽤这个对象上的notify()⽅法。同样的,当⼀个线程需要调⽤对象的notify()⽅法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些⽅法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步⽅法或者同步块中被调⽤。
individuals
3.wait()⽅法与sleep()⽅法的区别
眼线笔怎么削
4.hashCode()和equals()的关系
hashCode()⽅法的作⽤是获取哈希码,也称为散列码,返回⼀个int整数。这个哈希码的作⽤是确定该对象在哈希表中的索引位置。
equals()⽅法的作⽤就是判断两个对象是否相等,再Object类中是通过判断对象间的内存地址来决定是否相同。
hashCode()主要⽤于提升查询效率提⾼哈希表性能,来确定在散列结构中对象的存储地址,在线性表中没有作⽤。
重写equals()必须重写hashCode();
若两个对象equals()⽐较返回true,那么它们的hashCode值⼀定也相同;
若两个对象equals()⽐较返回fal,那么它们的hashCode值⼀定不相同;
用醋洗脸可以美白吗
如果两个对象的HashCode值相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同⼀个位置。
同⼀对象在执⾏期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。
5.== 与 equals()的区别
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为⼀个引⽤
String b = new String("ab"); // b为另⼀个引⽤,对象的内容⼀样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // fal,⾮同⼀对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
六级 成绩
}outlander
}
}
复制代码
研究生考试科目
6.重写equals()⽅法时通常为什么也要重写⼀下hashCode()⽅法?
-String类的源码:
public boolean equals(Object anObject) {chj
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == unt) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offt;
int j = anotherString.offt;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return fal;
英语四六级准考证号
}
return true;
说明书英文}
}
return fal;
}
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offt;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
pyramid是什么意思}
return h;
}
复制代码
Object类提供的equals()⽅法默认是⽤ == 来进⾏⽐较的,也就是说只有两个对象是同⼀个对象时,才能返回相等的结果。⽽实际的业务中,我们通常的需求是,若两个不同的对象它们的内容是相同的,就认为它们相等。鉴于这种情况,Object类中equals()⽅法的默认实现是没有实⽤价值的,所以通常都要重写。

本文发布于:2023-07-25 16:00:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1116644.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   线程   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图