String 的 10 道经典面试题

1、String 是基本数据类型吗?

答:不是。

2、String 是可变的?

答:String是final类型的,不可变。

3、怎么比较两个字符串的值一样,怎么比较两个字符串是否同一对象?

答:比较两个字符串值一样用equals,比较是否同一对象用"=="。

4、switch 中可以使用 String 吗?

答:jdk7及其以上版本的switch可以使用String类型。

5、String str = new String("abc");创建了几个对象,为什么?

答:创建了两个,"abc"本身创建在常量池中,通过new方法又创建在堆中。

6、String、StringBuffer、StringBuilder 有什么区别?

答:

1、可变性String 类中使用字符数组保存字符串,private final char value[],所以 String 对象是不可变的。StringBuilder 与 StringBuffer 都继承自AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,char[]value,这两种对象都是可变的。
2、线程安全性String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
3、性能每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

4对于三者使用的总结:
如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

7、String.trim()方法去掉的是哪些字符?

答:trim去掉字符串首尾的空白字符

8、String 可以被子类继承吗?

答:因为String是final类型,所以不能被继承。

9、可以自定义 java.lang.String 类并使用吗?

答:可以自定义java.lang.String类并编译成功,但不能被加载使用。

10、String 与 byte[]两者相互之间如何转换?

答:String 转换 byte[] 通过String类的getBytes方法;byte[] 转换 String通过new String(byte[])构造器。

猜你喜欢

转载自blog.csdn.net/qq_33644174/article/details/88350937