equals()与==的区别
equals():比较两个对象是否为同一对象,也就是说两个对象是否占用同一块内存
“==”:与equals()一样,也是比较两个对象是占用同一块内存
注:equals()不能判断基本类型变量
例子:
class Test
{
public static void main(String[] args)
{
int i = 66;
int j = 66;
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(i == j); //输出 true 因为 == 比较两变量是否为同一对象
System.out.println(sb1 == sb2); //输出 false
System.out.println(sb1.equals(sb2)); //输出 false
// System.out.println(i.equals(j)); error 因为equals()方法不能用于比较基本数据类型
}
}
- 不知道大家有没有感觉,或者听说String类很特别,我就一直很纳闷,这String类到底有什么特别,我怎么没什么感觉,于是我就对此进行了探究
例子:
class Test
{
public static void main(String[] args)
{
String s1 = "哈哈";
s1 = "abc"; //String类定义属性后会将属性存入栈中,而将值存入常量吃中,再次定义时,会再次在常量池中创建,引用便指向新的对象
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3 == s4); //false
System.out.println(s3.equals(s4)); //true
System.out.println(s1 == s3); //false
System.out.println(s1.equals(s3)); //true
}
}
对此得出如下结论:
- String变量不能被重写:并不意味着 对象值 不能被改写,而是说在常量池池中重新开辟了一块空间去存储新的字符串常量
- equals()的不同:大家看了上面的代码及输出值后肯定会有疑问,不是说equals和==是一样的吗?不应该都是比较是否为同一对象吗?所以这就要说明:String类对equals方法进行了重写,比较的是字符是否一样(StingBuffer并未对equals进行重写)
- 在我们自定义的类中,都是继承了Object这个类的,说以说equals()方法并没有被重写,而有时候我们需要用到比较值是否相等,那么该怎么办呢?
例子:
class T
{
int i;
public T (int i)
{
this.i = i;
}
public boolean equals(Object obj)
{
T t = (T)obj; //因为Object是父类,而父类不能访问子类特有的属性和方法,但在将子类引用赋给父类后(t2=obj),再进行强制转话即可
if (this.i == t.i)
return true;
else
return false;
}
}
class Test
{
public static void main(String[] args)
{
T t1 = new T(123);
T t2 = new T(123);
System.out.println(t1.equals(t2)); //输出 true
}
}
- 以上就是这次的全部内容,喜欢请点关注?.