首页 > 试题广场 >

假设有以下代码String s = "hello":Stri

[单选题]
假设有以下代码String s = "hello";String t = "hello";char c [ ] = {'h','e','l','l','o'};下列选项中返回false的语句是?
  • s.equals (t);
  • t.equals (c);
  • s==t;
  • t.equals (new String ("hello"));
推荐
首先==与equals是有明显区别的。
==强调栈中的比较,可以理解为地址比较
equals强调对象的内容比较
String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。
String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。 所以,s==t返回true,s.equals(t)也是true。
char c[]={'h','e','l','l','o'}; c==s这个是不存在的,==两边类型不同
t.equals(c)这个语句在anObject instanceof String这步判断不会通过,也就是cha[] 压根不能与String相比较,类型不是相同的。返回false
编辑于 2018-06-20 15:29:42 回复(32)
看一下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;
    }

很明显。char[]不是String的对象所以。返回肯定是false了。
发表于 2015-03-24 09:21:11 回复(5)
1. java数据类型分为:
        *  基本数据类型
        引用数据类型

2.对于"=="
        *用于基本数据类型相互比较. 比较二者的值是否相等.
        *用于引用数据类型相互比较. 比较二者地址是否相等.
        *不能用于基本数据类型与引用型比较.

3.对于"equals":
        * 不能用于基本数据类型比较(因为这是一个方法, 继承自object).
        *用于进行对象的比较, 比较二者的引用地址是否相同.

 4.特殊情况:
        1)数值型基本类型和数值型类会存在自动装箱自动拆箱.
        2)字符串会以常量形式存在, 如果多个字符串变量值相同, 则他们指向同一个地址.
        3)数值类型会存在类型自动转换.

5.本题对照上面规则解题.

6.附上java类型图示:

编辑于 2016-10-06 11:17:29 回复(9)
Sting 类保存字符串只是保存所有单单的字符串;
而 char[] 字符数组 会在最后自动加上'\n';
所以B:t.equals(c)会返回fasle;
所以 答案B
编辑于 2018-06-20 15:29:42 回复(24)
B.
"=="比较的是地址值
“.equals()”比较的是值是否相等
s和t都是指向字符串常量池中的同一个常量,所以地址值相等
发表于 2015-08-13 16:50:12 回复(0)
B.瞅瞅源码equals方法:可以看出B的答案是错滴。
  1. public   boolean  equals(Object anObject) {  
  2.         if  ( this  == anObject) {  
  3.             return   true ;  
  4.         }  
  5.         if  (anObject  instanceof  String) {  
  6.             String anotherString = (String) anObject;  
  7.             int  n = value.length;  
  8.             if  (n == anotherString.value.length) {  
  9.                 char  v1[] = value;  
  10.                 char  v2[] = anotherString.value;  
  11.                 int  i =  0 ;  
  12.                 while  (n-- !=  0 ) {  
  13.                     if  (v1[i] != v2[i])  
  14.                             return   false ;  
  15.                     i++;  
  16.                 }  
  17.                 return   true ;  
  18.             }  
  19.         }  
  20.         return   false ;  
  21.     }

