Java中Integer的变量比较源码解析

简介: Java中Integer的变量比较源码解析

面试例子:

public static void main(String arg[]){  

    Integer a=3;  

    Integer b=3;  

    System.out.println(a==b);  

    System.out.println(a.equals(b));  

    a=3333;  

    b=3333;  

    System.out.println(a==b);  

    System.out.println(a.equals(b));  


}

1

2

3

4

5

6

7

8

9

10

11

此程序打印出来的结果分别为:true,true,false,true。那么为什么会出现这种结果呢?


原因分析

我们要知道当给一个Integer对象赋一个int值时,Integer的valueOf方法会被调用。那么,我们看看Integer的valueOf方法到底做了些什么。源码如下:


代码一:


public static Integer valueOf(int i) {

   assert IntegerCache.high >= 127;

   if (i >= IntegerCache.low && i <= IntegerCache.high)

       return IntegerCache.cache[i + (-IntegerCache.low)];

   return new Integer(i);

}

1

2

3

4

5

6

代码二:


private static class IntegerCache {

   static final int low = -128;

   static final int high;

   static final Integer cache[];


   static {

       // high value may be configured by property

       int h = 127;

       String integerCacheHighPropValue =

           sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

       if (integerCacheHighPropValue != null) {

           int i = parseInt(integerCacheHighPropValue);

           i = Math.max(i, 127);

           // Maximum array size is Integer.MAX_VALUE

           h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

       }

       high = h;


       cache = new Integer[(high - low) + 1];

       int j = low;

       for(int k = 0; k < cache.length; k++)

           cache[k] = new Integer(j++);

   }


   private IntegerCache() {}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

通过代码一我们可以看出,当valueOf传入的值在IntegerCache.low和IntegerCache.high之间时,Integer被赋的值将从IntegerCache.cache数组中获得,也就是通过缓存中获得。


再看代码二,IntegerCache.low为常量-128。而IntegerCache.high如果在启动JVM时没有指定-XX:AutoBoxCacheMax参数,默认为127。综合两段代码,我们可以知道,在默认情况下,在-128到127之间的数据在赋值时会从缓存中获得。


结论

因此,在-128到127之间的数据多次获得的均为同一个对象,而超出这个范围的数据将会创建一个新的对象,只能通过equals方法比较的才是对象的值。



目录
相关文章
|
3天前
|
存储 安全 算法
【常见集合】Java 常见集合重点解析
【常见集合】Java 常见集合重点解析
8 0
|
1天前
|
Linux 网络安全 Windows
网络安全笔记-day8,DHCP部署_dhcp搭建部署,源码解析
网络安全笔记-day8,DHCP部署_dhcp搭建部署,源码解析
|
1天前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
|
1天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
2天前
HuggingFace Tranformers 源码解析(4)
HuggingFace Tranformers 源码解析
5 0
|
2天前
HuggingFace Tranformers 源码解析(3)
HuggingFace Tranformers 源码解析
5 0
|
2天前
|
开发工具 git
HuggingFace Tranformers 源码解析(2)
HuggingFace Tranformers 源码解析
6 0
|
2天前
|
并行计算
HuggingFace Tranformers 源码解析(1)
HuggingFace Tranformers 源码解析
8 0
|
Java 程序员
java中Integer包装类的详细讲解(java二进制操作,所有进制转换)
<p>程序员都很懒,你懂的!</p> <p>今天为大家分享的是Integer这个包装类。在现实开发中,我们往往需要操作Integer,或者各种进制的转换等等。我今天就为大家详细讲解一下Integer的使用吧。看代码:</p> <p></p> <pre code_snippet_id="331653" snippet_file_name="blog_20140507_1_118094"
1773 0
|
3天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。

推荐镜像

更多