Java_==与equals

来源:互联网 发布:safari3 for windows 编辑:程序博客网 时间:2024/06/05 11:10

1.     ==

==严格要求两个变量指向同一对象。==不能比较没有父子关系的对象。

public class EqualTest {public static void main(String[] args) {int it=65;float f1=65.0f;System.out.println(it==f1);//truechar ch='A';System.out.println(it==ch);//true  'A'的ASCII码是65String str1=new String("hello");String str2=new String("hello");String str3=str1;System.out.println(str1==str2);//false 因为str1和str2虽然都创建了"hello"对象,但是是两个对象,str1和str2分别指向了两个对象。System.out.println(str1==str3);//true 引用类型变量str3与str1都指向了同一个对象System.out.println(str1.equals(str2));// ture equals是判断值相等System.out.println("hello"==new String("hello"));//false//System.out.println("hello"==new EqualTest()); 编译不通过,因为两者没有继承关系System.out.println("--------------------");String s1="hello";String s2="world";String s3="helloworld";String s4="hello"+"world";//例子中的s1、s2、s3、s4、在编译时就确定下来。String s5=s1+s2;String s6=new String("helloworld");System.out.println(s3==s4);//trueSystem.out.println(s3==s5);//falseSystem.out.println(s4==s5);//falseSystem.out.println(s3==s6);//false}}

//当Java程序直接使用"hello"的字符串直接量时,JVM将会使用常亮池来管理这些字符串;JVM常量池里保证相同的字符串只有一个
//当使用 new String("hello"),JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的对象保存在堆内存中。
//new String("hello")一共产生了两个字符串对象。
//new String()创建的字符串对象时运行时时创建出来的,它被保存在运行时内存区(堆内存中),不会放入常量池。


equals方法可以被重写。String类已经重写了Object的equals方法,只要两个字符串序列相等即返回true

重写两个类的equals方法

public class OverrideEquals {public static void main(String[] args) {Person p1=new Person("wukongkong","123");Person p2=new Person("wukongkong","123");Person p3=new Person("wukongkong","1234");System.out.println(p1.equals(p2));//trueSystem.out.println(p1.equals(p3));//false}}class Person{public String name;public String id;public Person(String name,String id) {this.name=name;this.id=id;}public String getId() {return this.id;}public boolean equals (Object obj) {if (this==obj)//如果两个引用变量指向同一个对象return true;if (obj!=null&& obj.getClass()==Person.class) {Person personobj=(Person) obj;//并且当前的对象的id与obj的id相同if (this.getId().equals(personobj.getId())){return true;}}return false;}}

利用getClass进行判断,严格保证是同一个对象,另一个对象必须是Person的实例。

不能使用instanceof,因为instanceof 是判断前面对象是后面类的实例,或者是其子类的实例。可能会出现模糊,不能严格保证。

原创粉丝点击