在java中常常會遇到作比較,比較大小、比較是否等值,那麼有哪些比較方法,他們之間又有什麼區別呢?java
一,先介紹一下==與equals()面試
==號比較的一直是地址值,ide
①對基本數據類型,==比較實際上就是變量數值是否相等,this
②對引用數據類型,比較的則是地址值。這裏特別須要注意的是String類型,很容易想固然的使用==,很容易出錯。equals()方法是Object類裏的方法,咱們知道Java中一切類都會默認繼承Object類,因此類對象都會有equals()方法。spa
2、基本數據類型及包裝類code
①基本類型大概有byte、short、int、long、boolean、char、double、float這八類,它們聲明的變量存放在棧內存中。 判斷是否相等用==,比較大小用<、>、<=、>=便可對象
②它們對應的包裝類型(Byte、Short、Integer、Long、Boolean、Character、Double)定義的變量則存在於堆內存中。繼承
用new方法來聲明一個Integer或者Long對象,由於new對象都是在堆裏開闢一塊空間,因此即使二者的數值相同,但對於==來講,比較的是地址值,因此會返回false。(工做中就遇到這種狀況)接口
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
鑑於上述問題 能夠採用兩種方式作比較內存
3、 java對象比較
一、String類型的比較 (String類型不能直接使用>、<=、>=、<)
二、 類對象的比較 (判斷兩個對象是否相等,須要在類中重寫equals()方法)
若是要比較兩個對象的大小(這也是常會問到的面試題),有兩種方式:
/** * 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; } }