浅谈 equals 和 == 的区别
一.根本数据类型
对于 byte,short,int,long,float,double,char,boolean 这八种根本数据,是指寄存在 栈中的简略数据段,数据大小确定,内存空间大小能够调配,它们是间接按值寄存的,所以能够间接 按值拜访。他们之间的比拟间接抉择 ==,这里间接比拟的是他们的值
二.援用数据类型
- == 比拟两个对象在内存里是不是同一个对象,就是说在内存里的 存储地位 统一。两个 String 对象存储的值是一样的,但有可能在内存里存储在不同的中央.
-
== 比拟的是援用而 equals 办法比拟的是内容。
public boolean equals(Object obj)这个办法是由 Object 对象提供的,能够由子类进行重写。默认的实现只有当对象和本身进行比拟时才会返回 true, 这个时候和 == 是等价的。String, BitSet, Date, 和 File都对 equals 办法进行了重写,对两个 String 对象而言,值 相等意味着它们蕴含同样的字符序列。对于根本类型的包装类说,值相等意味着对应的根本类型的值一样。
三. 字符串缓冲池
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
原来,程序在运行的时候会创立一个字符串缓冲池当应用 s2 = “hello” 这样的表白是创立字符串的时候,程序首先会在这个 String 缓冲池 中寻找雷同值的对象,在第一个程序中,s1 先被放到了池中,所以在 s2 被创立的时候,程序找到了具备雷同值的 s1 将 s2 援用 s1 所援用的对象 ”hello”;然而 第二段程序中,应用了 new 操作符,他明确的通知程序:” 我要一个新的!不要旧的!” 于是一个新的 ”hello”Sting 对象被创立在内存中。他们的值雷同,然而地位不同,由此他们的地址值产生了扭转!