今天使用==和equals在比较字符串的时候遇到了问题,所以总结了一下比较时使用==和equals的区别,如下:
- 对于基本数据类型:
①==的使用:只是比较基本数据类型的值,如下:
int num1 = 12;
int num2 = 13;
System.out.println(num1 == num2);//false
System.out.println(num1);//12
char num3 = 'a';
char num4 = 'a';
System.out.println(num3 == num4);//true
System.out.println(num3);//a
- 对于引用类型:
①普通对象,使用==和使用equals效果相同,都是比较对象的地址值是否相同;
因为每个对象都默认继承了Object类,而Object类中的equals()方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
例子如下:
Equals_MarkDistinction obj1 = new Equals_MarkDistinction();
Equals_MarkDistinction obj2 = new Equals_MarkDistinction();
System.out.println(obj1 == obj2);//false
System.out.println(obj1.equals(obj2));//false
System.out.println(obj1);//com.day3.Equals_MarkDistinction@6a2ab65b
System.out.println(obj2);//com.day3.Equals_MarkDistinction@1a2a46d1
②对于Integer、String、Date等类重写了equals方法,所以==和equals使用不同:==比较两个对象的地址值;equals是比较两个对象的值是否相等;
Integer类
Integer的equals重写了Object的equals方法,如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer例子如下:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);//true
System.out.println(num1.equals(num2));//true
System.out.println(num1);//12
Integer num3 = new Integer(12);
Integer num4 = new Integer(12);
System.out.println(num3 == num4);//false
System.out.println(num3.equals(num4));//true
System.out.println(num3);//12
System.out.println(num4);//12
String类
string类重写了Object的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;
}
String类使用==和equals举例如下:
String str1 = "aa";
String str2 = "aa";
System.out.println(str1 == str2);//true
System.out.println(str1);//aa
System.out.println(str2);//aa
String str3 = new String("aa");
String str4 = new String("aa");
System.out.println(str3 == str4);//false
System.out.println(str3.equals(str4));//true
System.out.println(str3);//aa
System.out.println(str4);//aa
String str5 = new String();
str5 = "aa";
String str6 = new String();
str6 = "aa";
System.out.println(str5 == str6);//true
System.out.println(str5.equals(str6));//true
System.out.println(str5);//aa
System.out.println(str6);//aa
String类的三种赋值方式内存如下:
主要知识点:
1.为什么Integer类和String类的对象打印出来是值,而一般的对象打印出来是一个物理地址,是应为要在控制台打印信息必须要调用toSting()方法,而Integer、String类重写了Object的toString()方法:
①String类的toString()方法如下:
public String toString() {
return this;
}
②Integer的toSting()方法如下:
public static String toString(int i, int radix) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;
/* Use the faster version */
if (radix == 10) {
return toString(i);
}
char buf[] = new char[33];
boolean negative = (i < 0);
int charPos = 32;
if (!negative) {
i = -i;
}
while (i <= -radix) {
buf[charPos--] = digits[-(i % radix)];
i = i / radix;
}
buf[charPos] = digits[-i];
if (negative) {
buf[--charPos] = '-';
}
return new String(buf, charPos, (33 - charPos));
}
③Object的toString()方法如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}