==
- == 比较的是什么 ?
- 对于基础类型 比较值
- 对于包装类 比较内存地址
- 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 关键约定)
- Effective Java 第三版中所提到的
问题引申
- 什么是堆内存 ?
- hashcode 和 hashMap 的关系 ?
- 什么是 hashcode ?
- hashCode () 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode () 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode () 函数。
虽然,每个 Java 类都包含 hashCode () 函数。但是,仅仅当创建并某个 “类的散列表”(关于 “散列表” 见下面说明) 时,该类的 hashCode () 才有用 (作用是:确定该类的每一个对象在散列表中的位置;其它情况下 (例如,创建类的单个对象,或者创建类的对象数组等等),类的 hashCode () 没有作用。
上面的散列表,指的是:Java 集合中本质是散列表的类,如 HashMap,Hashtable,HashSet。
也就是说:hashCode () 在散列表中才有用,在其它情况下没用。在散列表中 hashCode () 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。