JAVA面试中,面试官最爱问的问题。

 3 * 0.1 == 0.3将会返回什么?true还是false?

在Java中,表达式 `3 * 0.1 == 0.3` 将返回 `false`。

原因在于浮点数(如 `double` 和 `float` 类型)在计算机中的表示方式。浮点数使用二进制浮点数近似表示十进制小数,这可能导致一些十进制小数无法被精确表示。因此,即使看起来简单的计算,如 `0.1` 的乘法,也可能会产生不是完全精确的结果。

### 示例解释:
```java
double result = 3 * 0.1; // 实际结果可能不是精确的0.3
boolean isEqualToZeroThree = result == 0.3; // 通常返回false
```

在这个示例中,`3 * 0.1` 的计算结果存储在 `double` 类型的变量 `result` 中。由于浮点数的表示限制,`result` 的值可能非常接近 `0.3`,但不等于 `0.3`。当你使用 `==` 操作符比较 `result` 和 `0.3` 时,由于这两个值实际上有微小的差异,比较将返回 `false`。

### 正确的比较方式:
要正确比较两个浮点数是否“足够接近”,可以使用一个小的阈值(epsilon)来检查它们之间的差异是否在可接受的误差范围内:

```java
double result = 3 * 0.1;
boolean areAlmostEqual = Math.abs(result - 0.3) < 0.0001; // 通常返回true
```

在这个示例中,`areAlmostEqual` 将检查 `result` 和 `0.3` 之间的绝对差是否小于一个小的阈值(如 `0.0001`)。如果差异很小,那么可以认为这两个数是“几乎相等”的。

总结来说,由于浮点数的精度限制,直接使用 `==` 操作符比较两个浮点数是否相等通常不是一个好的做法。相反,应该使用一个小的阈值来确定两个浮点数是否足够接近。

int和Integer哪个会占用更多的内存?

在Java中,`int` 是一个原始数据类型,而 `Integer` 是一个包装类。它们在内存占用上有所不同:

1. **int**:`int` 类型是一个32位的原始数据类型,它直接存储数值,不包含任何额外的对象信息。因此,一个 `int` 类型的变量在内存中占用的字节大小是固定的,通常是32位,即4个字节。

2. **Integer**:`Integer` 类型是Java为 `int` 类型提供的包装类。`Integer` 对象实际上是一个对象实例,它除了存储 `int` 值之外,还包括对象头信息(如对象的哈希码、GC信息、锁信息等)。一个 `Integer` 对象在内存中占用的字节大小不是固定的,因为Java对象的内存布局包括了额外的开销。在32位和64位的JVM实现中,一个 `Integer` 对象通常占用至少16到24个字节,具体取决于JVM的实现和平台。

此外,由于 `Integer` 是一个对象,它可以利用Java的面向对象的特性,如继承、多态等。而且,`Integer` 类型可以用于泛型编程,可以作为集合的元素等,而原始类型 `int` 则不能。

在Java中,为了优化 `Integer` 对象的存储,还引入了**自动装箱**和**拆箱**机制,以及**缓存机制**(`Integer.valueOf(int)` 方法会缓存从 `-128` 到 `127` 范围内的 `Integer` 对象)。这意味着在一定范围内的 `Integer` 对象可能会共享相同的实例,从而节省内存。

总结来说,`Integer` 对象会占用比 `int` 更多的内存,因为它包括了对象的额外开销。然而,在实际编程中,选择使用 `int` 还是 `Integer` 应根据具体需求和上下文来决定,考虑到性能、内存使用、代码的可读性和可维护性等因素。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值