java中equals和==的区别.doc
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和引用类型(reference type)。基本类型的变量直接存储在栈中,而引用类型的变量在栈中仅仅存储了对象的引用,而对象本身存储在堆中。 ==运算符比较的是两个变量的值是否相等,对于引用类型的变量,==运算符比较的是两个变量在堆中的地址是否相同,即栈中的内容是否相同。这意味着,如果两个变量引用的是同一个对象,那么 == 运算符将返回 true。 equals 运算符则比较的是两个变量是否引用的是同一个对象,即堆中的内容是否相同。equals 运算符可以用于比较两个对象的内容是否相同,而不仅仅是比较它们的引用是否相同。 让我们通过一个简单的示例来说明这两者的区别: public class TestString { public static void main(String[] args) { String s1 = "Monday"; String s2 = "Monday"; if (s1 == s2) { System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } } } 在上面的代码中,s1 和 s2 都是字符串常量,它们的值都是 "Monday"。编译并运行这个程序,输出结果是 "s1 == s2",这意味着 s1 和 s2 引用的是同一个字符串对象。 现在,让我们修改代码,使用 new 运算符创建一个新的字符串对象: public class TestString { public static void main(String[] args) { String s1 = "Monday"; String s2 = new String("Monday"); if (s1 == s2) { System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { System.out.println("s1 not equals s2"); } } } 这时,输出结果是 "s1 != s2" 和 "s1 equals s2"。这意味着,s1 和 s2 引用的是不同的字符串对象,但是它们的值相同。 这也解释了为什么我们不能使用 == 运算符来比较两个字符串对象的值,而应该使用 equals 运算符。 在 Java 中,还有一个字符串缓冲池的概念。当我们使用字符串常量时,Java 会在缓冲池中查找相同值的对象,如果找到了,那么将返回该对象的引用。如果没有找到,那么将创建一个新的字符串对象。 因此,在上面的代码中,s1 和 s2 分别引用了两个不同的字符串对象,虽然它们的值相同。使用 intern() 方法可以将 s2 的值加入缓冲池中,这样可以避免创建新的字符串对象。 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。我们应该根据实际情况选择合适的运算符,以避免编程中的错误。