`
zhanshi258
  • 浏览: 47902 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

String 比较以及hashcode 总结

    博客分类:
  • Java
阅读更多
 
关于“==”
 
      Java中当“==”匹配时,其实就是比较两个内存单元的内容是否一样。
如果是原始类型如byte、short、boolean、int等,就是直接比较它们的值,这个大家应该都懂。
如果是引用,比较的就是引用的值。即比较两个对象的地址是否一样,换句话说,如果两个引用所保存的对象是同一对象,则认为它们相等,否则返回false。
 
关于equals()
 
      equals()方法,首先是Object类中被定义的,它的定义中就是使用“==”方式来匹配的。如果不重新equals()方法,且其父类也不重写equals()方法,则默认equals()操作就是对比对象的地址。String有点特殊,它本身就实现了equals()方法。
 
迷惑:equals()重写之后,一般会重写hashCode()方法吗?
 
       首先我们要知道,Java中的hashCode是什么? hashCode()方法提供了对象的hashCode值,它与equals()一样在Object类中提供,不过它是一个native(本地)方法。通常情况下,这个值是对象头部的一部分二进制位组成的数字,这个对象具有一定的标识对象的意义存在,但绝不等价于地址。
       hashCode的作用--它为了产生一个可以标识对象的数字,不管多么复杂的对象都可以用一个数字来标识。为什么需要数字来标识呢? 因为这有利于快速查找。
hashCode只能说是标识对象,因此在Hash算法中可以将对象相对离散开,这样可以在查找数据的时候根据这个key快速的缩小数据范围。但不能说hashCode值一定是唯一的,所以在Hash算法中定位到具体的链表后,需要进一步循环链表,任何通过equals方法来对比Key的值是否一样。这时候hashCode和equalse似乎就成了天生的一对。
       总结:它们一个是为了算法快速定位数据而存在的,一个是为了对比真实值而存在的。可以说hashCode与两个对象是否一致一点关系都没有。
       换个角度来讲,如果两个对象(不是String)之间判定出来hashCode不一样,也不能说它们的值不一样,有可能equalse()匹配的是一个综合值,与hashCode一点关系没有。至于equals()内部要怎么去对比,可以自己根据实际情况去优化。
 
编译时优化方案:能提前做的事情就提前做
 
String a = "a"+"b"+1;
String b = "ab1";
System.out.println(a==b);  
       答案:true
       在a中,因为都是常量,编译时期就能确定,所以在编译时,就将a编译成"ab1"。
       编译器优化一定是在编译阶段能确定优化后不会影响整体功能,类似于final引用,这个引用只能赋值一次,但无法确定赋值的内容是什么。只有编译阶段能确定赋值的内容,编译器才能进行编译时优化。
       在编译阶段能确定的内容只能来自于常量池中,例如String、long、int等常量,当然不包括new String();new Integer();这样的操作,因为这是运行时决定的,也不包括返回值、变量等。因为不确定。
    如:
String a = "a";
String b = a + "b";
String c = "ab";
System.out.println(b==c);  
    答案:false
 
事情没绝对,还得看场景
 
       有人认为StringBuilder.append()比String "+" 要快。其实String "+" 内部也是进行StringBuilder.append()操作, 它本身是不慢的,而是大循环中大量的内存使用,使得它的内存开销变大,导致了系统频繁GC,而且是更多的FULL GC,效率才会急剧下降。 如果是编译时就能确定的值,String "+" 还是要更快的。

 

0
0
分享到:
评论
2 楼 zhanshi258 2015-07-01  
丹尼尔 写道
第二个例子不应该是“b==c”嘛?


尼玛  还真是,已改
1 楼 丹尼尔 2015-06-29  
第二个例子不应该是“b==c”嘛?

相关推荐

    hashcode的作用

    private String attribute1; private int attribute2; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((attribute1 == null) ? 0 : attribute1....

    hashCode的作用

    总结 综上所述,`hashCode`方法在Java编程中扮演着非常重要的角色。它不仅能够提高查找效率,还在集合框架中发挥着核心作用。正确地实现`hashCode`方法和与其相匹配的`equals`方法对于确保程序的正确性和性能至关...

    java中hashcode()和equals()方法详解

    - 相反,如果两个对象的`hashCode()`值相同,并不能保证这两个对象通过`equals()`方法比较也是相等的。这是因为可能存在不同的对象具有相同的哈希值,这种情况称为哈希冲突。 - 为了避免哈希冲突带来的性能问题,在...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    ### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    例如,在String类中hashCode方法的实现如下所示: public int hashCode() { int h = 0; for (int i = 0; i ; i++) { h = 31 * h + value[i]; } return h; } 三、ArrayList、Vector和LinkedList ArrayList、...

    hashcode使用方法

    `hashCode` 方法返回的是一个整数,这个整数是对象的一个哈希码(hash code),用于快速比较两个对象是否相等。当两个对象通过 `equals` 方法被判断为相等时,它们的 `hashCode` 必须也相等。但是,即使两个对象的 `...

    java中hashcode()和equals()的详解.docx

    本文将详细介绍这两个方法的工作原理、使用场景以及在Java集合框架中的作用。 #### `hashCode()`方法浅析 `hashCode()`方法是`Object`类中的一个方法,用于生成对象的哈希码。这个哈希码通常是一个整数值,用来表示...

    set接口经常用的hashCode和equals方法详解

    - **性能考虑**: 为了提高性能,只有当两个对象的`hashCode`相同的情况下,才会调用`equals`方法进行深度比较。 - **一致性要求**: `equals`方法需要满足对称性、反射性、传递性和一致性等性质,以确保集合操作的...

    java面试题集锦.pdf

    本文将对 Java 面试题集锦中的知识点进行详细的解释和总结,涵盖了 Java 基础、Java 工具包、对象比较、hashCode 和 equals 等方面的知识点。 一、Java 基础 1. JDK 和 JRE 的区别 JDK(Java Development Kit)是...

    javahashcode()和equals()和==的介绍和区别.pdf

    总结来说,`hashCode()`是用于快速定位对象的哈希值,`equals()`是用于比较对象内容的平等性,而`==`则用于比较对象引用。在使用自定义对象时,理解并正确实现这些方法对于优化数据结构的性能至关重要。特别是在使用...

    Java 最常见面试题总结.pdf

    **总结**:`==`通常用于基本类型的值比较或引用类型的引用比较,而`equals`方法默认是引用比较,但在许多情况下(如`String`类),它被重写以实现值比较。 #### 3. hashCode()相同是否意味着equals()也为真? - **...

    定义hashcode时使用31系数的原因

    本文将详细介绍为什么在定义hashcode时使用31系数的原因,以及相关的知识点。 首先,需要了解为什么需要hashcode。在Java中,每个对象都有一个默认的hashcode,但是这个默认的hashcode是无法满足实际需求的。因此,...

    why在重写equals时还必须重写hashcode方法分享

    例如,`String` 类就重写了 `equals()`,比较两个字符串的字符序列是否相同。 接着,我们看 `hashCode()` 方法。这个方法返回一个整数,代表对象的哈希码,它通常基于对象的内容计算。哈希码的目的是快速定位对象,...

    Java面试题及答案-共33道.docx

    JDK 和 JRE 是 Java 开发和运行的必要环境,== 和 equals 是 Java 中两个常用的比较运算符,hashCode() 和 equals() 的关系是必要条件而不是充分条件。只有掌握了这些知识点,Java 开发者才能更好地开发和调试 Java ...

    Java 33道面试题及答案.docx

    总结:== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是...

    常见面试题.docx

    **总结**:两个对象的 `hashCode()` 相同并不意味着它们通过 `equals()` 方法比较后一定相等。实际上,这取决于具体的实现以及 `equals()` 和 `hashCode()` 方法的正确重写。为了确保一致性,当重写 `equals()` 方法...

    Java核心知识总结-笔记

    【Java核心知识总结-笔记】 JavaSE高级部分的讲解涵盖了重要的String类、集合以及IO流。String类在Java中扮演着至关重要的角色,因为它是最常用的数据类型之一,用于存储和处理文本信息。以下是对String类的详细...

Global site tag (gtag.js) - Google Analytics