亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java比較問題詳細分析

2024-07-13 10:15:17
字體:
來源:轉載
供稿:網友

Java中的比較問題是一個很基礎又很容易混淆的問題。今天就幾個容易出錯的點作一個比較詳細的歸納與整理,希望對大家的學習與面試有幫助。

一、==與equals()的區別

首先,我們需要知道==與equals()的區別,==號比較的一直是地址值,對于基本數據類型來說,==比較實際上就是變量數值是否相等,而對于引用數據類型,比較的則是地址值。這里特別需要注意的是String類型,很容易想當然的使用==,很容易出錯。equals()方法是Object類里的方法,我們知道Java中一切類都會默認繼承Object類,所以類對象都會有equals()方法。Object類中equals()方法如下圖所示:

Java,比較問題

由源碼可以看出,Object類里的equals()方法底層也是用的==,所以它比較的其實也是地址值。所以如果想用equals()方法去作其他比較,我們需要重寫equals()方法。

二、基本數據類型及其包裝類

我們都知道,byte、short、int、long、boolean、char、double、float這八個是基本數據類型,它們聲明的變量存放在棧內存中。而它們對應的包裝類型(Byte、Short、Integer、Long、Boolean、Character、Double)定義的變量則存在于堆內存中。對于基本數據類型,它們的比較相對而言較為簡單,即判斷是否相等用==,比較大小用<、>、<=、>=即可。而對于包裝類型,卻有些不同。

首先對于判斷是否相等,看如下代碼的執行結果:

