原始类型与原始类型打包的原始类型
主要区别
身份与身份价值:
原语:它们没有身份;具有相同值的两个基元始终相等。
打包:它们是对象,有身份;两个对象可以具有相同的值但不同的标识。
空值:
基元: 始终有一个默认值(例如,int 为 0)。
打包:可能为null,如果处理不当可能会导致NullPointerException异常。
表现:
原语:在时间和空间上更高效。
打包: 由于创建额外对象而引入开销。
混合基元和包时的常见问题
有问题的示例:
Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
问题: i == j 比较比较引用,而不是值。
不正确的行为:naturalOrder.compare(new Integer(42), new Integer(42)) 返回 1 而不是 0。
解决方案:
使用 Integer 类的 CompareTo 方法或实用方法。
Comparator<Integer> naturalOrder = Integer::compare;
或者,纠正原始比较器:
Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> { int i = iBoxed; int j = jBoxed; return (i < j) ? -1 : ((i == j) ? 0 : 1); };
2。自动拆箱和 NullPointerException
当使用可以为 null 的打包类型时,如果对象为 null,自动拆箱可能会引发异常。
有问题的示例:
Integer i = null; if (i == 42) { System.out.println("Inacreditável"); }
问题: i 为空;与 42 比较时,会发生 null 自动拆箱,导致 NullPointerException。
解决方案:尽可能使用原始类型。
int i = 0; if (i == 42) { System.out.println("Inacreditável"); }
3。由于自动装箱/拆箱而导致性能下降
在密集型操作中无意中使用包装类型可能会由于自动装箱和不必要的对象创建而导致性能下降。
有问题的示例:
Long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum);
问题: sum 是一个压缩的 Long;在每次迭代中,都会发生自动装箱/拆箱。
影响:代码速度变慢并且内存使用过多。
解决方案:
在密集操作中对局部变量使用原始类型。
long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum);
何时使用封装类型
良好实践
总结
原始类型:
更简单、更快。
它们不能为空。
他们没有身份(只有价值)。
包装类型:
在集合和通用 API 中使用时需要。
它们可以为空。
他们有对象身份。
以上是Item 更喜欢原始类型而不是打包的原始类型的详细内容。更多信息请关注PHP中文网其他相关文章!