设为首页 加入收藏

TOP

Java基础之数据比较Integer、Short、int、short(一)
2018-12-11 14:10:48 】 浏览:204
Tags:Java 基础 数据 比较 Integer Short int short

基础很重要,基础很重要,基础很重要。重要的事情说三遍。


今天聊一聊Java的数据比较,这个范围比较大,基础类型的比较、引用类型的比较。


前提:


1、Java和c#都提供自动装箱和自动拆箱操作,何为自动装箱,简单点说就是将值类型转换成为引用类型,自动拆箱就是将引用类型转换成为值类型。并且我们还经常被教导,要避免自动的装箱和拆箱操作,因为这个会影响性能。


2、比较常用的运算符是==,equals。


下面分几类来说明数据的比较,


引用类型之间的比较:Integer与Integer之间的比较、Boolean与Boolean之间的比较、Integer与Boolean之间的比较


值类型之间的比较:int与int之间的比较、int与bool之间的比较


值类型与引用类型之间的比较:Integer与int之间的比较、Boolean与bool之间的比较


开工


引用类型之间的比较--Integer与Integer之间的比较


简单说明一下,Integer是引用类型,代表的是整形数字


上代码


public static void main(String[] args) throws Exception {
        Integer integer = new Integer(0);
        Integer mInteger = Integer.valueOf(0);
        Integer sInteger = 0;


        System.out.println(integer == mInteger);//false
        System.out.println(integer == sInteger);//false
        System.out.println(mInteger == sInteger);//true


        System.out.println(memoryAddress(integer));
        System.out.println(memoryAddress(mInteger));
        System.out.println(memoryAddress(sInteger));


    }


    private static int memoryAddress(Object object) {
        // 内存地址会有所不同
        return System.identityHashCode(object);
    }


执行结果:



分析:


1、执行结果和我们预想的不太一样,引用类型是在堆上存放的,每个引用的地址应该都不相同。但是mInteger == sInteger  执行结果为true,并且mInteger ,sInteger的内存地址是相同的。


2、要分析这个原因,我们需要了解Java设计者为了性能而进行的一些努力,查看Java源代码,可以看到Integer的valueof方法里面包含了一个缓存:其中IntegerCache.low =-127,IntegerCache.high=128


@HotSpotIntrinsicCandidate
  public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i <= IntegerCache.high)
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
  }


对于使用Integer.valueof()方法,如果数值是-127至128,那么会使用缓存对象,否则会new一个对象。


3、Integer sInteger = 0;  发生了什么呢?自动装箱,等价于Integer sInteger=Integer.valueOf(0)。通过这个,我们就可以得出比较等于true的原因了,都是从缓存中读取的对象,难怪内存地址会一致。


引用类型比较--Integer与Integer引用类型比较  使用equals


上代码:


public static void main(String[] args) throws Exception {
        Integer integer = new Integer(0);
        Integer mInteger = Integer.valueOf(0);
        Integer sInteger = 0;


        System.out.println(integer == mInteger);// false
        System.out.println(integer == sInteger);// false
        System.out.println(mInteger == sInteger);// true


        System.out.println(memoryAddress(integer));
        System.out.println(memoryAddress(mInteger));
        System.out.println(memoryAddress(sInteger));


        System.out.println(integer.equals(mInteger));//true
        System.out.println(integer.equals(sInteger));//true
        System.out.println(mInteger.equals(sInteger));//true


    }


    private static int memoryAddress(Object object) {
        // 内存地址会有所不同
        return System.identityHashCode(object);
    }


分析:使用equals比较,只要数值相同,那么比较结果就是

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言输出九九乘法表代码及解析 下一篇Java代码复用的三种常用方式:继..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目