面试例题1:对于如下代码,以下哪一个结论是正确的?
public class Foo {
public static void main(String[] args) {
StringBuffer a= new StringBuffer("A");
StringBuffer b= new StringBuffer("B");
operate(a, b);
System.out.println(a+","+b);
}
static void operate(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
}
A The code compiles and prints"A,B"
B The code compiles and prints"A,A"
C The code compiles and prints"B,B"
D The code compiles and prints"AB,B"
正确解析如下:
operate函数传入两个StringBuffer类型的句柄的副本,一个是x一个是y,分别指向A,B
正确答案在下面
面试例题1的正确答案:D
扩展知识:String与StringBuffer的区别
1.String的创建
String s="hello";
JVM先根据内容“hello”查找对象,如果没有找到,则在heap上创建新对象,并将其赋予s1,否则使用已经存在的对象。
String s= new String("hello");
JVM直接在heap上创建新对象,所以在heap中会出现内容相同而地址不同的String对象。
2.String的比较
“==”是比较地址,“equals”是比较内容。
举例如下:
String s1="hello";
String s2="hello";
String s3=new String("hello");
s1==s2; //true 地址相同
s1==s3; //false 地址不同
s1.equals(s2); //true 内容相同
s1.equals(s3); //true 内容相同
3.intern()方法
查找内容相同(equals())的字符串,举例如下。
(1)String s1="hello"; //hello不存在,JVM创建对象(1)
(2)String s2=new String("hello");//创建新对象(2),这时heap中存在两个相同内容为hello的对象
s1==s2; //false 地址相同
s1.equals(s2); //true 内容相同
s2=s2.intern(); //true 找到对象(1)并赋予s2
s1==s2; //true 注意:此时s1,s2同指向(1)
4.效率比较:String与StringBuffer
例1:
(1)String result ="hello"+"world";
(2)StringBuffer result=new String().append("hello").append("world");
(1)的效率好于(2),这是因为JVM会进行如下处理:
1.将result字符串“hello”+“world”处理,然后才赋值给result。只开辟了一次内存段。
2.编译StringBuffer后还要进行append处理,花的时间要长一些。
例2:
(1)public String getString(String s1,String s2){
return s1+s2;
}
(2)public String getString(String s1,String s2){
return new StringBuffer().append(s1).append(s2);
}
(1)的效率和(2)的一样,这是因为JVM会进行如下处理:
开辟一个内存段,再合并(扩展)内存,所以两者执行的过程是一致的。效率相当。
例3:
(1)String s="s1";
s+=s2;
s+=s3;
(2)StringBuffer s= new StringBuffer().append(s1).append(s2).append(s3);
(2)的效率好于(1),因为String是不可变对象,每一次“+=”操作都会构造新的String对象。
例4:
(1)StringBuffer s=new StringBuffer();
for(int i=0;i<5000;i++){
s.append("hello")
}
(2)StringBuffer s=new StringBuffer(250000);
for(int i=0;i<5000;i++){
s.append("hello")
}
(1)的效率好于(2),因为StringBuffer 内部实现的是char数组,默认初始化长度为16,每当字符串长度大于char数组长度的时候,JVM 会构造更大的新数组,并将原先的数组内容复制到新数组。(2 )避免了复制数组的开销。
StringBuffer 面试关键点:
(1) 简单地认为.append( )效率好于“+”是错误的。
(2) 不要使用new创建String.
(3) 注意.intern()的使用。
(4) 在编译期能够确定字符串值的情况下,使用“+”效率最高。
(5 )避免使用“+=”来构造字符串。
(6) 在声明StingBuffer 对象的时候,指定合适的capacity,不要使用默认
值(18)。
(7) 注意以下二者的区别,后者开辟了两个内存段。
(1)String s="a"+"b";
(2)String s="a";
s +="b";
小编寄语
以上每一个字都是小编一个字一个字打出的!图也是小编一笔一笔的画出来的!希望大家多多支持小编!也希望大家好好学习天天向上!