zoukankan      html  css  js  c++  java
  • java基础总结equals与==

    equals 与 ==

    先上一段经典代码

    public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            int n=3;
            int m=3;
            
            System.out.println(n==m);
            
            String str = new String("hello");
            String str1 = new String("hello");
            String str2 = new String("hello");
            
            System.out.println(str1==str2);
            
            str1 = str;
            str2 = str;
            System.out.println(str1==str2);
        }
    

    输出结果为true,false,true
    ==比较的是变量本身的值,而equal比较的是变量所指的内容
    怎么理解这句话呢?
    对于八种基本数据类型变量,本身的值就是内容,存储在栈中;而引用类型变量在栈中存储的是变量所指的地址,对象实例存储在堆中。str1和str2是指向两个字符串变量,所以值不同。
    再来看看equals方法是如何比较所指向对象的内容。
    equals方法是Object基类中定义的方法,它本身是用来比较对象的内存地址是否相同,一些子类重写它以后,就可以用来比较对象的内容,比如String类就重写了这个方法。

    Object类中equals方法

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

    String类中equals方法

    public boolean equals(Object anObject) {  
            if (this == anObject) {  
                return true;  
            }  
            if (anObject instanceof String) { 
                //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;  
        }
    

    其中value是String类定义的,用于存放字符串的字符数组
    private final char value[];

    再来看一个特殊情况

    public static void main(String[] args){    
    		String s1="hello";
    		String s2="hello";
    		String s3 = new String("hello");
    		System.out.println(s1==s3);
    		System.out.println(s1==s2);
        } 
    

    输出false,true
    输出true是因为java的字符串缓冲区,类似于常量池的东西,这样创建的String不是一个新的对象,因为java发现已经有一个"hello",就会将s2直接指向它,而不会创建一个新的对象。

  • 相关阅读:
    第六次实验报告
    第三次实验报告
    第五张循环语句总结
    第二次实验报告
    第一次实验报告
    第一次作业
    第九章 结构体与共用体
    第八章 指针实验
    第七章数组实验
    第六章实验报告(2)
  • 原文地址:https://www.cnblogs.com/authetic/p/8908224.html
Copyright © 2011-2022 走看看