Java面试总结------Java基础
**
有关"=="与equals()
**
2019/03/30
(1)对于字符串变量来说“”是比较变量本身的值(即两个对象的首地
址)。"equals()"比较字符串内容是否相同
例: String s1=“123”;
String s2=“123”;
String s3,s4;
s3=new String(“123”);
s4=new String(“123”);
s1s2; //false 两个变量的内存地址不一样即他们指向的对象不同
s1.equals(s2) //true 两个变量所包含的内容相同
(2) StringBuffer s1=new StringBuffer(“a”);
StringBuffer s2=new StringBuffer(“a”);
s1.equals(s2); //false StringBuffer未对equals()方法进行重写,所以其是进行
地址比较
(3)对于非字符串变量来说“”和“equals”都是比较对象内存的首地址
例:
Class A{
A obj1=new A();
A obj2=new A();
obj1obj2; //false
obj.equls(obj2); //false
}
(4)基本类型的比较只能通过“==”比较。基本类型用equals()比较编译无法通过
(5)基本类型的包裹类型“==”比较地址“equals”比较内容
(6)String(字符串),StringBuffer(线程安全的可变字符串序列),StringBuilder(可变字符串序列)
例:
public class TestEquals {
public static void main(String[] args) {
String s1 = “123”;
String s2 = “123”;
String s3 = “abc”;
String s4 = new String(“123”);
String s5 = new String(“123”);
String s6 = new String(“abc”);
System.out.println(s1 == s2);// true
System.out.println(s1.equals(s2));// true
System.out.println(s1 == s3);// flase
System.out.println(s1.equals(s3));// flase
System.out.println(s4 == s5);// flase
System.out.println(s4.equals(s5));// true
System.out.println(s4 == s6);// flase
System.out.println(s4.equals(s6));// flase
System.out.println(s1 == s4);// false
System.out.println(s1.equals(s4));// true
}
}
s1,s2指向字符串常量,创建对象时,在常量池中只有一个对象,因此两个引用是相同的
s4,s5创建两个对象。因此s4==s5时false。
(7) 特殊情况
class Value {
int i;
}
public class TestEquips {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));// flase
System.out.println(v1 == v2);// false
}
}
解释:上面的例子中类Value并没有覆盖Object中的equals方法(即equals方法比较地址),
而是继承了该方法,因此它就是被用来比较地址的,又v1和v2的所指向的对象不
相同
上一篇: Jq日期比较大小
下一篇: android 时间大小比较