Java中equals和==

==是关系运算符,生成的是一个布尔型的结果。
Java编程思想中指出——它们评价的是运算对象值之间的关系。比较的对象可以是任何数据类型。
equals是一个方法,只有对象实例来调用,返回的也是布尔型结果。

我们用三个例子说明==的作用结果
<1>基本类型比较
基本类型储存的就是值,所以当==作用在两个基本类型时候,比较的就是两个值是不是一样。
注意,数值型是区分有符号和无符号的。
也就是:
double a2 = 3.14d;
double b2 = -3.14d;
System.out.println(a2==b2);
输出结果是false。

<2>基本类型包装类比较
基本类型包装类的比较和基本对象类型就不一样了,因为包装类已经是类这个级别了,不再是基本数据类型了。
当==作用在两个对象上的时候,比较的不单单是对象的内容是否相等,他也会判断对象的引用是否相同。
在说明包装类==比较时候,我们以String为例,先说明一下String类型创建对象时候的特点。
在JVM中存在一个String池——这个池中保存了很多String对象,可以被共享使用,从而提高效率。
当我们声明一个String对象时候(String a = "123"),如果String池中已经存在"123"这种String对象,那么直接将这个String对象的引用赋值给a;
当我们创建一个String对象时候(String a = new String("123")),不管String池中有没有"123"这个String对象,他都会先创建"123"这样一个字符串对象,然后将引用赋值给a。
那么我们用一些例子来看看==作用在String对象时候的结果:
String a = "123";
String b = "123";
String c = "234";
String d = new String("123");
String e = new String("123");
不管c和哪个对象比较,结果肯定都是false,所以关于c的比较我们就略过,重点看以下几个比较:
System.out.println(a==b);
System.out.println(a==d);
System.out.println(b==d);
System.out.println(d==e);
对于a,b都是字符串的声明都是从String池中获取到的"123"的引用,所以a==b结果显然是true;
对于d,e都是字符串对象的创建,不管String池中有没有"123"这种字符串的引用,都会使用new关键字创建两个对象,哪怕两者内容相同,因为是两个对象,所以d==e结果显然是false;
对于声明的对象a,b和创建的对象d,e比较,因为不是同一个对象的引用,即使内容相同,结果都是false;

<3>实例对象比较
实例对和包装类的比较象的比较类似,比较的方面除了内容也还有引用。
当然实例对象没有String池这个东西,所以如果是创建的两个对象作比较,返回的会是false;如果声明了两个对象的引用,并且指向同一个对象,那么比较的结果就会是true:
假设我们有个类,类名是Person:
Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;
Person p4 = p1;
p1==p2;//false
p3==p4;//true
p1==p3;//true


同样的,我们从这三个方面来说明equals的作用结果:
<1>基本数据类型
equals是一个方法,只能是对象实例来调用,基本类型显然是不能调用equals方法。
<2>基本类型包装类
以String为例:
我们先看根类Object类Sequals方法的声明:
Java中equals和==

String类对这个方法进行了重写:
Java中equals和==
所以当使用equals比较两个字符串对象时候,比较的就是两个对象的内容是否一致:
String a = "123";
String e = new String("123");
a==e;//false
a.equals(e);//true
<3>实例对象
实例对象调用equals方法和使用==的效果是一样的,如果你并没重写equals这个方法的打算的话。
从实现来看,对象调用equals方法返回的结果就是==作用在两个对象上的结果。