java技术--==,equals,hashcode源码分析

前言:

1.java中的instanceof关键字
(1)instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口)
(2)用于判断前面的对象是否是后面的类,或者其子类、实现类的实例
(3)instanceof左边操作元显式声明的类型与右边操作元必须是同种类或右边是左边父类的继承关系
(4)如果是返回true,否则返回false
2.使用instanceof关键字做判断时, instanceof 操作符的左右操作数必须有继承或实现关系
3.instanceof 特 有 的 规 则 :
(1) 若左操作数为null, 结果就直接返回false, 不再运算右操作数是什么类
   boolean b = null instanceof String; //false
(2)'A'在此处视为基本数据类型char,instanceof操作符只能用作对象的判断
  boolean b4 = 'A' instanceof Character; //编译不通过

1.= =: 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系

(1)基本数据类型变量
     <1>java中的==是比较两个对象在JVM中的地址
     <2>使用关系操作符 == 来进行比较时,比较的就是“值”本身
   (2)引用类型变量
     <1>引用类型的变量存储的并不是“值”本身,而是与其关联的对象在内存中的地址

2.equals():是基类Object中的实例方法

 (1)equals方法的作用
         <1> 判断两个对象的 content 是否相同
         <2>在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象
           public boolean equals(Object obj) {
           //判断引用是否相同(是否为同一对象)
              return (this == obj); }
         <3>String 类重写了 equals 方法,使用equals方法,内部实现分为三个步骤:
             i. 先比较引用是否相同(是否为同一对象),
             ii. 再判断类型是否一致(是否为同一类型),
             iii. 最后 比较内容是否一致   
         <4>Java 中所有内置的类的 equals 方法的实现步骤均是如此,特别是诸如 Integer,Double 等包装器类 
  (2)对象内容的比较才是设计equals()的真正目的(其本意是比较两个对象的 content 是否相同)                     

3.hashCode():基类Object中的 实例native方法

   (1)native方法暗示这些方法是有实现体的,其实现体是由非java语言在外面实现的
   (2)HashCode 只是在需要用到哈希算法的数据结构中才有用,比如 HashSet, HashMap 和 Hashtable
   (3)hashCode()在object类中定义如下:
         public native int hashCode();//说明是一个本地方法,它的实现是根据本地机器相关的   

4.扩展:==,equals,hashcode在jvm内存中的体现

   (1)在JVM中,内存分为堆内存跟栈内存
        <1>当创建一个对象(new Obj)时,就会调用对象的构造函数来开辟空间,将对象数据存储到堆内存中
        <2>同时在栈内存中生成对应的引用
        <3>在后续代码中调用的时候用的都是栈内存中的引用
        <4>基本数据类型是存储在栈内存中
    (2)equals与==的区别:
        <1>==是判断两个变量或实例是不是指向同一个内存空间,比较的是真正意义上的指针操作
        <2>equals是判断两个变量或实例所指向的内存空间的值是不是相同
            String str1 = new String("hello");
	        String str2 = new String("hello");
	        String st = "hello";
	        String st1 = "hello";
	        System.out.println(str1.equals(str2));//true(内容相同)
	        System.out.println(str1==str2);//false(地址不同)
	        System.out.println(st1==st);//ture(值相同)
	(3)equals与hashcode的区别       
	    <1>hashcode是系统用来快速检索对象而使用
	    <2>equals方法本意是用来判断引用的对象内容是否一致

你可能感兴趣的:(java技术杂谈专栏)