Java String面试题以及答案(待更新...)

1.下面程序的运行结果是:false

String str1="hello";
String str2=new String("hello");
System.out.println(str1==str2);
解析:
	str1没有使用new关键字,在堆中没有开辟空间,其值”hello”在常量池中,str2使用new关键字创建了一个对象,
	在堆中开辟了空间,”==”比较的是对象的引用,即内存地址,所以str1与str2两个对象的内存地址是不相同的。

2.给定以下代码,程序的运行结果是

public class MyString{

	private String str=new String("good");
	private char [] ch={'a','b','c'};
 
	public static void main(String[] args) {
		MyString myString = new MyString();
		myString .change(myString .str, myString .ch);
		System.out.println(myString .str+"and");
		System.out.println(myString .ch);
	}
	 
	public void change(String  str,char ch[]){
		str="test ok";
		ch[0]='g';
	}
}
运行结果:
	goodand
	gbc
解析:
	在方法调用时,在change方法中对str的值进行修改,是将str指向了常量池中的”test ok”,
	而主方法中的myString.str仍然指向的是常量池中的”good”。字符型数组在方法调用时,
	将主方法中myString.ch的引用传递给change方法中的ch,指向是堆中的同一块空间,
	所以修改ch[0]的时候,myString.ch可以看到相同的修改后的结果。

3.String s=new String(“abc”);创建了几个String对象

两个或者一个。只要使用了new关键字,在堆内存都会创建一个对象。"abc"也是一个对象,存放在常量池中。
如果常量池中已经存在"abc",就不会再创建"abc"了,而是直接使用已经存在的"abc";如果"abc"不存在,再创建它。

4.写一个方法,实现字符串的反转,如:输入abc,输出cba

public static String reverse(String origin) {
    //方式1
    //return new StringBuffer(origin).reverse().toString();
    //方式2
    /*String end = "";
    for (int i = origin.length()-1; i >= 0; i--) {
        end += origin.charAt(i);
    }*/
    //方式3
    StringBuilder end = new StringBuilder("");
    for (int i = origin.length()-1; i >=0 ; i--) {
        end.append(origin.charAt(i));
    }
    return end.toString();
}

5.String和StringBuilder、StringBuffer的区别?

Java提供了两种类型的字符串:String和StringBuffer/StringBuilder。
相同点:
	它们都可以储存和操作字符串,同时三者都使用final修饰,都属于最终类不能被继承。
不同点:
	String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。
	StringBuffer和StringBuilder表示的字符串对象可以直接修改,在修改的同时地址值不会发生改变。
	StringBuilder是JDK1.5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,
	因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。
	
	String、StringBuffer、StringBuilder三者类型不一样,无法使用equals()方法比较其字符串内容是否一样。
	
	String string = new String("java");
	StringBuffer stringBuffer = new StringBuffer("java");
	StringBuilder stringBuilder = new StringBuilder("java");
	System.out.println(string.equals(stringBuffer));	//false
	System.out.println(string.equals(stringBuilder));	//false
	System.out.println(stringBuffer.equals(stringBuilder));//false

6.这行创建了几个对象:String s=“a”+“b”+“c”+“d”;?

javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,
而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
相当于直接定义一个”abcd”的字符串,所以,上面的代码只创建了一个String对象。 		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值