Java中关于String类的常见面试题

第一题:

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,相同字符串则为真
	}

}

内存图解释如下:
Java中关于String类的常见面试题
字符串在常量池中创建,如果没有就创建,如果有就不用创建了,返回的地址值是相同的,所以s1 == s2 是正确的

第二题:

2.下面的程序创建了多少个对象? (两个)

public static void main(String[] args)
{
    String s1=new String("abc");
}

解释如下:
Java中关于String类的常见面试题
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

Java中关于String类的常见面试题