面试中关于String、StringBuffer、StringBuilder的频率最高问题

1、String类的特性

String类 是final修饰的,不可以被继承。

String类的底层是基于char数组的。

安全性:

对象都是只读的,所以多线程并发访问也不会有任何问题。

由于不可变,用来存储数据也是极为安全的。

2、String和new String();的区别

例如 : String str1= “abc”   和 String  str2  = new String("abc")的区别
解答 : 先理解一句话,再看下面的解析:相等的字符串 在常量池中只有一份,在堆中有多份

String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值

String str2 = new String("abc") ;在编译期,JVM先去常量池中查找是否存在“abc”,如果不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。


3、new String(); 创建了几个对象

解答: 两个

首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String("abc")了。把它拆分成"abc"和new String(),首先在字符串常量池去寻找有没有"abc"这个字符串,没有就创建一个“abc”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用。所以一共产生两个对象

试问str变量存储在堆中还是栈中?关键点是区分str是成员变量还是局部变量,如果是局部变量在方法体内,它就存储在栈中,如果是成员变量那么久跟随成员对象存储在堆中。

4、==与equals()的区别

解答:==比较的是引用类型 比较的是地址值是否相同   equals()比较的是内容(堆中的内容是否相同)

            ==是一个运算符   equals则是String对象的方法

例如:

String str1 = new String(“abc”)        str1 != str2    

String str2 = new String("abc")   

String str3 = "ABC"                          str3 = str4

String str4 = "ABC"                          str3 = str4 = str5

String str5 = "A"+"BC";  

5、基本数据类型有哪几种

 

面试中关于String、StringBuffer、StringBuilder的频率最高问题

面试中关于String、StringBuffer、StringBuilder的频率最高问题

6、String和StringBuffer的转换

 

String转StringBuffer:   String  s  = new String("xxx");
                                       StringBuffer sb = new StringBuffer(s);  

StringBuffer转String:  String str = sb.toString();

 

7、String 和StringBuffer  StringBuilder的区别

区别

执行速度:StringBulider>StringBuffer>String

StringBulider和StringBuffer是变量(String是常量)

 线程安全 :StringBuffer>StringBulider>String

解析:

String中的对象是不可变的,也就可以理解为常量,显然线程安全。

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。                           

总结  :  

1.如果要操作少量的数据用 =》 String

2.单线程操作字符串缓冲区 下操作大量数据 = 》StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 = 》StringBuffer

7、扩展

 String的一种方式比StringBuffer快的多  

例如:

String  s  = "hello"+"you"+"hao"这种方式比StringBuffer的append()快的多,这就被jvm解析成StringBuffer对象的拼接    

String s = "hello" String s2 = "you"   String s3 = "hao"   String s4 = s+s2+s3  这种方式比StringBuffer慢的多,这样jvm就规规矩矩的拼接String字符串了

今天大概总结到这里,此文章有参考其他博主的,有自己总结的,如果以后还遇到关于String的问题,再向其中添加

 


May everyone be happy every day and everything go well!