zoukankan      html  css  js  c++  java
  • 【Java概念每日一题002】== 和 equals的区别

    == 解读

    对于基本类型和引用类型 == 的作用效果是不同的。

    基本类型:比较值是否相同;

    引用类型:比较引用是否相同。

    代码示例:

    1 String x = "string";
    2 String y = "string";
    3 String z = new String("string");
    4 System.out.println(x == y); //true
    5 System.out.println(x == z); //flase
    6 System.out.println(x.equals(y)); //true
    7 System.out.println(x.equals(z)); //true

    根据对基本类型(int,short等)以及引用类型(String等)的理解,x 和 y指向的是同一个引用,所以 == 是true,而new String()方法new了新的内存空间,所以 == 结果为false,而equals比较值,所以返回为true

    equals解读

    equals的本质是 == ,但是String和Integer(Int)等重写了equals方法,把equals方法变成了值的比较。

    默认情况下equals方法比较值

     1 class Cat(){
     2     public Cat(String name){
     3         this.name = name;
     4     }
     5     
     6     private String name;
     7 
     8     public String getName(){
     9         return name;
    10     }
    11 
    12     public void setName(String name){
    13         this.name = name;
    14     }
    15 }
    16 
    17 
    18 Cat c1= new Cat("提莫”)
    19 Cat c2= new Cat("提莫”)
    20 System.out.println(c1.equals(c2)): // false

    equals源码如下:

    public boolean equals(object obj){
        return (this == obj);
    }

    equals本质上就是==那,两个相同值的 String对象,为什么返回的是true?代码如下

    String s1= new String("阿莫");
    String s2= new String("阿莫");
    System.out.printin(s1.equals(s2));//true

    String的equals方法如下:

    public boolean equals(object anObject){
         if(this == anObject){
             return true;
         }
     
         if (anObject instanceof String){
             String anotherString = (String)anObject;
             int n = value.length;
             if (n == anotherString.value.length){
                     char v1[] = value;
                     char v2[] = anotherString.value;
                     int i=0;
                     while(n-- != 0){
                             if (v1[i] != v2[i])
                                     return false;
                             i++;
                     }
                 return true;
                 }
             }
         return false;
    }
     1 public boolean equals(object anObject){
     2     if(this == anObject){
     3         return true;
     4     }
     5 
     6     if (anObject instanceof String){
     7         (String anotherString = (String)anObject;
     8         int n = value.length;
     9         if (n == anotherString.value.length){
    10                 char v1[] = value;
    11                 char v2[] = anotherString.value;
    12                 int i=0;
    13                 while(n-- != 0){
    14                         if (v1[i] != v2[i]){
    15                                 return false;
    16                         i++;
    17                 }
    18             return true;
    19             }
    20         }
    21     return false;
    22 }

    由此可见,String类型的equals方法被重写,将引用比较改成了值比较。

    总结:对于基本类型来说是值比较,对于引用类型来说是引用比较;而equals默认情况下是引用比较,只是很多类重写了equals方法,比如 String,Integer等把它变成了值比较,所以一情况下equals比较的是值是否相等。

  • 相关阅读:
    HDU1172 猜数字 广搜
    HDU2688 Rotate
    HDU1006 Tick and Tick 几何
    ADO.NET中的五个主要对象
    .NET开发人员值得关注的七个开源项目
    常用正则表达式
    常用的正则表达式集锦〔转〕
    一个较优雅的GridView隐藏列取值解决方案
    DataTable分组求和
    处理[未处理的“System.StackOverflowException”类型的异常出现在 System.Windows.Fo ...
  • 原文地址:https://www.cnblogs.com/Neil-J/p/13547170.html
Copyright © 2011-2022 走看看