==

  • == 比较的是什么 ?
    • 对于基础类型 比较值
    • 对于包装类 比较内存地址
  • String 是否可以用 == 比较 ?
    • 不可以,要使用 equals 比较, equals 先比较内存地址,在比较值
  • String 为什么要重写
    • Object 类 只是比较了内存地址,不够准确,
    • new String 对象开辟了新的堆内存,“”对象存放在常量池中,所以内存地址不一样,值相同
  • 基础类型和包装类用什么比较 ?
    • 基础类型在前只能使用 ==
    • 包装类在前两者皆可使用, Java 1.5 以后引入了自动拆箱装箱操作
      • == 包装类自动拆箱 ex intValue(),equals 触发自动装箱 ex valueOf()
      • 当 “==” 运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。
  • 两个包装类之间使用什么比较 ?
    • 使用 equals 方法比较, 使用 == 比较的时候会去比较是否同一个对象,常量池之外的数不是同一个对象
  • 包装类的常量池是多少 ?
    • 除了 boolean 类型是 true 和 false
    • 其余都是 [-128,127]

equals

  • equals 比较的是什么 ?
    • Object 类 比较的其实就是 ==
    • 不过对象一般都会重写 equals 方法
  • 为什么要重写 equals 方法 ?
    • 比较内存地址不够准确 比如 String 需要比较值是否相同,new String 和 常量池对象
  • String new 对象和直接”” 区别 ?
    • new String 开辟了新的堆内存
    • “” 存放在常量池中
    • 两者不是同一个内存对象
  • 重写 equals 方法为什么要重写 hashcode ?
    • Effective Java 第三版中所提到的
      • 每个覆盖了 equals 方法的类中,必须覆盖 hashCode。如果不这么做,就违背了 hashCode 的通用约定,也就是上面注释中所说的。进而导致该类无法结合所以与散列的集合一起正常运作,这里指的是 HashMap、HashSet、HashTable、ConcurrentHashMap。
    • 无论是 Effective Java,还是阿里巴巴Java规范手册都是要求重写 equals,必须重写 hashCode。
    • 两个相等的对象必须具有相等的散列码(Java 关键约定)

问题引申

  • 什么是堆内存 ?
  • hashcode 和 hashMap 的关系 ?
  • 什么是 hashcode ?
    • hashCode () 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

hashCode () 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode () 函数。
虽然,每个 Java 类都包含 hashCode () 函数。但是,仅仅当创建并某个 “类的散列表”(关于 “散列表” 见下面说明) 时,该类的 hashCode () 才有用 (作用是:确定该类的每一个对象在散列表中的位置;其它情况下 (例如,创建类的单个对象,或者创建类的对象数组等等),类的 hashCode () 没有作用。
上面的散列表,指的是:Java 集合中本质是散列表的类,如 HashMap,Hashtable,HashSet。
也就是说:hashCode () 在散列表中才有用,在其它情况下没用。在散列表中 hashCode () 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。