当前位置: 首页 > news >正文

网站建设运营链接网

网站建设运营,链接网,dart语言做的网站,网站图片添加alt标签剖析equals方法 1、对于Object来说,其equals()方法底层实现就是"",都是比较对象的引用是否相等,下为JDK源码。 Object c 1; Object d 1; boolean equals c.equals(d);public boolean equals(Object obj) {return (this obj);…

剖析equals方法

1、对于Object来说,其equals()方法底层实现就是"==",都是比较对象的引用是否相等,下为JDK源码。

Object c = 1;
Object d = 1;
boolean equals = c.equals(d);public boolean equals(Object obj) {return (this == obj);
}

2、在JDK中其他类中通常会重写equals()方法,例如:Integer、String,源码如下。

Integer会先将Integer对象转换成基础类型int值来比较,所以此时就不再是比较两个对象引用,是比较两个对象的值是否相等。

Integer a = 1;
Integer b = 1;
boolean equals = a.equals(b);public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;
}@Override
public int hashCode() {return Integer.hashCode(value); // 由于 Integer 是不可变类,其 hashCode 就是整数值本身。
}

 String和Integer一样,引用比较重写成了值比较了。

String a = "a";
String b = "a";
boolean equals = a.equals(b);public boolean equals(Object anObject) {if (this == anObject) {return true; // 引用相同返回 true,引用相同,那么值肯定相同了}return (anObject instanceof String aString)&& (!COMPACT_STRINGS || this.coder == aString.coder)&& StringLatin1.equals(value, aString.value); // equals 为下面的 equals 方法
}@IntrinsicCandidate
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;
}// JDK17
public int hashCode() {int h = hash;  // 缓存的 hash 值if (h == 0 && !hashIsZero) {h = isLatin1() ? StringLatin1.hashCode(value): StringUTF16.hashCode(value);if (h == 0) {hashIsZero = true; // 标记 hashCode 为 0 的情况} else {hash = h; // 缓存 hashCode}}return h;
}static int hashCode(byte[] value) {int h = 0;for (int i = 0; i < value.length; i++) {h = 31 * h + (value[i] & 0xff);}return h;
}static int hashCode(byte[] value) {int h = 0;for (int i = 0; i < value.length; i += 2) {h = 31 * h + getChar(value, i);}return h;
}static char getChar(byte[] val, int index) {return (char) (((val[index] & 0xff) << 8) | (val[index + 1] & 0xff));
}

 JDK17对String的hashcode()方法与早期版本相比进行了优化,主要是为了更好地适应 String 的内部存储机制的变化以及性能提升。从 JDK9开始,String 使用了一种称为 Compact Strings 的机制。即:String 内部不再总是使用 char[] 存储,而是根据字符内容选择 byte[] 存储。如果所有字符是 Latin-1(单字节字符,0~255),则使用 byte[],以节省内存。如果有非 Latin-1 字符(需要双字节存储),则仍使用 UTF-16 编码。

1、hash:用于缓存计算过的 hashCode,避免重复计算。

2、hashIsZero:标志变量,处理特殊情况:

  • 如果字符串的 hashCode 计算结果为 0,会将 hashIsZero 标记为 true,防止后续重复计算。
  • 区分未计算和计算后结果为 0 的情况。
  • isLatin1():判断字符串是否为 Latin-1 编码。
    • 如果是 Latin-1,则调用 StringLatin1.hashCode(value)
      • Latin-1 的 hashCodeStringLatin1.hashCode): 遍历 byte[] 数组,使用与原始实现相同的算法(31 为乘数)。
    • 否则调用 StringUTF16.hashCode(value)
      • UTF-16 的 hashCodeStringUTF16.hashCode): 遍历 byte[] 数组(每两个字节表示一个 char),计算哈希值。

JDK17的优点

支持 Compact Strings

  • 根据字符编码选择不同的计算方式,提高内存效率和性能。

性能优化

  • 使用 hashIsZero 减少重复计算。
  • 针对 Latin-1 和 UTF-16 分开处理,减少不必要的判断和操作。

兼容性

  • 虽然内部实现发生了变化,但对外部来说行为与早期版本保持一致。

同时上述说了重写equals()方法,还需要重写hashCode 方法。

根据 Object 类的规范:

如果两个对象根据 equals 方法比较是相等的,那么它们的 hashCode 值也必须相等。

原因:

如果只重写了 equals 而没有重写 hashCode,会导致在使用哈希表(如 HashMapHashSet)时出现问题,因为这些集合依赖于对象的 hashCode 值来确定存储位置。

http://www.tj-hxxt.cn/news/4476.html

相关文章:

  • 网站建设 在电商的作用网络营销的实现方式有哪些
  • 服装网站建设的需求百度推广代理商赚钱吗
  • 个人网站设计作品展示网站软文是什么
  • 黄岩做网站武汉百度推广多少钱
  • 代理记账网站怎么做产品推广计划方案
  • 做赌博网站刷单违法吗2023年10月疫情恢复
  • 做阿里巴巴英文网站seo站群优化
  • 政府网站建设 价格qq群推广引流免费网站
  • 江苏网站备案流程论坛推广平台有哪些
  • 做美剧网站侵权百度seo收录软件
  • 建设网站com百度医生
  • 服务公司税率网站关键词怎样优化
  • 动态网站开发投票源码网络营销企业培训
  • 网站彩票代理怎么做网店如何推广
  • 特种作业人员证网上查询seo是啥软件
  • 山东安康建设项目管理有限公司网站外链图片
  • 微商手机网站制作23岁老牌网站
  • 济南做网站优化价格免费网站建站2773
  • 网站的友情链接怎么做制造企业网站建设
  • 免费自助建站系统哪个好深圳百度推广客服电话多少
  • asp网站作业下载淘宝关键词指数
  • 微商城手机网站模板淘宝seo优化
  • 佛山龙江做网站的深圳靠谱网站建设公司
  • 网站建设实训的意义网站推广优化业务
  • 网站建设的方式有哪些方面b2b网站免费推广
  • 建设田达摩托车官方网站seo推广软件费用
  • 专业找工作网站下载网络营销策划书5000字
  • 十大效果图网站大数据比较好的培训机构
  • qq邮箱做网站百度竞价推广方法
  • 效果型网站深圳网络营销全网推广