String 等号==比较 和 equals 比较

JAVA 中数据类型分为两大类:一类是基本数据类型,另一类是引用数据类型.其中基本数据类型又分为8种分别是:四种整数类型(byte、short、int、long),两种浮点数类型(float、double),一种字符类型(char),一种布尔类型(boolean) 
      引用数据类型也就是我们常说的类了,在java中String也是一种引用类型. 
      使用==比较可以分成两种情况: 
     1,当等号左右都是基本数据类型时,那就是值的比较  例如: 
          int a=1; 

          int b=1; 
          int c=2; 
          System.out.println(a==b);  //结果为true 
          System.out.println(a==c);   //结果为false 

 
   因为我们左右两边都是基本数据类型,所以比较的是变量的值是否相等 

 

 2,当等号左右不是基本数据类型时,那就是地址的比较   例如: 

      1、

    "aa".equals("aa") // 返回 true 。因为 String类重写了Object对象的equals

   public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
   

 

      2、

  String a1=new String("aa"); String a2=new String("aa");System.out.println(a1==a2)  //返回false
String a1="aa"; String a2="aa";
System.out.println(a1==a2)// 返回true
 

    "==" 都是地址比较,为什么 第二个a1==a2 就返回true。

    原因是:"aa" 这样赋的值存在stack栈中,stack会先搜索栈区如果没有一样的值再新生产一个值。

    而new String 出来的对象存在heap堆中,没new一次就是一个新对象。

 

 

展开阅读全文

没有更多推荐了,返回首页