• Integer ,==,int 的使用


    面试比较常见的题目:自己也经常忘记,所以就记下来了

    上代码:

    1 Integer a = 1000,b=1000;  
    2 Integer c = 100,d=100;  
    3   
    4 System.out.println(a==b);  
    5 System.out.println(c==d);

    输出的正确结果分别是  falsetrue

    原因:看Integer.java类

    public static Integer valueOf(int i) {  
          return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];  
      }  
      
      /** 
       * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing 
       */  
      private static final Integer[] SMALL_VALUES = new Integer[256];  
      
      static {  
          for (int i = -128; i < 128; i++) {  
              SMALL_VALUES[i + 128] = new Integer(i);  
          }  
      }

    当声明Integer a=100 的时候,会进行自动装箱操作,即调用 valueOf() 把基本数据类型转换成Integer对象,valueOf()方法中可以看出,

    程序把 -128—127之间的数缓存下来了(比较小的数据使用频率较高,为了优化性能),所以当Integer的对象值在-128—127之间的时候是

    使用的缓存里的同一个对象,所以结果是true,而大于这个范围的就会重新new对象。

    2. Integer 和 int

    上代码:

    Integer a = new Integer(1000);  
    int b = 1000;  
    Integer c = new Integer(10);  
    Integer d = new Integer(10);  
    System.out.println(a == b);  
    System.out.println(c == d); 

    正确答案:true ,false

    解析:

    第一个:值是1000,肯定和缓存无关,但是b的类型是int,当int和Integer进行 == 比较的时候 ,java会将Integer进行自动拆箱操作,

    再把Integer转换成int,所以比较的是int类型的数据,   so 是true

    第二个:虽然值是10 在缓存的范围内,但是 c,d都是我们手动new出来的,不需要用缓存, so 是false

     

    ---------------------------------------------------------------------阿纪----------------------------------------------------------------------

  • 相关阅读:
    快速排序
    将指定目录下的所有子文件或子目录加载到TreeView
    导入英汉文本,用字符串切割,泛型集合存储的英汉字典
    取年月日的字符串方法
    简化的MVC-导入模板HTML,导入数据txt,用字符串方法生成JS菜单
    索引器的使用
    打开文件练习
    泛型委托
    将正则表达式转化成确定的有限自动机
    青蛙过桥
  • 原文地址:https://www.cnblogs.com/sunjiguang/p/5685002.html
Copyright © 2020-2023  润新知