Java中equals和=的区别

本篇简单介绍javaequals== 区别

equals 和 ==

==

  • 基本数据类型 byte,short,char,int,long,float,double,boolean
    ==比较的是它们的值

  • 复合数据类型(类)
    ==比较的是它们的在内存中的存放位置

equals

对于复合数据类型(类)使用equals来比较它们的内容是否一致

String,Integer,Date在这些类当中equals有其自身的实现。

String.class

        
        //先使用`==`进行比较内存地址 如果`true` 则`return`
        
		public boolean equals(Object obj) {
		        return (this == obj);
		    } 
		
		//如果内存地址不相同则比较内容
		   
		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;
		}

Integer.class


		 public boolean equals(Object obj) {
		        if (obj instanceof Integer) {
		            return value == ((Integer)obj).intValue();
		        }
		        return false;
		    }



Date.class


	  public boolean equals(Object obj) {
	        return obj instanceof Date && getTime() == ((Date) obj).getTime();
	    }

关于内存池

基于以上的理论基础上,我测试了一下发现。


	String str1 = "string";
	String str2 = "string";
	
	System.out.println(date == date2);
 
    output: true  ??? 说好的比较地址呢

	String str1 = "string";
	String str2 = new String("string");
	
	System.out.println(date == date2);
 
    output: false  正常情况
    
    String str1 = new String("string");
	String str2 = new String("string");
	
	System.out.println(date == date2);
 
    output: false  正常情况

查看了一下源码intern()函数给出了如下注释


     * When the intern method is invoked, if the pool already contains a
     * string equal to this {@code String} object as determined by
     * the {@link #equals(Object)} method, then the string from the pool is
     * returned. Otherwise, this {@code String} object is added to the
     * pool and a reference to this {@code String} object is returned.


大体的意思是放你当没有使用new关键字创建一个字符串String str1 = "string"的时候,会先检查内存池如果已经包含该字符串
如果存在则 返回内存池中的该字符串的引用。如果没有再创建一个新的。

而使用关键字new则会默认创建一个新的String所以拥有不同的内存地址。

posted @ 2018-09-17 11:46  可爱的黑精灵  阅读(210)  评论(0编辑  收藏  举报