package dailytest;import org.junit.Test;/** * Java中的比較總結 * @author yrr */public class JavaCompareTest {  /**   * Integer類型判斷是否相等   */  @Test  public void test01() {    int n3 = 48;    System.out.println("--------使用new對象時,當值在[-127,128]之間時---------");    Integer n7 = new Integer(48);    Integer n8 = new Integer(48);    System.out.println(n7 == n8);  //false    System.out.println(n7 == n3);  //true    System.out.println("--------直接賦值方式,當值在[-128,127]之間時---------");    Integer n1 = 48;    Integer n2 = 48;    System.out.println(n3 == n1); //true    System.out.println(n1 == n2); //true    System.out.println(n1.equals(n2)); //true    System.out.println(n1.equals(n3)); //true    System.out.println(n1.intValue() == n2.intValue()); //true    System.out.println("--------直接賦值方式,當值不在[-127,128]之間時---------");    Integer n4 = 128;    Integer n5 = 128;    int n6 = 128;    System.out.println(n4 == n5);  //false    System.out.println(n4 == n6);  //true    System.out.println(n4.equals(n5)); //true    System.out.println(n4.equals(n6)); //true    System.out.println(n4.intValue() == n5.intValue()); //true    //使用Integer.intValue()方法時需要注意驗證是否為null,防止出現NullPointException  }  /**   * Long類型判斷是否相等   */  @Test  public void test02() {    //這里需要注意,使用long定義時,不需要加L或者l,而使用Long時必須加,否則會報錯    //建設都加上,以示區別    long n3 = 48L;    System.out.println("--------使用new對象時,當值在[-127,128]之間時---------");    Long n7 = new Long(48);    Long n8 = new Long(48);    System.out.println(n7 == n8);  //false    System.out.println(n7 == n3);  //true    System.out.println("--------直接賦值方式,當值在[-127,128]之間時---------");    Long n1 = 48L;    Long n2 = 48L;    System.out.println(n3 == n1); //true    System.out.println(n1 == n2); //true    System.out.println(n1.equals(n2)); //true    System.out.println(n1.equals(n3)); //true    System.out.println(n1.intValue() == n2.intValue()); //true    System.out.println("--------直接賦值方式,當值不在[-127,128]之間時---------");    Long n4 = 128L;    Long n5 = 128L;    long n6 = 128;    System.out.println(n4 == n5);  //false    System.out.println(n4 == n6);  //true    System.out.println(n4.equals(n5)); //true    System.out.println(n4.equals(n6)); //true    System.out.println(n4.intValue() == n5.intValue()); //true    //使用Long.intValue()方法時需要注意驗證是否為null,防止出現NullPointException    }}

針對上面的執行結果,作如下說明:

首先,對于new方法來聲明一個Integer或者Long對象,因為new對象都是在堆里開辟一塊空間,所以即便兩者的數值相同,但對于==來說,比較的是地址值,所以會返回false。 對于基本數據類型的包裝類,都重寫了equals()方法,會比較數值大小,所以用equals()方法是可以根據數值大小進行判斷的。 對于Integer變量與int變量比較的問題,會發現也是基于數值大小得出來的比較值,這是因為在比較時,Integer類型做了自動拆箱,轉成了int類型。 前三點的解釋,對所有包裝類型都是適用的 對于直接賦值方式,值為48的兩個Integer變量,用==號判斷是true,而當值為128后,卻為false。這是因為在底層,對于Integer n1 = 48;這種直接賦值的方式,其實調用了Integer.value()方法。我們可以簡單看一下Integer.value()方法的源碼,如下圖所示:

Java,比較問題

Java,比較問題

我們可以看到,這里有個if判斷,當輸入的i在[-128,127]的范圍內時,直接從IntegerCache數組中返回了。所以,對于在這個范圍內的數值,返回的都是這個數組對應的地址值,因此用==號判斷會返回true。而不在這個范圍內的,是new出的對象,因此會返回false。這個結論對于Byte、Short、Integer、Long類型都成立(感興趣的可以去看下它們對應的value()方法的源碼),因為Byte類型的范圍就是[-128,127],所以對于Byte類型來說,使用==與equals()沒有區別。 

而對于大小比較,使用>、<、<=、>=是沒有問題的,它們會進行自動拆箱。但是我們通常建議使用以下兩種方式來進行大小比較:

調用xxxValue()方法轉成基本數據類型進行比較 使用compareTo()方法進行比較,在包裝類中,都重寫了compareTo()方法。查看compareTo()源碼,可以看出,其實它底層使用的也是通過自動拆箱轉成了對應的基本數據類型再進行比較的。

Java,比較問題

二、Java對象的比較

有了上面的介紹之后,對象的比較就比較容易了。原理都是一樣的。

1. String類型的比較

需要注意的是,String類型不能直接使用>、<=、>=、<,會報編譯異常。

package dailytest;import org.junit.Test;/** * Java中的比較總結 * @author yrr */public class JavaCompareTest {  @Test  public void test03() {    String s1 = new String("123");    String s2 = new String("123");    System.out.println(s1 == s2);  //false    System.out.println(s1.equals(s2));    String s3 = "234";    String s4 = "234";    System.out.println(s3 == s4);  //true    System.out.println(s3.equals(s4));  //true    //System.out.println(s1 <= s3); //The operator < is undefined for the argument type(s) java.lang.String, java.lang.String    System.out.println(s1.compareTo(s3) < 0);  //true  }}

 2. 類對象的比較

類對象比較結論也是一樣的,但是相對于基本數據類型和String類型,較為復雜一點。

根據某一規則,判斷兩個對象是否相等,需要在被判斷類中重寫equals()方法,示例代碼如下:

package dailytest;import org.junit.Test;/** * Java中的比較總結 * @author yrr */public class JavaCompareTest {  @Test  public void test04() {    Person p1 = new Person("yrr",18);    Person p2 = new Person("yrr",18);    System.out.println(p1 == p2);  //false    System.out.println(p2.equals(p1)); //true  }}class Person{  private String name;    private Integer age;    public Person() {  }  public Person(String name, Integer age) {    this.name = name;    this.age = age;  }  public String getName() {    return name;  }  public Integer getAge() {    return age;  }  @Override  public boolean equals(Object obj) {    Person person = (Person) obj;    return name.equals(person.getName()) && age.equals(person.getAge());  }  }

而如果要比較兩個對象的大小(這也是常會問到的面試題),有兩種方式:

被比較類實現Comparable接口,并重寫compareTo()方法 自己定義實現了一個Comparator接口的類或者利用內部類,重寫compare()方法 兩者的區別:前者定義在被比較類上,而后者定義在被比較類外。通過這種區別,兩者的優缺點也很明顯,前者簡單,但需要對被比較類進行修改,而后者則不需要修改原代碼,更加靈活。

第一種方式,示例代碼如下:

package dailytest;import org.junit.Test;/** * Java中的比較總結 * @author yrr */public class JavaCompareTest {  @Test  public void test5() {    Person p1 = new Person("yrr",18);    Person p2 = new Person("wx",19);    System.out.println(p1.compareTo(p2) < 0);  }}class Person implements Comparable<Person>{  private String name;    private Integer age;  public Person() {  }  public Person(String name, Integer age) {    this.name = name;    this.age = age;  }  public Integer getAge() {    return age;  }  @Override  public int compareTo(Person o) {    return this.getAge() - o.getAge();  }  }

第二種方式,示例代碼如下:

package comparator;import java.util.Arrays;import java.util.Comparator;public class MyComparator {  public static void main(String[] args) {    User[] users = new User[] { new User("u1001", 25),         new User("u1002", 20), new User("u1003", 21) };    Arrays.sort(users, new Comparator<User>() {      @Override      public int compare(User o1, User o2) {        return o1.getAge() - o2.getAge();      }    });    for (int i = 0; i < users.length; i++) {       User user = users[i];       System.out.println(user.getId() + " " + user.getAge());     }   }}class User {   private String id;   private int age;    public User(String id, int age) {     this.id = id;     this.age = age;   }   public int getAge() {     return age;   }   public void setAge(int age) {     this.age = age;   }   public String getId() {     return id;   }   public void setId(String id) {     this.id = id;   } }

以上就是本次給大家講的Java中比較問題的相關內容,大家還有其他問題可以在下方留言區討論,感謝你的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国产三级国产aⅴ9色| 亚洲国产精品va在线看黑人| 97**国产露脸精品国产| 欧美激情亚洲精品| 91精品国产91久久久久久久久| 国产精自产拍久久久久久蜜| 一区二区三区四区视频| 狠狠久久亚洲欧美专区| 97人人爽人人喊人人模波多| 欧美日韩精品二区| 2019av中文字幕| 亚洲激情视频在线| 欧美巨猛xxxx猛交黑人97人| 欧美性极品少妇精品网站| 97国产精品人人爽人人做| 国产成人啪精品视频免费网| 久久精品一区中文字幕| 欧美性在线视频| 久久精品国产一区二区电影| 精品一区二区三区四区| 国产精品久久久久久久久久东京| 午夜精品一区二区三区在线视| 久久久91精品国产一区不卡| 国产美女91呻吟求| 欧美精品一区在线播放| 国产精品亚洲综合天堂夜夜| 自拍偷拍免费精品| 亚洲成人黄色网| 日韩一区二区福利| 亚洲精品国产精品久久清纯直播| 91精品在线播放| 国产精品久久二区| 米奇精品一区二区三区在线观看| 欧美性xxxxxx| 在线观看日韩av| 日韩av最新在线| 夜夜躁日日躁狠狠久久88av| 国产91久久婷婷一区二区| 亚洲成人三级在线| 一本色道久久综合狠狠躁篇的优点| 色哟哟亚洲精品一区二区| 欧美另类在线播放| 亚洲国产精品久久91精品| 亚洲第一福利网站| 亚洲欧美日韩中文在线| 久久精品亚洲精品| 亚洲国产精品免费| 国产视频福利一区| 亚洲成年人在线播放| 亚洲最新在线视频| 亚洲男人7777| 久久久久久久久久久久久久久久久久av| 中文亚洲视频在线| 亚洲一二在线观看| 色偷偷88888欧美精品久久久| 成人国产精品色哟哟| 久久精品国产亚洲精品2020| 欧美极品第一页| 日韩成人高清在线| 欧美性猛交xxxx乱大交极品| 日韩av在线免费| 国产精品亚洲аv天堂网| 久久伊人精品视频| 成年人精品视频| 欧洲亚洲在线视频| 亚洲男人7777| 7777精品久久久久久| 国产精品极品美女粉嫩高清在线| 久久久爽爽爽美女图片| 亚洲欧美激情在线视频| 国产综合福利在线| 92看片淫黄大片看国产片| 在线丨暗呦小u女国产精品| 成人女保姆的销魂服务| 全球成人中文在线| 中文字幕亚洲自拍| 亚洲最新av在线| 成人黄色大片在线免费观看| 国产v综合v亚洲欧美久久| 久久久久亚洲精品成人网小说| 情事1991在线| 成人午夜高潮视频| 亚洲国产美女精品久久久久∴| 国产亚洲欧美日韩精品| 久久成年人视频| 国产精品狼人色视频一区| 亚洲字幕在线观看| 日韩高清人体午夜| 日韩一区二区欧美| 精品无人国产偷自产在线| 在线观看欧美视频| 琪琪亚洲精品午夜在线| 日韩免费中文字幕| 欧美性色视频在线| 欧美日韩在线视频一区| 久久久极品av| 最近2019年中文视频免费在线观看| 一区二区成人av| 国产精品中文久久久久久久| 国产成人精品视频在线| 久久人人爽亚洲精品天堂| 色偷偷偷综合中文字幕;dd| 中文日韩在线视频| 久久久av电影| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产v综合v亚洲欧美久久| 亚洲精品久久久一区二区三区| 久久国内精品一国内精品| 国产精品美女久久| 亚洲国产欧美日韩精品| 国产精品久久久久久五月尺| 国产精品xxxxx| 欧美一区二粉嫩精品国产一线天| 欧美精品18videosex性欧美| 欧美日韩一二三四五区| 亚洲在线视频观看| 国产美女久久精品香蕉69| 91精品国产自产在线老师啪| 日韩a**站在线观看| 日韩精品在线免费播放| 国产成人在线播放| 亚洲韩国日本中文字幕| 亚洲成色777777在线观看影院| 国产小视频91| 国产精品欧美一区二区三区奶水| 亚洲午夜小视频| 一本色道久久综合狠狠躁篇怎么玩| 国产美女精品免费电影| 久久精品中文字幕免费mv| 亚洲精品视频播放| 日韩一区二区av| 庆余年2免费日韩剧观看大牛| 日韩av电影免费观看高清| 精品福利在线观看| 少妇精69xxtheporn| 国产一区二区三区毛片| 国产精品永久免费在线| 91久久精品一区| 91精品久久久久久久久久久久久久| 欧美日韩激情视频8区| 亚洲国产精品大全| 日韩av在线网页| 亚洲天堂成人在线视频| 亚洲人成电影在线观看天堂色| 高清视频欧美一级| 丝袜情趣国产精品| 国产精品日韩专区| 国产成人福利网站| 日韩av片永久免费网站| 日韩视频免费中文字幕| 国产香蕉精品视频一区二区三区| 日韩av影视综合网| 欧美午夜激情在线| 奇米影视亚洲狠狠色| 奇米成人av国产一区二区三区| 日韩欧美精品免费在线| 亚洲欧洲一区二区三区在线观看| 国产福利精品视频| 久久久久久成人精品| 北条麻妃一区二区在线观看| 日韩高清电影好看的电视剧电影| 亚洲欧美国产日韩天堂区| 久色乳综合思思在线视频| 欧美乱大交xxxxx|