若有下列定义,下列哪个表达式返回false?
String s = "hello"; String t = "hello"; char c[] = {'h', 'e', 'l', 'l', 'o'} ;
equals() 方法存在两种使用情况:
public class test1 { public static void main(String[] args) { String a = new String("ab"); // a 为一个引用 String b = new String("ab"); // b为另一个引用,对象的内容一样 String aa = "ab"; // 放在常量池中 String bb = "ab"; // 从常量池中查找 if (aa == bb) // true System.out.println("aa==bb"); if (a == b) // false,非同一对象 System.out.println("a==b"); if (a.equals(b)) // true System.out.println("aEQb"); if (42 == 42.0) { // true System.out.println("true"); } } }
说明:
String s = "hello";
public static void main(java.lang.String[]); Code: 0: ldc #2 // String hello 2: astore_1 3: ldc #2 // String hello 5: astore_2String A = "hello";内存会去查找永久代(常量池) ,如果没有的话,在永久代(JDK1.7之前)中开辟一块儿内存空间,把地址付给栈指针,如果已经有了"hello"的内存,直接把地址赋给栈指针;
public boolean equals(Object anObject) { //如果是和自身进行比较,则直接返回true if (this == anObject) { return true; } //如果该对象不是String类型,返回false if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; //遍历两个字符串对应的字符数组,判断它们的对应位置上元素是否相同,不同则返回false while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }在进入到这个方法后,会判断这个字符数组是否是String类的实例,显然不是,直接返回false。
答案是:B
Java又不是C++,什么时候字符数组等于字符串了(对这句话我不负责任)?
而常量池中的字符串,只有变量名不同是可以用双等号判断是否相等的,内存都是常量池中的字符串。
但是new出来的字符串,只能用equals,用双等号是不相等的,因为是两个内存对象。