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直接指向它,而不会创建一个新的对象。

  • 相关阅读:
    搜索rapidshare资源的几种方法
    Sharepoint 浅谈 [转]
    如何使用本地账户“完整”安装 SharePoint Server 2010
    为SharePoint 2010配置基于表单的身份认证
    网页禁用右键、防拷贝及"另存为"失效方法
    Sharepoint 2010 表单 身份认证(基于SQL数据库)
    SharePoint2007文档的点击率统计
    Sharepoint2010 表单认证常见问题
    sharepoint不能上载多个文件
    关于android service 重启
  • 原文地址:https://www.cnblogs.com/authetic/p/8908224.html
Copyright © 2011-2022 走看看