对于s==t的理解解释来源于(http://blog.csdn.net/yihuiworld/article/details/13511925)
  1. String a =  "hello" // 先在栈中创建一个对String类的对象引用变量a,然后通过符号引用去字符串常量池里找有没有"hello",如果没有,则将"hello"存放进字符 串常量池 ,并令a指向"hello",如果已经有"hello"则直接将a指向"hello"    -->  产生1个对象及1个引用   
  2. String b = "hello" // 先在栈中创建一个对String类的对象引用变量b,然后通过符号引用去字符串常量池里找有没有"hello",因为之前在常量池中已经 有"hello",所以直接将b指向"hello"    -->  因为不需要在常量池产生"hello",所以只是在栈中产生1个引用   
  3. String newA = new  String( "hello" );  // 先在栈中创建一个对String类的对象引用变量newA,然后new()操作会在heap堆中产生一个新的对象"hello",并将newA指向堆中 的"hello",同时检查String pool常量池中是否有对象"hello",如果没有也产生一个对象"hello",如果有则不产生,因为这里 之前已经在常量池中产生过了,所以   -->  只需要产生1个对象及1个引用   
  4. String newB = new  String( "hello" );   //因为new每次都会保证在heap堆内存中产生新的对象,并将栈中的引用指向对应的堆中的地址,所以此语句同上一条的处理  

发表于 2015-03-06 14:46:55 回复(2)
    String s = "hello";
		String t = "hello";
		char c [ ] = {'h','e','1','1','o'};
        System.out.println(s.equals (t)); //true  s和t指向内存常量区的同一个字符串  ;
        System.out.println(t.equals (c));//false 一个返回字符串,一个返回对象 ;
        System.out.println(s==t);// true  s和t指向内存常量区的同一个字符串 ;
        System.out.println(t.equals (new String ("hello")));//true equal用于比较两个对象的值是否相同,和内存地址无关 

编辑于 2015-10-01 20:20:42 回复(3)
对于String的“==”和“equals”,“==”是地址的相等,“equals”是值的相等。

A是值比较,没有问题。B是String类型和char类型的值比较,不是把String和Char看成一种类型,char[]数组最后会加结束符“\n”。C选项如果两个String的值一样都是“hello”,第二个String在创建的时候,指向堆的时候,先检查String pool常量池中是否有对象"hello",如果没有也产生一个对象"hello",如果有则不产生,所以返回true。D是值比较

发表于 2021-11-15 09:55:29 回复(0)
B错  
String 类的equals方法重写了父类的equals方法,它是会首先判定是不是string类型,再去判定里面的值是否相等,所有B错
发表于 2017-06-19 09:12:54 回复(0)
A:是比较值,显然true。B:t和c不是一个类型,不相等,false。C:s,和t都是“hello”,而且hello在静态常量中,所以地址相同,true。D:值比较,true。所以答案是B。
发表于 2015-04-13 17:28:58 回复(0)
  • ==
    用于判断两引用是否指向同一对象;
  • equals
    用于判断两对象内容是否相同;
发表于 2020-05-17 11:03:00 回复(0)
B:类型不匹配
A,D:equals方法比较的是内容,所以都是正确的;
C:s和t只是String类型变量,并不是new String对象,所以相等
发表于 2017-04-03 13:51:35 回复(0)
在java中,字符串和字符数组不是一个概念,String是类,而char[]是数组。
String s = "hello";  char [] c = {'h','e','l','l','o'};
字符串转字符数组 char [] ch = s.toCharArray();
字符数组转字符串 String str = String.valueOf(c);
注意:此时比较c == ch 或 s == str 依然是 false,因为调用以上两种方法,都相当于new 了一个新对象,地址是新的。
发表于 2022-04-21 20:16:17 回复(0)
相同字符串new的时候地址相同;==比较引用的地址;String类重写了equals,比较内容,但c不是String
发表于 2022-03-09 00:42:10 回复(0)
所有类都默认继承自 Object 类,都拥有 Object 类所拥有的方法。基本数据类型之间的比较只能使用 == 引用数据类型既可以使用 == 也可以使用 equals 如果没有重写 equals 方法,其实就和 == 一个性质,即比较对象的内存地址是否相同。String 和 Date 类重写了 equals 方法所以比较的是内容是否相同。equals 比 == 更好的点在于,可通过重写 来定义比较规则
发表于 2021-02-02 12:37:27 回复(0)
要么数据类型不一致,选项C如果用new就是flase。我是觉得没选的。
编辑于 2017-08-28 09:19:32 回复(0)
首先==与equals是有明显区别的。
==强调栈中的比较,可以理解为地址比较
equals强调对象的内容比较
String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。
String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。 所以,s==t返回true,s.equals(t)也是true。
char c[]={'h','e','l','l','o'}; c==s这个是不存在的,==两边类型不同
t.equals(c)这个语句在anObject instanceof String这步判断不会通过,也就是cha[] 压根不能与String相比较,类型不是相同的。返回false
发表于 2016-06-16 16:02:29 回复(0)
C为什么不返回false
发表于 2015-09-16 21:10:54 回复(1)
字符数组c定义的里面是 1 不是 l 哈哈哈....
发表于 2015-05-07 19:28:32 回复(1)

B

发表于 2015-03-26 11:38:24 回复(0)
B
发表于 2015-03-07 11:35:32 回复(0)