zoukankan      html  css  js  c++  java
  • 10月9日学习日志

    今天学习了Java中Integer类的直接赋值比较问题。

    Integer i02 = 59;
    Integer i03 = Integer.valueOf(59);
    Integer i04 = new Integer(59);
    
    System.out.println(i02 == i03);  //true
    System.out.println(i02 == i04);  //false
    System.out.println(i03 == i04);  //false
    Integer i02 = 200;
    Integer i03 = Integer.valueOf(200);
    Integer i04 = new Integer(200);
    
    System.out.println(i02 == i03);  //false
    System.out.println(i02 == i04);  //false
    System.out.println(i03 == i04);  //false

      我们可以看到上面两段代码只是赋给对象的值不同,但是在判断”i02 == i03“时得到的结果却不同,这是为何:当使用直接赋值如”Integer i01 = 59“的时候,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,作了一个判断,判断要赋给对象的值i是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回。那么我们就可以知道,200这个数字不在[-128,127]中,所以会直接创建一个新对象返回,i02和i03就是两个不同的对象。而59属于[-128,127]中,当创建i03时,会直接返回引用,此时i02和i03都指向同一个地址。

      以第一段代码为例:”Integer i02 = 59":因为程序初次运行,没有59,所以直接创建一个对象返回;“Integer i03 = Integer.valueOf(59)”:因为IntegerCache中已经存在59,所以直接返回引用;“Integer i04 = new Integer(59)”:直接创建一个新对象。

      JVM中一个字节一下的整型数据(即[128,127])会在JVM启动时加载进内存,除非用new Integer()显示的创建对象,否则都是同一对象。

  • 相关阅读:
    MySql行锁等待时间
    日志工具类-Mapper静态调用
    MySql锁机制理解记录
    Flink之TableAPI和SQL(5):表的时间特性
    Flink之TableAPI和SQL(4):表的Sink实现
    Flink之TableAPI和SQL(3):通过TableAPI和SQL表的一些操作(包括查询,过滤,聚集等)
    Flink之TableAPI和SQL(2):表和外部系统的连接方式
    Flink之TableAPI和SQL(1):基本功能描述
    sb 错误
    洛谷 P6189
  • 原文地址:https://www.cnblogs.com/20193925zxt/p/14157414.html
Copyright © 2011-2022 走看看