首页 > 试题广场 >

关于以下程序段,正确的说法是:() String s1="a

[单选题]
关于以下程序段,正确的说法是:()
String s1="abc"+"def";//1
String s2=new String(s1);//2
if(s1.equals(s2))//3
System.out.println(".equals succeeded");//4
if(s1==s2)//5
System.out.println("==succeeded");//6
  • 行4,行6都不执行
  • 行6执行,行4不执行
  • 行4执行,行6不执行
  • 行4,行6都将执行
问:String s1="abc"; s2="abc"; s3= new String("abc");为啥s1和s2的地址值一样而s1和s3的就不一样呢?也就是,为什么 s1==s2但s1!=s3呢?

答:先是在内存里创建了一个abc字符串,然后s1指向abc,s2要指向abc,内存中已经有abc,所以s1和s2地址相同,s3指向的是新字符串abc的地址,所以s1与s3不同,s1==s2但s1!=s3,因为s1,s2,s3是引用,比较的是地址而不是内容,所以有这个结果,比较值是否相同应该用。equal函数而不能直接用==

发表于 2015-09-28 15:15:22 回复(6)
C:
无论是C++还是JAVA程序,s2调用了new,是在heap上创建了字符串;
而s1是在stack上,直接比较s1和s2肯定是不同的。但是equal函数(当然,C++中String是没有equal成员函数的)比较的是字符串元素的ACSII值,他们是由于他们的元素对应相等的,所以结果是4执行,6不执行;


发表于 2015-09-28 19:04:21 回复(1)
     比较两个变量是否相等有两种方式:“==”和equals()方法
“==”运算符
  • 如果两个变量是基本数据类型,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就将返回true
  • 对于两个引用类型变量,只有当他们指向同一个对象时,==判断才会返回true
  • ==不可以用于比较类型上没有父子关系的两个对象
equals()方法
  • 由Object类提供的实例方法,因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等,但是使用这个方法判断两个对象是否相等的标准与使用“==”没有区别,同样要求两个引用变量指向同一个对象才返回true。如果希望采用自定义的相等标准,则需要重写equals方法
  • String类重写了equals方法,重写后equals方法的比较标准是:两个字符串所包含的字符序列相同,则返回true,否则返回false
发表于 2017-06-15 17:48:26 回复(0)
答案选C
String s1="abc"+"def";//1等同于语句 String s1 = "abcdef";
编译器对于字面量都直接计算,储存在常量池,
String s2=new String(s1);//2
使用new关键字创建String 对象 s2 在堆栈中都开辟内存空间,字符串"abcdef"的值存在栈中
s2中存的是指向字符串"abcdef"的地址,存在堆中;
s1.equals(s2)
equals 判断内容值相等 此语句返回true 所以接着行4被执行
== 判断的是地址值相等,显然s1==s2为false。所以行6不被执行

发表于 2015-09-30 17:31:41 回复(2)
第二行那个左括号'('是中文的,编译不能通过,都不执行????
发表于 2019-05-31 16:21:37 回复(0)
我想起了祥林嫂的那句话:我真傻
发表于 2018-12-22 20:21:39 回复(0)
equals和==的区别,前面的大佬说的很清楚了,不再赘述,不过这道题if后面都没加大括号,后面又只跟了一条语句,所以看不出区别,要是我出题的话,在第6行后面也加条打印的语句,哈哈
发表于 2018-06-13 15:04:45 回复(0)
c 是对的,equals()比较的是字符串的内容,==比较的是内存地址值 s1存放在常量池中 s2存放在堆区中  内存地址值是不一样的
发表于 2017-09-02 21:36:24 回复(0)
注意:String类重写了Object类的equals()方法,比较的是字符串内容!
“==”比较的是引用地址的内容!
发表于 2017-02-19 23:31:13 回复(0)
考察两个问题:
1. equals 方法与 == 的区别,具体可参见我的博客 “http://blog.csdn.net/justloveyou_/article/details/52464440”;
2. String 对象的创建方式,包括 new 方式 和 字符串字面值创建方式,具体可参见我的博客 “http://blog.csdn.net/justloveyou_/article/details/52556427”,希望多多指教!
发表于 2016-12-05 14:52:44 回复(0)
equals比较的是内容,==比较的是地址
发表于 2016-02-10 07:03:49 回复(0)
equals是比较字符串的内容是否相等,而 == 对于String对象是比较是否为同一个String对象。
不知道这样解释你能理解吗
发表于 2015-09-28 23:08:28 回复(0)
equal比较对象的值,==比较地址。
发表于 2016-04-06 21:56:28 回复(8)
我就问一句,谁在实际项目中会写出
String s1="abc"+"def";//1
String s2=newString(s1);//2
这样的代码??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
发表于 2016-10-14 14:12:06 回复(2)
c 是对的,equals()比较的是字符串的内容,==比较的是内存地址值
s1存放在常量池中 s2存放在堆区中  内存地址值是不一样的
发表于 2015-10-06 23:47:18 回复(9)
String类重写了Object类的equals方法,使其由比较引用变为了比较引用所指向的字符串内容是否一样。
发表于 2016-08-07 22:14:33 回复(0)
s1前面用了个中文括号,应该编译报错才对
发表于 2025-03-07 20:33:51 回复(0)
对于基本数据类型 equals与==的作用是一样的,比较值的相等,实际也是比较地址值,但对于基础数据类型的值,是存在常量池中,所以地址是一样的 而对于引用数据类型,比较的则是引用对象的地址值
编辑于 2019-10-21 15:16:57 回复(0)
这题考察字符串,以及==和equals()。
字符串分为静态和动态创建。
静态创建:字面量、常量、字面量运算得到的结果、常量运算得到的结果都是静态的,存放在常量池中。
动态创建:字符串变量运算结果、使用new关键字创建的字符串都是动态创建的,存放在堆内存中,是不同的对象。

==:
  • 对于基本数据类型,==只比较数据值是否相等。
  • 对于引用类型,==比较两个对象的引用值是否相等。

equals
  • 默认的equals方法,是使用==进行比较的。
  • 但是String字符串类重写了该equals方法,将其变成了内容比较。即:比较两个对象的内容是否相等。
发表于 2019-07-06 20:47:02 回复(0)
地址不一样
发表于 2019-05-17 11:23:24 回复(0)