面试题66(StringBuffer)

时间:2022-05-10
本文章向大家介绍面试题66(StringBuffer),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

面试例题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";

小编寄语

以上每一个字都是小编一个字一个字打出的!图也是小编一笔一笔的画出来的!希望大家多多支持小编!也希望大家好好学习天天向上!