Java中equals和==的区别:
- ==:比较的是内存值。如果两边是基本数据类型,直接比较值是否相等;如果两边是对象变量,则比较变量存储的内存地址是否相等。
- equals:在Object类中被定义,默认实现是使用“==”来比较对象地址。但子类可以重写equals方法,实现基于对象内容(值)的比较。例如,String类就重写了equals方法,用于比较字符串内容是否相同。
延伸问题1的答案:
- 127 == new Integer(127):true。因为127是基本数据类型,new Integer(127)是对象,但在比较时会先拆箱为基本数据类型,所以比较的是值。
- new Integer(127) == new Integer(127):false。因为new关键字会创建新的对象,所以比较的是两个不同对象的内存地址。
- Integer.valueOf(127) == Integer.valueOf(127):true。因为Integer.valueOf()方法对于-128到127之间的值会使用缓存,所以返回的是同一个对象。
延伸问题2的答案:Java中的基本数据类型及其占用的字节数如下:
- int:4字节
- long:8字节
- float:4字节
- double:8字节
- char:2字节
- boolean:1字节(但JVM实现时可能不严格遵守)
- byte:1字节
- short:2字节
- void:不是数据类型,不占用字节
延伸问题3的答案:拆箱/装箱是Java中的自动类型转换机制,编译器会在以下情况下自动进行:
- 进行=赋值操作时(装箱或拆箱)
- 进行+、-、*、/混合运算时(拆箱)
- 进行>、<、==比较运算时(拆箱)
- 调用equals进行比较时(装箱)
- ArrayList、HashMap等集合类添加基本类型数据时(装箱)
这些机制使得Java代码在处理基本数据类型和其包装类时更加灵活和方便。