java中的数据类型分为两种:
一 、基本数据类型:
byte、short、int、long、float、double、char、boolean
比较它们需要用 == ,比较的是它们的值是否相等
二、引用数据类型:
也就是对基本数据类型的封装,用 == 比较的是它们的内存地址(其实还是比较的基本数据类型,它们的内存地址不就是int吗)。当new的时候,会给它一个新的内存地址,所以再通过==比较,就会返回false;在Object类中的equals方法其实比较的也是内存地址,用==和equals方法比较结果是一样的,但在一些类中把equals方法重写了,如String、Integer等类中,而不是单纯的比较内存地址了。
这个equals方法不是固定的,有需要的时候,我们根据情况自己重写。
下面用简单的代码来测试一下吧,里面的注释要注意看哦!其中的java源码在文章末尾有截图
public class Text{
public static void main(String[] args){
String str = "abcd";
String str1 = "abcd1";
int i = 1;
String str2 = new String("abcd");
//比较的是内存地址,内存地址是什么?一个16进制的整形值
//java对象内存地址经过哈希算法得出一个int类型数字
System.out.println( "abcd1" == str1 );
//用的是String的equals方法,对字符串进行挨个比较
System.out.println( str.equals("abcd") );
//在javac的时候,虚拟机把字符串自动组合了???
System.out.println( str.equals('a'+"bcd") );
//比较的是内存的地址,str2创建的时候,用了一个关键字new,明确告诉虚拟机,我要一个新的,所以字符串"abcd"被当做一个新的创建,并且有一个新的内存地址
if (str == str2) {
System.out.println( "str == str2" );
}else{
System.out.println( "str != str2" );
//调用的String里面的hashCode方法(文章末尾有java源码),所以相等.那String中的hashCode方法算的是什么呢?难道是ASCII?
////确实是ASCII码, 作者自己算过,
//
//有些地方我们需要重写hashCode方法,什么地方?
//最常见的是当一个对象被加入收集对象(collection object)时,这两个函数必须自己设计。更细化的定义是:如果你想将一个对象A放入另一个收集对象B里,
//或者使用这个对象A为查找一个元对象在收集对 象B里位置的钥匙,并支持是否容纳,删除收集对象B里的元对象这样的操作,那么,equals()和hashCode()函数必须开发者自己定义。
//其他情况下,这两个函数是不需要定义的。
System.out.println( str.hashCode() );
System.out.println( str2.hashCode() );
}
//调用String的equals java.lang.String中964行equals方法
//字符串底层是字符数组,所以String中的equals方法用两个char数组,对立面的字符一个一个的比较
//
//对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
//对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
//反射性:x.equals(x)必须返回是“true”。
//类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
//还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
//任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
//
//有些情况下,我们需要自己重写equals()方法,根据情况而定
if (str.equals(str2)) {
System.out.println( "str equals str2" );
}else{
System.out.println( "str is not equals str2" );
}
}
}
运行结果:
总结:
== :
equals():
Object中的equals():
String中的equals():
String中的hashCode():