java的两种数据类型:
1.基本数据类型:
8种:byte short long int float double char boolean
基本数据类型是没有方法的,所以它们没有equals()方法,它们之间的比较是用“==”,比较的是它们在栈中的地址。
如int a = 6;这里a是一个指向int类型的引用,指向6这个字面值。
另外在这里提一下栈的特性,存在栈中的数据是可以共享的,比如:
int a = 4; int b = 4;
编译器先处理int a = 4;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为4的地址,没找到,就开辟一个存放4这个字面值的地址,然后将a指向3的地址。接着处理int b = 4;在创建完b这个引用变量后,由于在栈中已经有4这个字面值,便将b直接指向4的地址。这样,就出现了a与b同时均指向4的情况。(地址指向的值在栈内存当中,切不可理解为地址指向堆内存中,基本数据类型是存放在栈内存当中的。)
2.引用数据类型:
当使用 == 比较的时候:比较的是它们的内存地址,当new出来一个新得对象的时候,会给这个对象分配一个新得内存地址,这个时候再比较的话,即使“字面值”相同,返回的也是false
当使用equals()比较的时候: equals()方法会先比较是不是同一个对象,如果是,则返回true,如果不是判断是否为相同类型,如果是,在进行比较。更详细理解看下面的String的equals()源码。
另外再提一下引用数据类型的存储方式,以便更好的理解:
引用数据类型在栈中存储的是地址,来指向堆内存的实例。
下面用一些代码证实一下:
package practice;
/**
* @author YoungXinLer
* date 2018/8/4 17:09
*/
public class Test {
public static void main(String args[]){
String str1 = "abc";
String str2 = "abc";
String strNew = new String("abc");
Integer integer = 1;
String strNew1 = "1";
//引用数据类型 == 比较
System.out.println(str1 == str2);
//引用数据类型 equals() 比较
System.out.println(str1.equals(str2));
//通过New 来分配新的堆空间来存放这个实例对象,先用 == 比较
System.out.println(str1 == strNew);
//通过New 来分配新的堆空间来存放这个实例对象,再用 equals() 比较
System.out.println(str1.equals(strNew));
//通过不同类型的引用类型的对象,来验证euqals()的源码
System.out.println(strNew1.equals(integer));
}
}
运行结果:
附上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;
}
希望可以帮到你,如有不对,敬请指教.