Java中equals和==的区别

来源:互联网 发布:淘宝已评价怎么删除 编辑:程序博客网 时间:2024/06/13 23:27

这个问题是Java面试中经常被问到的问题,也是在笔试中经常被问到,那么他们的究竟是有什么区别呢?
先看下面的test code:

public class Test1{    public static void main(String args[]){            String a="1234";            String b="1234";            String c = new String("1234");            System.out.println(a==b);            System.out.println(a==c);            System.out.println(a.equals(c));    }}

输出结果为:

truefalsetrue

首先我们来了解下string这个java中经常用到的字符串类型:
在Java中,string是一种特殊的包装类,其数据有两种的创建形式:

1.String s = "abc";2.String s = new String("abc");  

第一种先在栈中创建一个对String类的对象引用变量s,然后去查找”abc”是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值’a’、’b’、’c’,然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{‘a’、’b’、’c’},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果”abc”已经被保存在字符串常量池中,则在字符串常量池中找到值为”abc”的对象object,然后将s指向这个对象的地址。
第一种的特点是JVM会自动根据数据的实际的情况来决定是否有必要创建新的对象。
第二种的的String创建可以变相的理解成:

1 String object = "abc";2 String s = new String(object);

第一步参考第一种创建方式,而第二步由于”abc”已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。
而第二种的特点就是一概在队中创建新对象,而不管其字符串是否相等,是否有必要创建新的对象。
那么现在就有必要清楚在程序之中equals和==的区别了:
首先java所有的类都继承自Object这个基类,而Object这个基类的基本都是由equals用==来实现,所以equals和==是一样的,都是比较对象地址,java api里的类大部分都重写了equals方法,包括基本数据类型的封装类、String类等。
因此String类==用于比较两个String对象的地址,equals则用于比较两个String对象的内容(值)。

0 0