A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 hydee 于 2018-12-20 16:02 编辑

1、以下语句的输出结果是:
[Java] 纯文本查看 复制代码
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2);//1
System.out.println( s1.equals(s2) );//2
      由于s1为编译时能确定的字符串常量,在字符串池中会创建一个“abc”字符串,当新定义的字符串常量与池中的字符串相同时,虚拟机会检测池中是否有相同的字符串,如果相同,则将池中的字符串地址传递给新的变量,所以此处s1==s2将返回true,而且String类重写了equlas()方法,比较的是字符串的值,所以s1.equals(s2)也是返回true.
2 String s1=new String(“abc”) 语句创建了几个对象?
       该语句首先String s1是声明,new String(“abc”)先在常量池中查找,若没有则创建“abc”,而后通过new在堆内存中创建对象,把“abc”拷贝赋值。String 定义为初始化一个新创建的 String 对象,表示一个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的一个副本。故创建常量池和堆内存中两个对象,两个对象的地址值不一样。
3、以下语句的输出结果是:
[Java] 纯文本查看 复制代码
String s1 = "abc";
String s3 = new String("abc");
System.out.println(s1==s3);
System.out.println( s1.equals(s3) );
    综合第1和第2题,我们知道了String s1 = "abc"会在字符串池中创建“abc”对象,String s3 = new String("abc")时,虚拟机检测到字符串池中有“abc”对象,所以只在堆中创建“abc”,并将引用指向s3,所以s1==s3将打印false(s1指向的字符串在常量池中,s3指向的字符串在堆中),s1.equals(s3)比较的是值,所以输出true。
4、以下语句的输出结果是:
[Java] 纯文本查看 复制代码
String s1="a"+"b"+"c";
String s2="abc";
System.out.println(s1==s2);
System.out.println( s1.equals(s2) );
    本题主要考察java中常量优化机制,编译时s1已经成为“abc”,并在常量池中保存一份,故String s2="abc",在常量池中查找创建,s2不需要再创建。所以s1和s2指向同一个对象,故两个结果都输出true。
5以下语句的输出结果是:
[Java] 纯文本查看 复制代码
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s3==s2);
System.out.println(s3.equals(s2));
     Java 语言提供对字符串串联符号(”+”)和其他对象到字符串的转换的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的,字符串转换是通过 toString 方法实现的。在本题中,先在常量池中创建”ab“,地址指向s1,再创建”abc”,指向s2。对于s3,先创建StringBuilder(或 StringBuffer)对象,通过append连接得到“abc”,再调用toString()转换得到的地址指向s3。故(s3==s2)为false。
6、下面的代码输出什么?
[Java] 纯文本查看 复制代码
String s1 = "abc";
String s2 = new String("abc");
s2 = s2.intern();
System.out.println(s1 ==s2);
     输出true,intern()方法将返回从常量池中的字符串对象的引用。当intern()方法被调用,如果常量池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马