Java学习day15-==操作符与equals方法;String对象的创建

一、==操作符

1.基本类型比较值:只要两个变量的值相等,即为true。

  例如int a = 5;System.out.println(a == 5);//true

2.引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。

  例如 Person p1 = new person(); Person p2 = new person(); System.out.println(p1 == p2);//false

注意:用“==”进行比较时符号两边的数据类型必须兼容(可自动转换的数据类型除外),否则编译出错。

二、equals方法

格式:obj1.aquals(obj2)

1.equals():所有类都继承了Object,也就获得了equals()方法。还可以重写。

2.equals()在一般情况下,只能比较引用类型,其作用与“==”相同,比较是否指向同一对象。

  例如: Person p1 = new person(); Person p2 = new person(); System.out.println(p1.equals(p2));//false

注意:当用equals()方法进行比较时,对类File、类String、类Data以及包装类(Wrapper Class)来说,是比较类型和内容,不考虑引用的是否是同一对象。原因是在这些类中,重写了Object类的equals()方法。

  例如:String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(s1.equals(s2));//true

结论:对于对象来说,特殊的类,如String、File、Data,使用==比较的是对象(即对象的内存地址),使用equals()则比较的是内容。

          普通的类,==和equals()比较的都是对象(即对象的内存地址)。

如果你想改变某一个类的equals()方法,不想用equals()来比较对象的内存地址,就需要重写equals()方法。

 

三、String对象的创建

1.字面量创建String对象

String s1 = “abc”;//常量池中添加“abc”对象,返回引用地址给s1对象;

String s2 = “abc”;//通过equals()方法判断常量池中已有值为abc的对象,直接返回相同的引用地址给s2对象;

System.out.println(s1 == s2);//true--所以s1 == s2。

2.new创建String对象

String s3 = new String("def");//在常量池中添加“def”对象,在堆中建值为“def”的对象s3,返回引用地址给s3对象;

String s4 = new String("def");//常量池中已有值为“def”的对象,不做处理,但在堆中创建值为“def”的对象s4,返回引用地址给s4对象。

3.String s5 = “x” + “y”;//经过JVM优化后,会直接在常量池中添加“xy”对象,返回引用地址给s5对象。

4.String s6 = new String("1")  + new String("1") + new String("2");//通过StringBuilder实现,在常量池中添加“1”和“2”两个对象,并在堆中创建值为“112”的对象,把引用地址返回给s6对象。

如图所示:

例题:1.编写Order类,有int型的orderId,String型的orderName,相应的getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:public boolean equals(Object obj),并判断测试类中创建的两个对象是否相等。

 1 package day14;
 2 
 3 public class Order {
 4     public Order(int orderId,String orderName){
 5         this.orderId = orderId;
 6         this.orderName = orderName;
 7     }//两个参数的构造器    
 8     
 9     int orderId;
10     String orderName;
11     
12     public int getOrderId() {
13         return orderId;
14     }
15     public void setOrderId(int orderId) {
16         this.orderId = orderId;
17     }
18     public String getOrderName() {
19         return orderName;
20     }
21     public void setOrderName(String orderName) {
22         this.orderName = orderName;
23     }
24     
25     public boolean equals(Object obj) {
26         boolean flag = false;//先给一个初始化的值,flag是标识位
27         if(obj instanceof Order){//判断obj是不是Order类
28             Order o = (Order) obj;//如果是,把obj强转成Order类型
29             
30             if(this.orderId == o.orderId && this.orderName.equals(o.orderName)){//比较当前Order类的orderId与传入的orderId是否相等,String类型的orderName则用equals()方法比较值
31                 flag = true;
32             }
33         }
34                 
35         return flag;
36     }
37 
38 }

在test中赋值测试

package day14;

public class Test {
    public static void main(String[] args){

        Order o1 = new Order(123,"a001");
        Order o2 = new Order(123,"a001");
        
        System.out.println(o1.equals(o2));
        
    }
}    

打印结果为:true。

更改赋值再次测试

package day14;

public class Test {
    public static void main(String[] args){

        Order o1 = new Order(123,"a001");
        Order o2 = new Order(123,"a002");
        
        System.out.println(o1.equals(o2));
        
    }
} 

打印结果为:false。

 

例题2:请根据以下代码自行定义能满足需要的MyData类,在MyData类中覆盖equals()方法,使其判断当两个MyData类型对象的年月日都相同时,结果为true,否则为false。

public boolean equals(Object o)

package day14;

public class MyDate {
    public MyDate(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    
    int year;
    int month;
    int day;
    
    
    public boolean equals(Object obj) {//重写equals方法
        int flag = 1;//初始化flag=1,第一层判断,如果传进来的obj不是MyDate类型,跳过第一个if,直接进行true or false的判断。
        
        if(obj instanceof MyDate){
            MyDate md = (MyDate) obj;//强制转换成MyDate类型
            
            flag = 0;//如果传进来的obj是MyDate类型,则把flag初始化为0
            
            if(this.year != md.year){
                flag +=1;//如果有一组不相等,就会flag+1
            }
            
            if(this.month != md.month){
                flag +=1;//两组不相等,flag的值就是2
            }
            
            if(this.day != md.day){
                flag +=1;//全都不相等,flag就是3
            }
        }
        
        if(flag == 0){//只有全部相等,flag才是0
            return true;
        }else{
            return false;
        }    
}
}

赋值测试

package day14;

public class Test {
    public static void main(String[] args){
    
        MyDate m1 = new MyDate(2030,11,23);
        MyDate m2 = new MyDate(2030,11,23);
        
        System.out.println(m1.equals(m2));

    }
}

打印结果为:true

再次赋值测试

package day14;

public class Test {
    public static void main(String[] args){
    
        MyDate m1 = new MyDate(2030,11,23);
        MyDate m2 = new MyDate(2050,11,23);
        
        System.out.println(m1.equals(m2));

    }
}

打印结果为:false

posted @ 2020-03-10 20:54  苏胖胖  阅读(435)  评论(0)    收藏  举报