IIWAB Java 中 Integer 与 Long 的缓存机制及比较详解 - IIWAB

Java 中 Integer 与 Long 的缓存机制及比较详解

IIWAB 2月前 ⋅ 112 阅读

Java 中 Integer 与 Long 的缓存机制及比较详解

在 Java 编程中,IntegerLong作为基本数据类型intlong的包装类,它们的缓存机制以及对象比较的规则,对于开发者写出高效、正确的代码至关重要。理解这些特性,可以避免许多潜在的编程陷阱,并优化代码性能。

一、Integer 的缓存机制

缓存实例数量

在 Java 5.0 之后,Integer类引入了缓存机制来提高性能和减少内存消耗。Integer类内部的IntegerCache静态内部类,缓存了从 - 128 到 127 范围的Integer对象。这意味着在这个范围内的Integer对象,通过valueOf方法创建时,会直接从缓存中获取已有的对象,而不是创建新的对象。

== 判断相等与不等的情况

相等情况:当使用==比较两个Integer对象,且这两个对象的值在 - 128 到 127 之间时,由于它们是从缓存中获取的同一个对象,所以==判断结果为true。例如:

Integer a = Integer.valueOf(10);

Integer b = Integer.valueOf(10);

System.out.println(a == b); // 输出true,因为10在缓存范围内,a和b是同一个对象

不等情况:当两个Integer对象的值不在 - 128 到 127 之间,或者其中一个是通过new关键字创建的(new关键字会直接创建新的对象,不会使用缓存),==比较的是对象的内存地址,而不同对象的内存地址不同,所以结果为false。例如:

Integer c = new Integer(128);

Integer d = Integer.valueOf(128);

System.out.println(c == d); // 输出false,c是新创建的对象,d是从缓存外新创建的对象,它们内存地址不同

Integer e = 128; // 相当于Integer.valueOf(128)

Integer f = 128;

System.out.println(e == f); // 输出false,128不在缓存范围内,e和f是不同的对象

二、Long 的缓存机制

缓存实例数量

Long类也有类似的缓存机制,Long类内部的LongCache静态内部类缓存了从 - 128 到 127 的Long对象。在这个范围内创建Long对象时,会直接从缓存中获取已有的对象,而不是新建对象。

== 判断相等与不等的情况

相等情况:当两个Long对象的值在 - 128 到 127 之间时,使用==比较,结果为true,因为它们引用的是缓存中的同一个对象。例如:

Long g = Long.valueOf(10L);

Long h = Long.valueOf(10L);

System.out.println(g == h); // 输出true,10L在缓存范围内,g和h是同一个对象

不等情况:当两个Long对象的值不在 - 128 到 127 之间,或者其中一个是通过new关键字创建的,==比较结果为false。例如:

Long i = new Long(128L);

Long j = Long.valueOf(128L);

System.out.println(i == j); // 输出false,i是新创建的对象,j是从缓存外新创建的对象,它们内存地址不同

Long k = 128L; // 相当于Long.valueOf(128L)

Long l = 128L;

System.out.println(k == l); // 输出false,128L不在缓存范围内,k和l是不同的对象

三、总结与建议

理解缓存机制IntegerLong的缓存机制是为了在频繁使用小范围数值时,减少对象创建开销,提高性能和节省内存。在日常编程中,要清楚知道哪些数值会被缓存,哪些不会。

谨慎使用 == 比较:由于==在比较包装类对象时,比较的是内存地址,所以在判断两个包装类对象的值是否相等时,应优先使用equals方法,避免因误解==的行为而导致逻辑错误。例如:

Integer m = 10;

Integer n = 10;

System.out.println(m.equals(n)); // 推荐使用equals方法比较值,结果为true

性能优化:在性能敏感的代码中,合理利用缓存机制可以显著提升性能。比如在循环中创建大量小范围的IntegerLong对象时,使用valueOf方法而非new关键字,以利用缓存。

深入理解IntegerLong的缓存机制以及==判断的规则,能够帮助开发者写出更高效、更健壮的 Java 代码。在实际编程中,不断积累经验,灵活运用这些知识,是提升编程能力的关键。


全部评论: 0

    我有话说: