• 随笔39 Integer类对象的创建与比较


    一、Integer类型对象之间大小比较
    1. 使用new Integer()创建的对象:
    ① == 比较
    1. Integer i = new Integer(100);
    2. Integer j = new Integer(100);
    3. System.out.println(i==j); // false
    【分析】 i,j是使用new方式创建了两个引用类型的对象,对象之间的“==”符是用来比较是否是一个对象的两个引用(即比较地址是否相同),两次new出来的对象地址显然是不可能相同的,故打印结果是false。
    ② “>”、“<” 、 “<=”、“>=”比较
    1. Integer i = new Integer(100);
    2. Integer j = new Integer(300);
    3. System.out.println(i<j); // true
    【结论1】:使用new关键字创建的包装类型对象,不可以直接使用“==”来做大小比较,但可以使用“<”、“>”、“<=”、“>=”来做大小比较
    2. 使用Integer.valueOf()创建的对象
    ① == 比较
    1. Integer i = Integer.valueOf(100);
    2. Integer j = Integer.valueOf(100);
    3. System.out.println(i==j);  // true
    但是,
    1. Integer i = Integer.valueOf(400);
    2. Integer j = Integer.valueOf(400);
    3. System.out.println(i==j); // false
    【结论2】:通过valueOf方法创建的Integer对象,也不能随便使用“==”比较大小,但可以使用“<”、“>”、“<=”、“>=”来做大小比较
    3.使用基本类型赋值创建的对象
    1. Integer i = 100;  //自动装箱
    2. Integer j = 100;
    3. System.out.println(i==j);  //true
    但是,
    1. Integer i = 400;
    2. Integer j = 400;
    3. System.out.println(i==j) // false
    【结论3】:使用Integer i = 400这种方法创建的包装类对象,也不能随便使用“==”来比较大小,但可以使用“<”、“>”、“<=”、“>=”来做大小比较
    二、Integer对象不同创建方法之间的区别
    包装类型是不能够随便使用关系运算符比较大小的,针对三种创建对象的方法,原因分析如下:
    ① 对于new关键字创建的包装类对象,两次new得到的对象引用地址是不同的,不能使用“==”关键字做大小比较。
    而使用“<”和“>”等运算符时,包装类型会调用valueOf方法,将运算符两边的对象都转换为基本类型后再做比较。
    ② 使用valueOf方法创建的Integer对象,使用“==”符号时,运行结果有时候正确,有时候不正确。查看valueOf方法的源码,如下:
    1 public static Integer valueOf(int i) {
    2     if(i >= -128 && i <= IntegerCache.high)
    3         return IntegerCache.cache[i + 128];
    4     else
    5         return new Integer(i);
    6 }    
    通过看源码能够知道,整数类型在-128~127之间时,会使用缓存,造成的效果就是,如果已经创建了一个相同的整数,使用valueOf创建第二次时,不会使用new关键字,而用已经缓存的对象。所以使用valueOf方法创建两次对象,若对应的数值相同,且数值在-128~127之间时,两个对象都指向同一个地址。
    ③ 使用Integer i = 400这样的方式来创建Integer对象,与valueOf方法的效果是一样的
    包装类对象不可使用“==”符做比较运算,如果要进行比较运算时,最好使用java类库中的compareTo方法
    三、本题的比较:
     
    【注】int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
    【注】intValue()是把Integer对象类型变成int的基础数据类型; 
       parseInt()是把String 变成int的基础数据类型; 
       Valueof()是把String 转化成Integer对象类型;(现在JDK版本支持自动装箱拆箱了。)
  • 相关阅读:
    JavaScript之链式结构序列化
    js 常用的正则表达式
    99%的人都理解错了HTTP中GET与POST的区别
    取代Promise的Generator生成器函数
    深入了解JavaScript权威指南
    限制input输入类型(多种方法实现)
    textillate.js 文字动画
    jQuery如何改变css伪元素样式
    保存android程序崩溃日志到SD卡
    跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)
  • 原文地址:https://www.cnblogs.com/lyr612556/p/7838303.html
Copyright © 2020-2023  润新知