第一题:
package com.xian.fang;
public class Demo4_String {
public static void main(String[] args) {
String s1 = "abc"; //常量池中没有这个字符串对象,就创建一个,如果有直接用就可
String s2 = "abc";
System.out.println(s1 == s2); //true,比较两个引用数据类型的地址值
System.out.println(s1.equals(s2)); //true,相同字符串则为真
}
}
内存图解释如下:
字符串在常量池中创建,如果没有就创建,如果有就不用创建了,返回的地址值是相同的,所以s1 == s2 是正确的
第二题:
2.下面的程序创建了多少个对象? (两个)
public static void main(String[] args)
{
String s1=new String("abc");
}
解释如下:
1.main方法进栈,String s1进栈
2.对于"abc",首先到常量池找"abc",如果没有就创建,
3.对于new String,在 堆里面创建一个对象,有着自己的地址值,然后把常量池里面的"abc"拷贝一份副本交给堆里里面的对象,
4.然后堆里面的对象将地址值传给s1,s1通过地址值就找到了这个实体
第三题:
3.下面程序段的执行结果是?(D)
public static void main(String[] args)
{
String s1=new String("abc");
String s2="abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
A. true true B.true false C.false false D.false true
解释:s1是对内存地址值,s2是常量池地址值
第四题:
4.下面程序执行的结果是?(A)
public static void main(String[] args)
{
String s1="a"+"b"+"c";
String s2="abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
A. true true B.true false C.false false D.false true
解释:Java有常量优化机制,在编译时就变成abc了
第五题:
4.下面程序执行的结果是?(A)
5.下面程序的执行结果是?(D)
public static void main(String[] args)
{
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s3==s2);
System.out.println(s3.equals(s2));
}
A. true true B.true false C.false false D.false true
解释:
1.常量池创建s1,s2,并给定地址值
2.调用StringBuffer,在堆内存生成对象,再调用toString转换成String,最后把地址值赋值给s3