两个结果都为false,因为对于非基本数据类型(String类除外),==和equals都是比较的两个变量的地址值,你这里是两个类类型的变量分别指向了各自的对象- class student
- {
- student(String name,int age)
- {}
- }
- class test123
- {
- public static void main(String[] args)
- {
- student a=new student("LUCY",20);//在堆内存中开辟空间,并有了地址值,类类型变量a指向这个地址值。
- student b=new student("LUCY",20);//在堆内存中开辟空间,并有了地址值,类类型变量b指向这个地址值。
- System.out.println(a==b);//判断的是两个类类型变量指向的变量地址值,地址值是唯一的,所以为false
- System.out.println(a.equals(b));//这个是直接调用的Object类中的equals方法,此方法就是比较的地址值,可看API文档。
- }
- }
复制代码 但是如果是String类型的变量,equals()就是比较的字符串内容,还有==的用法也比较特殊,下面给个详细的说明- class stringDemo
- {
- public static void main(String[] args)
- {
- String s1 = "abc";
- String s2 = new String("abc");
- String s3 = "abc";
- System.out.println(s1==s2);//false
- System.out.println(s1.equals(s2));//true
- System.out.println(s1==s3);//true
- }
- }
复制代码 分析:s1是一个类类型变量,类类型变量一定指向对象,所以”abc”是一个对象。字符串最大特点是,一旦被初始化就不可以被改变。
基本数据类型比较的是内容,引用数据类型比较的是地址值,所以s1==s2是比较的地址值,结果为false.由于String类覆写了object 类中的equals方法,并建立了自己对象独特的判断相同的内容(该方法用于判断字符串是否相同),所以这里比较的是内容是否相等,结果为true. s1和s2的区别:s1在内存中有一个对象,s2在内存中有两个对象。
字符串对象比较特殊,String s1 = "abc";这个字符串对象在常量池中存在了,s3在进行初始化的时候发现abc已经在内存中存在了,它就不会再独立开辟空间了,若再开辟空间比较浪费,也就是说在字符串对象中,只要内容相同,就不会再开辟空间,这里s1和s3指向的是同一个对象,所以结果是true
|