尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

所有类都有的方法

所有类都有的方法 Object类是所有类的父类因此所有类都继承Object类的方法1. equals() 方法逻辑相等性2. hashCode() 方法哈希散列值hashCode()返回对象的哈希码int值主要用于哈希表数据结构如HashMap、HashSet中快速定位对象。核心契约一致性在程序同一执行期间若对象属性未变多次调用hashCode()必须返回相同的整数。等价性如果a.equals(b)为true则a.hashCode() b.hashCode()必须成立。不等价性非强制如果a.equals(b)为falsehashCode()不必不同。但分散的哈希值能提升哈希表性能。3. 为什么重写 equals() 必须重写 hashCode()这是一个经典陷阱。核心原因在于破坏哈希表的契约。以HashSet为例存储时先计算对象的hashCode()定位到桶数组索引若桶中无元素则直接存入若有元素再通过equals()比较是否重复。查找时同样先通过hashCode()定位再通过equals()确认。如果只重写equals()而不重写hashCode()obj1和obj2在逻辑上相等equals返回true。但它们的hashCode()不同因为默认返回内存地址映射。存入HashMap时两个对象会被分配到不同的桶中导致集合中同时存在两个“逻辑相同”的对象违反Set的唯一性且无法通过obj1查找出obj2。重要结论两个不同对象的hashCode()有极小概率相同哈希碰撞。如果hashCode()不同则两个对象一定不相等利用这一点可快速排除不等对象。4. HashMap 底层结构简述理解hashCode与equals的协作离不开对HashMap结构的认知数组NodeK,V[] table作为哈希桶通过(n - 1) hash计算索引定位。链表当发生哈希碰撞时新节点以链表形式挂在数组同一索引下。红黑树JDK 1.8当链表长度超过阈值默认8且数组长度大于64时链表转为红黑树将查找复杂度从 O(n) 优化至 O(log n)。查找流程计算key.hashCode()定位桶。若桶内无节点返回null。若桶内有节点通过equals()在链表/树中查找匹配的键。5. toString() 方法对象的字符串表示toString()方法本身返回的是地址输出一个对象默认调用toString()方法输出对象所属类型和内存地址可以重写toString()方法6.getClass() 方法——运行时类信息getClass()是Object类中一个非常重要的方法它返回当前对象的运行时类信息。获取运行时类型返回的是对象实际的Class对象而不是引用声明的类型。Object obj new String(Hello); System.out.println(obj.getClass()); // class java.lang.String System.out.println(obj.getClass().getName()); // java.lang.Stringfinal 方法不可重写由 JVM 原生实现保证所有对象都能获取到准确的类信息。与反射机制紧密相关通过Class对象可以获取类的构造器、方法、字段等信息是实现反射的入口。Class? clazz obj.getClass(); Method[] methods clazz.getDeclaredMethods(); // 获取所有方法7. 线程协作wait() / notify() / notifyAll()这三个方法属于Object类因为它们操作的是对象监视器锁。7.1notify()和notifyAll()方法当一个线程调用wait()进入等待状态会让出CPU不参与竞争调用notify()唤醒等待的线程notifyAll()唤醒全部线程7.2wait()方法wait() 与 sleep() 的核心区别特性wait()sleep()所属类Object类Thread类锁要求必须在同步块/同步方法中持有锁不需要持有锁锁释放释放当前对象锁不释放任何锁唤醒方式需由notify()/notifyAll()唤醒或超时自动唤醒时间到期自动唤醒或interrupt()中断使用场景线程间通信生产者-消费者模式让线程暂停执行一段时间
返回列表