咱们都晓得 Java 是动态的、强制类型的语言。也就是申明的每个变量都必须申明该变量的类型。

Java 中的变量类型能够分为两类:援用类型(primitive type)和根本类型(reference type)。援用类型 reference to object,根本类型 directly contain value。

public static void main (String[] args) {    String str = new String("hello"); // 援用类型    int age = 12; // 根本类型}

== 比拟两个变量是否相等

== 用来比拟 Java 变量中值是否相等时,对不同的变量类型有不一样的比拟策略。

对于根本类型变量,== 比拟的是两个根本类型变量的值是否相等。
对于援用类型变量,== 比拟的是两个援用类型变量的地址值是否相等。

public static void main (String[] args) {    Person person = new Person("xiaoyu", 12);    Person person1 = new Person("xiaoyu", 12);    int amount1 = 12;    int amount2 = 20;    int amount3 = 12;    System.out.println(person == person1); // false    System.out.println(amount1 == amount2); // false    System.out.println(amount1 == amount3); // true}

equals 比拟两个变量是否相等

equals 办法是 Java 语言中 Object 类(根类)的办法。Java 中所有其余的类都继承自该类。

Object 类中 equals 办法的默认实现是:

/** * 比拟其余对象与该对象是否相等。默认的比拟形式是:== */public boolean equals(Object obj) {    return (this == obj);}

所以,用 equals 办法比拟两个变量是否相等的时候,是要看具体的对象所对应的类中的 equals 办法的具体实现的。因为 equals 办法有可能被重写。

String 类就重写了 Object 类的 equals 办法。比拟的是两个字符串对象的字符序列是否相等。

/** * Compares this string to the specified object.   * The result is {@code * true} if and only if  * the argument is not {@code null} and is a  * {@code * String} object that represents the  * same sequence of characters as this object.  *  * <p>For finer-grained String comparison, refer to * {@link java.text.Collator}. *  * @param anObject *   The object to compare this {@code String} against *  * @return  {@code true} if the given object represents a {@code String}  *          equivalent to this string, {@code false} otherwise  *  * @see  #compareTo(String) * @see  #equalsIgnoreCase(String) */ public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String aString = (String)anObject;        if (coder() == aString.coder()) {            return isLatin1() ? StringLatin1.equals(value, aString.value)                              : StringUTF16.equals(value, aString.value);        }    }    return false;}

企业开发中对两者的使用

晓得原理是根底,懂得了原理咱们能力在理论开发中更好的使用。

在理论的企业开发中:

  1. 对于根本类型变量的比拟,通常应用 == 来进行比拟。
  2. 对于字符对象的比拟,通常应用 equals 办法来进行比拟。
  3. 对于其余类型对象之间,个别倡议应用 == 来进行比拟,不要应用 equals 来进行比拟。因为有可能会造成线上故障。

针对第三个倡议,举一个例子来阐明起因:

public class TestPackaging {    public static void main (String[] args) {        Order order = new Order();        order.setStatus(Status.New);        // 应用 equals 来判断是否相等        if (!Status.New.equals(order.getStatus())) {            System.out.println("转账100元");        }            }}enum Status {    New, Created}class Order {    private Status status;    public Status getStatus() {        return status;    }    public void setStatus(Status status) {        this.status = status;    }}

若有人把 Order 类中的 status 变量的类型改成 String 的话。

class Order {    private String status;    public String getStatus() {        return status;    }    public void setStatus(String status) {        this.status = status;    }}

编辑器在执行动态查看的时候是失常的,是不会报警的。那么上面这段逻辑将永远为 false。如果这条判断语句里执行的是很重要的代码。那么就会造成资损等重大的线上故障。

应用 == 来比拟的话就能防止这种人工很难发现的谬误。因为在编译器就会查看出谬误。