博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java --Integer 学习
阅读量:6046 次
发布时间:2019-06-20

本文共 4340 字,大约阅读时间需要 14 分钟。

 本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。

在网上看到一个面试题,没有完全做, 本代码基于JDK8

//下面代码运行结果是public class Test3{    public static void main(String[] args) {        Integer a = 1;        Integer b = 2;        Integer c = 3;        Integer d = 3;        Integer e = 11;        Integer f = 11;        Long g = 3L;        Long h = 2L;        Integer i =127;        Integer k =128;        System.out.println(c == d);         System.out.println(e == f);         System.out.println(c == (a + b));         System.out.println(k == (a + i));         System.out.println(c.equals(a + b));        System.out.println(g == (a + b));         System.out.println(g.equals(a + b));         System.out.println(g.equals(a + h));        Integer  a1  =  new Integer(1);        Integer  b1  =  new Integer(1);        System.out.println("----"+(a1==b1));     }}

先自己做一遍,看看自己能不能完全做作对

 

 

 

 

答案是如下:

  

 相信挺多人 都或多或少的了解到Integer 有一个 缓存池,缓存的大小是:-128 -127 之间(Long同理)

//缓存结构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) {                try {                    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);                } catch( NumberFormatException nfe) {                    // If the property cannot be parsed into an int, ignore it.                }            }            high = h;            cache = new Integer[(high - low) + 1];            int j = low;            for(int k = 0; k < cache.length; k++)                cache[k] = new Integer(j++);            // range [-128, 127] must be interned (JLS7 5.1.7)            assert IntegerCache.high >= 127;        }        private IntegerCache() {}    }

 

   再了解一下 Integer(Long同理)内部一些代码

//Integer 值 是基本类型 int    private final int value;     //别急  结合后面发编译的代码看         // Integer 赋值 首先会判断 是否是 -128 -127之间(缓存池)          // 若没有 超出返回 才会 new 一个对象    public static Integer valueOf(int i) {        if (i >= IntegerCache.low && i <= IntegerCache.high)            return IntegerCache.cache[i + (-IntegerCache.low)];        return new Integer(i);    }    //别急  结合后面发编译的代码看    public int intValue() {        return value;    }  //euqals 方法    public boolean equals(Object obj) {      if (obj instanceof Integer) {        return value == ((Integer)obj).intValue();      }      return false;  }

 

 

 首先 用反编译工具 打开 class文件 上下代码 结合思考一下

import java.io.PrintStream;public class Test3{  public static void main(String[] args)  {    Integer a = Integer.valueOf(1);      Integer b = Integer.valueOf(2);    Integer c = Integer.valueOf(3);    Integer d = Integer.valueOf(3);    Integer e = Integer.valueOf(321);    Integer f = Integer.valueOf(321);    Long g = Long.valueOf(3L);    Long h = Long.valueOf(2L);    Integer i = Integer.valueOf(127);    Integer k = Integer.valueOf(128);   //true   c、d  取得都是缓存中的3那个对象     System.out.println(c == d);     // false 看一下 Integer 中  valueOf这个方法  e、f  会分别 new 一个对象    System.out.println(e == f);    /*** true  数值比较  initValue 方法 取的是 Integer 中 final变量 value的值     int a  =1;     int b  =2;    int c  =3    a+b == c     ***/    System.out.println(c.intValue() == a.intValue() + b.intValue());   // true  数值比较   同上      System.out.println(k.intValue() == a.intValue() + i.intValue());    //true equals比较的是数值      System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));      //true 数值比较                System.out.println(g.longValue() == a.intValue() + b.intValue());     //false   Long.equals()首先会判断 传入是否为Long对象 不是 Long !=Integer (a+b自动装箱的是Integer类型)            System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));  // true 了解一下 自动装箱  (Integer +Long) 会转为Long (注意Long也是存在 缓存的 -128 -127)     System.out.println(g.equals(Long.valueOf(a.intValue() + h.longValue())));          Integer a1 = new Integer(1);    Integer b1 = new Integer(1);        System.out.println("----" + (a1 == b1)); //new 出来的对象  地址不同  }}

 

转载于:https://www.cnblogs.com/lyhc/p/9416276.html

你可能感兴趣的文章
2016年存储市场10大趋势
查看>>
雅虎腰斩自家7项业务:计划裁员400多人
查看>>
至少泄露5亿信息 雅虎已暂禁电子邮件自动转发
查看>>
MySQL 5.7下InnoDB对COUNT(*)的优化
查看>>
国内首次公开僵尸网络主控服务器数量
查看>>
数据分析师常见的十个问题
查看>>
智能时代,深度学习和大数据成了密不可分的一对儿
查看>>
Rays Power Infra将在印度建立100MW光伏项目
查看>>
QTP安装问题小记
查看>>
对话阿里云AI 科学家闵万里:1984年人工智能低潮是否会重演?
查看>>
Intellij IDEA 添加jar包的三种方式
查看>>
十分钟入门RocketMQ
查看>>
年计划,技术儿告诉你怎么做?
查看>>
通过ODBC连接PostgreSQL和Greenplum
查看>>
2015.08.19结构体
查看>>
Nodejs测试:从0到90(理论篇)
查看>>
Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
查看>>
windows7下制作苹果mac os x 10.10Yosemiteu盘启动盘
查看>>
Appium移动自动化测试(四)--one demo
查看>>
这是就是联想?2年4次因同一问题返售后,售后找不到确切原因。。。。。
查看>>