一、Java基础
==和equals的区别是什么
该问题是Java中最基本的小白问题,但是很多人不去注意,就会导致之后编写代码的时候出现一些最基本的错误,却总是找不到错误来源。
其实很简单,只要了解了之后就会觉得,哎呦,一般般了。
“==”在Java中是操作数的值相等
public class Test {
public static void main(String[] args){
int a=2;
int b=2;
System.out.println(a==b);
String m = "abc";
String n = "abc";
System.out.println(m==n);
String x = new String("hello world");
String y = new String("hello world");
System.out.println(x==y);
}
}
输出的结果为: true ture false
首先说一下为什么生成true或者false,在Java中关系操作符生成的是一个布尔类型的结果类型。
因此对于第一个输出,输出结果为true,原因刚才已经提及,“==”代表的是值是否相等,很明显2=2。
对于第二个输出为true,也很好理解,但是第三个输出为什么就是false了呢?
这里要说明一下,基本类型与非基本类型的区别。
对于Java中8种基本数据类型(不懂的自己搜索吧,这里不一一列举)的变量,变量直接存储的是“值”,所以在进行“= =”操作时,比较的是值本身。但是对于String类型,它非基本数据类型的变量。
首先说:
String x = new String(“hello world”);
String y = new String(“hello world”);
x指向了一个对象(也可以说对象的引用),此时变量x中存储的是它指向的对象在内存中的存储地址。
然后再看下边:
String m = “abc”;
String n = “abc”;
Java中相同字符串用的是同一块内存,它没有单独创建一块内存,所以引用的地址也是相同的。
equals比较
看了一些资料和论坛,equals方法是基类Object中的方法,为了更直观的查看不同大部分博客中直接写出了Object类中equals方法的实现。代码如下:
public boolean equals(Object obj){
return (this == obj);
}
可以看出上面的方法是比较两个对象的引用是否相等。
public class Test {
public static void main(String[] args){
String a = "abc";
String b = "abc";
System.out.println(a.equals(b));
String c = new String("hello");
String d = new String("hello");
System.out.println(c.equals(d));
}
}
输出的结果为: true ture
可能很多人会问不是比较引用的地址吗?为什么new出来的比较也为true呢?其实这里又涉及到String类中的equals方法,Java中许多类(String类就是其中一个)对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。所以结果如上。
再扩展一点,代码的魅力无穷你得使劲的钻研啊!看下面的代码:
public class Test {
public static void main(String[] args){
int i = 2;
int j = 2;
System.out.println(i == j);
Integer n=new Integer(2);
Integer m=new Integer(2);
System.out.println(n.equals(m));
System.out.println(n==m);
System.out.println(i==m);
String a = "abc";
String b = "abc";
System.out.println(a==b);
System.out.println(a.equals(b));
String c = new String("hello");
String d = new String("hello");
System.out.println(c.equals(d));
System.out.println(c==d);
}
1 true 2 true 3 false 4 true 5 true 6 true 7 true 8false
前边加了序号,好让你们查看
Integer类型是int的包装类,这个结果大家可以自己细细体味。对于地址和值,以上输出结果按照上面的理解可以解决。
总结一下:“==”和equals的不同在于
1.“==”对于基本类型比较的是值的大小是否相同,对于非基本类型的数据,比较的是引用地址是否相同。
2.对于非基本类型的变量,看是否new了新的内存空间,如果new,则不同,否则相同。
3.equals比较的是非基本类型的数据的引用地址(即内存地址)是否相同,但是对于重写equals方法的类型,比较的是对象内容是否相同。