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(): 比较的是引用数据类型,比较的是引用数据类型,不同类型有不同的equals方法,根据不同的数据类型调用不同的equals方法。也可以在特殊情况下重写equals方法。
Object中的equals():
String中的equals():
String中的hashCode():
时间: 2024-11-05 22:44:28