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一次就是一个新对象。