首页 > 试题广场 > 若有下列定义,下列哪个表达式返回false?
[单选题]

若有下列定义,下列哪个表达式返回false?

String s = "hello";

String t = "hello";

char c[] = {'h','e','l','l','o'} ;

  • s.equals(t);
  • t.equals(c);
  • s==t;
  • t.equals(new String("hello"));
推荐

答案是:B

Java又不是C++,什么时候字符数组等于字符串了(对这句话我不负责任)?

而常量池中的字符串,只有变量名不同是可以用双等号判断是否相等的,内存都是常量池中的字符串。

但是new出来的字符串,只能用equals,用双等号是不相等的,因为是两个内存对象。

public class HelloWorld {
    public static void main(String []args) {
        String s = "hello";
        String t = "hello";
        char c[] = {'h','e','l','l','o'} ;
        System.out.println(s.equals(t));
        //c++中定义的东西,不要在java中混为一谈。(对这句话我不负责任)
        System.out.println(t.equals(c));
        System.out.println(s==t);
        System.out.println(t.equals(new String("hello")));
        //这个不相等,因为语句中new的字符串不在常量池,是在堆
        System.out.println(t==new String("hello"));
        //这样可以判断字符数组与字符串是否包含同样的字符序列
        System.out.println(t.equals(new String(c)));
    }
}
编辑于 2019-04-25 14:50:41 回复(1)
答案:B
可以简单理解为equals比较的是内容,==比较的是地址,由于string有个字符串常量池,所以equals和==都是OK的,就算new重新分配一个新string字符串,但是内容也是相等的,所以ACD都对。
发表于 2019-06-11 10:32:36 回复(0)
选B。
A、D选项是对字符串内容的比较。JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池。代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。所以返回true。
C选项是引用地址的比较,同上也属于常量池的同一个字符串地址,所以相等返回true。

编辑于 2019-04-24 16:33:56 回复(1)
B: 1. 可以从源码入手
String的equals首先判断比较的对象是否相等,相等返回true
然后判断参数是不是String类型,是String类型才会进行比较,否则直接返回false
2. 如果是c.equals(t) 依旧是false,因为数组是object对象,会调用object的equals方法,返回false
发表于 2019-07-11 14:59:30 回复(0)
String 对equals()方法进行重写,所以这题中A、C、D内容都是"hello",所以A、C、D都正确,就只有选B了
发表于 2019-04-25 11:28:18 回复(0)
定义s = "hello"时是在常量池中定义的,定义t时直接指向 常量池中的s,所以s=t,且字符串内容相同,所以s.equal(t)
t.equals(new String("hello"));也是正确的,因为字符串的值相等
但是java中字符串引用类型为字符数组,String引用类型为字符串,引用类型和内容均不相同,所以B错。

发表于 2019-09-09 21:22:18 回复(0)
为啥都说d是对的
发表于 2019-07-17 14:12:13 回复(1)
java字符串值不等于字符数组,常量引用赋值是同一个地址
发表于 2019-06-24 09:41:27 回复(0)
B   string 对equals重写了   equals比较的是内容   ==比较的是指向的是否是同一对象

编辑于 2017-06-09 21:42:41 回复(1)
字符串不等于字符数组
发表于 2019-10-03 22:32:01 回复(0)

答案是B


是不是有想选C的 ?

C输出是true 因为字符串在内存中存在于方法区

当方法区存已经在了一个String a ="hello"时,如果又出现一个String s = "hello" 那么他们俩都会引用这个内存地址,不会创建新的 除非你String s =new String("hello")

那么这时候 这个new出来的s==a就是false了。

发表于 2019-09-24 00:01:28 回复(0)
public class Demo {
    public static void main(String[] args) {
        String s = "hello";
        String t = "hello";
        char c[] = { 'h', 'e', 'l', 'l', 'o' };
        System.out.println(s.equals(t));// true
        // Unlikely argument type for equals(): char[] seems to be unrelated to String
                // c会出现小波浪线
        System.out.println(t.equals(c));// false
        System.out.println(s == t);// true
        System.out.println(t.equals(new String("hello")));// true
    }
}
// Unlikely argument type for equals(): char[] seems to be unrelated to String
没有此参数类型的equals()方法: char[]的参数类型似乎与字符串无关
说说B选项吧,t.equals(c)通过查看源码是采用String类的equals方法比较,源码如下:
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        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;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
显然是return false,其他选项同理。


发表于 2019-09-05 16:52:48 回复(0)
AC参考常量池。D重写了方法并且new的对象会在常量池中找,如果有就指向了。 综合选B。
发表于 2017-07-09 12:52:44 回复(1)
C
发表于 2017-06-09 14:41:49 回复(0)
有一个没有答案的,,是B吗?
发表于 2017-06-07 20:10:08 回复(0)