public static void main(String[] args) {
/*
public Integer(int value) {
this.value = value;
}
*/
Integer a = new Integer(3);//Integer 是包装类
Integer b = 3;//b 相当于是一个对象
int c = 3;
Integer i = new Integer(3);
System.out.println(a == b);//false 对象之间的比较,比较的是内存地址
System.out.println( b == c);//true
System.out.println( a == c);//true
System.out.println(a.equals(b));//true
System.out.println(a.equals(c));//true
System.out.println(b.equals(c));//true
System.out.println(a);//3
System.out.println(b);//3
System.out.println(c);//3
System.out.println(a == i);//false
/*
String s=null;只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指向任何内存空间
String s="";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作,而不用担心什么了
*/
String d = null;//NULL代表声明了一个空对象,根本就不是一个字符串。
String f = "";
String h = "";
String e = "null";
System.out.println(d.equals(e));//Exception in thread "main" java.lang.NullPointerException
System.out.println(d.equals(f));//Exception in thread "main" java.lang.NullPointerException
System.out.println(e.equals(f));//false
System.out.println(d == e);//false
System.out.println(d == f);//false
System.out.println(e == f);//false
System.out.println(f == h);//true
System.out.println(f.equals(h));//true
String g = "null";
System.out.println(e == g);//true
System.out.println(e.equals(g));//true
String b1 = new String("null");
String b2 = new String("null");
System.out.println(b1 == b2);//false
System.out.println(b1.equals(b2));//true
/*
* Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
*/
/*
* Integer中的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}*/
/* 自动装箱默认调用的方法
* 例如:Integer a = 100;
* 相当于编译器自动为你做了如下的语法编译:Integer a = Integer.valueOf(100);
* 对于-128到127(默认为127)之间到的值,Integer.valueOf(int i)返回的是缓存的Integer对象,并不新建对象。
*
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
*/
/*
* 自动拆箱默认调用的方法
* 例如:Integer i = 100;
* int t = i;
* 实际执行了:int t = i.intValue();
public int intValue() {
return value;
}
*/
Integer a1 = 200;
Integer a2 = 200;
Integer a3 = 100;
Integer a4 = 100;
System.out.println(a1==a2);//false
System.out.println(a3 == a4);//true
}
转自:https://www.cnblogs.com/findumars/p/3746878.html(致敬)
"=="和equals方法究竟有什么区别?(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Object
obj = newObject();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:String a=new String("foo");Stringb=new String("foo");两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;}这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。-----------------------------------------------------------------简单的说,==比较两个人是否究竟是真正同一个人,equals一般用来比较两个人在逻辑上是否相等(比如规定两人成年之后身高相同就算两人相同等等),想怎么定义就怎么定义,如果不覆盖equals方法的话,默认仍然是比较两人是否同一个人。