zoukankan      html  css  js  c++  java
  • 实践是检验真理的唯一标准

      计算机科学某种程度上是一种实践性的学问,空谈是不产生价值的,只有深入场景、解决真实问题、创造客户价值的时候才是真正有价值的。

      关于java中的”==”和equals 大家都知道

    1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

        如果作用于引用类型的变量,则比较的是所指向的对象的地址

    2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

        如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址(String,Date,Integer等一般都重写了);

          这段代码大家可以看一下,以下代码都是基于java写的:

    	public static void main(String[] args) {
    
    		Integer a = 100;
    		Integer b = 100;
    
    		System.out.println("1 a==b	" + (a == b));
    
    		System.out.println("2 a==b	" + (a.equals(b)));
    
    		Integer a1 = 321;
    		Integer b1 = 321;
    
    		System.out.println("3 a1==b1	" + (a1 == b1));
    
    		System.out.println("4 a1==b1	" + (a1.equals(b1)));
    
    	}
    

      

      大家思考一下输出结果是什么,结果为什么会是这样?Integer a = 100;这种写法本身包含了一个什么玄机?

      好了公布一下答案:

    1 a==b	true
    2 a==b	true
    3 a1==b1	false
    4 a1==b1	true
    

      是不是和您认为的有出入呢?为什么第一个是true,而第三个是false呢?根据本人目前的了解java还不能获取对象的内存地址(不借助第三方工具),有的同学说用hashcode,首先hashcode只是对象的一个标识和地址是无关的  其次equals被重写了,hashcode这个时候也是一样的。

      看着很诡异是不是,我们借助工具可以看到反编译后的代码是这个样子的

      public static void main(String[] args)
      {
        Integer a = Integer.valueOf(100);
        Integer b = Integer.valueOf(100);
        
        System.out.println("1 a==b	" + (a == b));
        
        System.out.println("2 a==b	" + a.equals(b));
        
        Integer a1 = Integer.valueOf(321);
        Integer b1 = Integer.valueOf(321);
        
        System.out.println("3 a1==b1	" + (a1 == b1));
        
        System.out.println("4 a1==b1	" + a1.equals(b1));
      }
    

      哦,这个地方java帮我们自动做了一个类型转换从int,通过Integer.valueOf转换成了Integer,但是这又怎么样呢?确实这个地方看不出什么蹊跷,我们看一下Integer的代码:

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

      我去,它居然搞了一个从-128到127之间的一个缓存,难怪通过Integer.valueOf 转换的在这个范围内的对象==返回true呢。

      都看到这里了,思考一个小问题如果是这样,结果会是什么呢?当然也有同学会说这个东西我一开始就知道答案,嗯,没错,这个要么说明您很犀利,要么说明您踩过这个坑,哈哈。

    Integer a2 = new Integer(100);
    Integer b2 =new Integer(100);
    
    System.out.println("1 a2==b2	" + (a2 == b2));
    
    System.out.println("2 a2==b2	" + (a.equals(b2)));
    

      

     

      

  • 相关阅读:
    mac配置git和github
    更新hosts后,如何清理edge的DNS缓存
    初次运行 Git 前的配置
    mac安装homebrew
    xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    AJAX
    HTTP协议
    HTTP状态码大全
    SQL Servers数据库_删除
    Hello Word
  • 原文地址:https://www.cnblogs.com/wangn/p/8911458.html
Copyright © 2011-2022 走看看