java.lang.Object是所有类的父类,默认继承,而且java.lang包下的所有类都由编译器自动导入,不需要显示import,因为用的多,提前加载可以提高运行时速度。
"=="与equals的区别要看equals是如何重写的,在Object中两者意义等同,都是判断引用地址是否相同。在String中equals比较的是内容。
//Objectpublic boolean equals(Object obj) { return (this == obj);}//Stringpublic boolean equals(Object anObject) { if (this == anObject) { return true; } return (anObject instanceof String aString) && (!COMPACT_STRINGS || this.coder == aString.coder) && StringLatin1.equals(value, aString.value);}public static boolean equals(byte[] value, byte[] other) { if (value.length == other.length) { for (int i = 0; i < value.length; i++) { if (value[i] != other[i]) { return false; } } return true; } return false;}
equals方法含义按需要重写,但需要满足Java规范:
(相关资料图)
在Java规范中,对equals方法的使用必须遵循以下几个原则:1)自反性。对于任何非空引用值x,x. equals(x)都应返回true。2)对称性。对于任何非空引用值x和y,当且仅当y. equals(x)返回true时,x.equals(y)才应返回true。3)传递性。对于任何非空引用值x、y和z,如果x. equals(y)返回true,并且y.equals(z)返回true,那么x. equals(z)应返回true。4)一致性。对于任何非空引用值x和y,多次调用x. equals(y)始终返回true或始终返回false,前提是对象上equals比较中所用的信息没有被修改。对于任何非空引用值x,x. equals(null)都应返回false。对于任何非空引用值x,x. equals(null)都应返回false。
hashCode是一个本地方法,用来加快equals比较,但两个不同对象的哈希值难免有冲突,hashCode和equals的关系如下:
如果equals返回true,则hashCode一定相等;如果equals返回false,则hashCode可能相等。也就是说如果hashCode不相等,那么equals一定不相等。注:Object中的hashCode方法返回的是对象的内存地址,有特殊要求可重写。
@IntrinsicCandidatepublic native int hashCode();
hashCode主要用于Map、Set等容器中,当向容器添加元素时需要去一个个比较是否有相等的元素,直接调用equals效率太慢。可以先比较hashCode,如果hashCode不一样则equals必然返回false,如果hashCode一样再调用equals比较。
wait方法也是Object类本地方法,一般用于synchronize代码块中,作用是释放锁并阻塞线程,唤醒方法是notify/notifyAll。
sleep方法是Thread类方法,调用了sleep0本地方法,作用是不释放锁但阻塞线程。
await方法是ConditionObject/ReentrantLock类的方法,作用是释放锁并阻塞线程,唤醒方法是signal/signalAll。
public final void wait() throws InterruptedException { wait(0L);}public final void wait(long timeoutMillis) throws InterruptedException { long comp = Blocker.begin(); try { wait0(timeoutMillis); } catch (InterruptedException e) { Thread thread = Thread.currentThread(); if (thread.isVirtual()) thread.getAndClearInterrupt(); throw e; } finally { Blocker.end(comp); }}// final modifier so method not in vtableprivate final native void wait0(long timeoutMillis) throws InterruptedException;public final void wait(long timeoutMillis, int nanos) throws InterruptedException { if (timeoutMillis < 0) { throw new IllegalArgumentException("timeoutMillis value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) { timeoutMillis++; } wait(timeoutMillis);}
public static void sleep(long millis) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (currentThread() instanceof VirtualThread vthread) { long nanos = MILLISECONDS.toNanos(millis); vthread.sleepNanos(nanos); return; } if (ThreadSleepEvent.isTurnedOn()) { ThreadSleepEvent event = new ThreadSleepEvent(); try { event.time = MILLISECONDS.toNanos(millis); event.begin(); sleep0(millis); } finally { event.commit(); } } else { sleep0(millis); }}private static native void sleep0(long millis) throws InterruptedException;
await具体细节请看Java多线程:条件变量
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); ConditionNode node = new ConditionNode(); int savedState = enableWait(node);//加入条件队列 LockSupport.setCurrentBlocker(this); // for back-compatibility,将AQS对象设置到thread中 boolean interrupted = false, cancelled = false, rejected = false; while (!canReacquire(node)) {//如果被唤醒进入同步队列后就可以跳出循环 if (interrupted |= Thread.interrupted()) { if (cancelled = (node.getAndUnsetStatus(COND) & COND) != 0) break; // else interrupted after signal } else if ((node.status & COND) != 0) { try { if (rejected) node.block(); else ForkJoinPool.managedBlock(node);//阻塞线程,最终会调用LockSupport.park() } catch (RejectedExecutionException ex) { rejected = true; } catch (InterruptedException ie) { interrupted = true; } } else Thread.onSpinWait(); // awoke while enqueuing }//被唤醒 LockSupport.setCurrentBlocker(null); node.clearStatus();////lock.lock()方法:acquire(null, arg, false, false, false, 0L);//重新获取锁时已原来的savedState acquire(node, savedState, false, false, false, 0L);//重新获取锁,此时该节点已经进入了同步队列,有可能直接tryAcquire成功跳出循环,也可能需要两次循环修改node.status为WAITING、park。 if (interrupted) { if (cancelled) { unlinkCancelledWaiters(node); throw new InterruptedException(); } Thread.currentThread().interrupt(); }}
public class Object { @IntrinsicCandidate public Object() {} @IntrinsicCandidate public final native Class> getClass();//返回类对象用于反射 @IntrinsicCandidate public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } @IntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } @IntrinsicCandidate public final native void notify(); @IntrinsicCandidate public final native void notifyAll(); public final void wait() throws InterruptedException { wait(0L); } public final void wait(long timeoutMillis) throws InterruptedException { long comp = Blocker.begin(); try { wait0(timeoutMillis); } catch (InterruptedException e) { Thread thread = Thread.currentThread(); if (thread.isVirtual()) thread.getAndClearInterrupt(); throw e; } finally { Blocker.end(comp); } } // final modifier so method not in vtable private final native void wait0(long timeoutMillis) throws InterruptedException; public final void wait(long timeoutMillis, int nanos) throws InterruptedException { if (timeoutMillis < 0) { throw new IllegalArgumentException("timeoutMillis value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) { timeoutMillis++; } wait(timeoutMillis); } @Deprecated(since="9", forRemoval=true) protected void finalize() throws Throwable { }}
标签: Java JavaScript
java lang Object是所有类的父类,默认继承,而且java lang包下的所有类都由编译器自动导入,不需要...
05月13日迪庆前往宜春出行防疫轨迹疫情政策汇总(数据来源:本地宝)1、出迪庆-:此地区暂无特殊疫情防...
水压测试引发水情,电梯瞬间成“水帘洞”,管理处连夜抢修
这是国乒第一次在队内直通赛中增设混双,从阵容来看,该项目竞争激烈,除了林高远 陈幸同,还有马龙 ...
如果单个网址打不开,建议更换时间段再尝试;或者更换网络再试试(可以数据网和无线网互换);或者更换手机...
1月10日,沪深两市全天成交额合计7472亿元,较上一交易日缩量600亿元。其中,沪市成交额3106亿元,深市成交额43
1、茂化水库位于珠江流域淦江支流白马河上游。2、是玉林地区第一座水冲坝水库。本文到此分享完毕,希望...
1、这样的专业只有综合性大学能开设。2、因为这个专业是综合性非常强的,各个方面都有涉及,但都不深入...
1、第一种标准尺寸为上床90cm×190cm;下床120cm×190cm;第二种上床90cm×190cm;下床150cm
亿华通官微2月22日消息,亿华通M180氢燃料电池发动机发布。M180发动机是亿华通基于最新一代产品平台优势...
随便记一下,既不是医生,也不是程序员,但是我脑海中突然闪出一个画面,老中医和神经网络坐在一起,交...
温情!阿贾克斯球员进球脱衣纪念地震遇难阿特苏,主裁拒绝出示黄牌,足球,荷甲,纪念,阿特苏,阿贾克斯,切尔西队
欢迎观看本篇文章,小升来为大家解答以上问题。hit什么意思,hit的短语搭配很多人还不知道,现在让我们...
“明日见奏大,我便是你。”无数个虚幻的夜晚之中,他不断的试图也德凯联系。他无数次希望得到一次确认...
酷跑小哥怎么下载?想要比别人更加抢先抢快的玩到这款游戏,那么你获取游戏开测消息是关键,能够获取到...
1、下面是边肖为大家带来的蓝牙键盘防水方法。希望能给你带来一些帮助。感谢您的观看。2、用不锋利的东...
2月21日,市场监管总局官网公布2月6日-2月12日无条件批准经营者集中案件列表,其中包括浙江新和成股份有...
一年好味始于春眼下正值品尝春菜的好时节日前,CCTV-2央视财经频道把镜头对准了马桥人的餐桌——在2月17...
1、包皮环切术后拆纱时间根据术后切口愈合情况决定。2、一般包皮环切术后第二天给患者进行第一次换药,...
国泰君安2月21日研报指出,复盘2022年,美妆板块核心逻辑转为格局优化,国货龙头在竞争中突围走强,行业...
X 关闭
X 关闭