「每日一面」String 相关面试题全解

问:下面程序的运行结果是什么?

String s1 = "abc";StringBuffer s2 = new StringBuffer(s1);System.out.println(s1.equals(s2)); //1,falseStringBuffer s3 = new StringBuffer("abc");System.out.println(s3.equals("abc")); //2,falseSystem.out.println(s3.toString().equals("abc")); //3,true 

答:注释 1 打印为 false,主要考察 String 的 equals 方法,String 源码中 equals 方法有对参数进行 instance of String 判断语句,StringBuffer 的祖先为 CharSequence,所以不相等; 注释 2 打印为 false,因为 StringBuffer 没有重写 Object 的 equals 方法,所以 Object 的 equals 方法实现是 == 判断,故为 false; 注释 3 打印为 true,因为 Object 的 toString 方法返回为 String 类型,String 重写了 equals 方法实现为值比较。

问:String、StringBuffer、StringBuilder 的区别是什么?(高频)

答:String 是字符串常量,StringBuffer 和 StringBuilder 都是字符串变量,后两者的字符内容可变,而前者创建后内容不可变;StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,线程安全会带来额外的系统开销,所以 StringBuilder 的效率比 StringBuffer 高;String 的每次修改操作都是在内存中重新 new 一个对象出来,而 StringBuffer、StringBuilder 则不用,且提供了一定的缓存功能,默认 16 个字节数组的大小,超过默认的数组长度时扩容为原来字节数组的长度 * 2 + 2,所以使用 StringBuffer 和 StringBuilder 时可以适当考虑下初始化大小,以便通过减少扩容次数来提高代码的高效性。

问:String 为什么是不可变的?

问:说说 String str = "hello world"; 和 String str = new String("hello world"); 的区别?

问:String 为什么是不可变的?

问:说说 String str = "hello world"; 和 String str = new String("hello world"); 的区别?(高频)

答:在 java 的 class 文件中有专门的部分用来存储编译期间生成的字面常量和符号引用,这部分叫做 class 文件常量池,在运行期间对应着方法区的运行时常量池,所以 String str = "hello world"; 在编译期间生成了 字面常量和符号引用,运行期间字面常量 "hello world" 被存储在运行时常量池(只保存了一份),而通过 new 关键字来生成对象是在堆区进行的,堆区进行对象生成的过程是不会去检测该对象是否已经存在的,所以通过 new 来创建的一定是不同的对象,即使字符串的内容是相同的。


问:用 java 代码实现字符串的反转?

答:这道题的答案很多,下面给出两种常见的答案。

使用 JDK 中 StringBuffer(并发安全)或者 StringBuilder 的反转方法,这是最好的办法,不仅速度快、效率高,代码如下:

public String reverse(String str){ if ((null == str) || (str.length() <= 1)){return str;}return new StringBuffer(str).reverse().toString();}

炫技能使用递归方案实现,代码如下:

public String reverse(String str) {if((null==str)||str.length()<=1){return str;}return reverse(str.substring(1))+str.charAt(0);}

首尾交换法

public static void swap(char[] charArr, int front, int end){while(front < end){char tmp = charArr[end];charArr[end] = charArr[front];charArr[front] = tmp;front++;end--;}}

问:用 java 代码来检查输入的字符串是否回文(对称)?

答:这道题的答案也有很多,下面给出两种常见的答案。

使用 JDK 现有 API 实现,代码如下:

boolean isPalindrome(String str) {if (str == null) {return false;}StringBuilder strBuilder = new StringBuilder(str);strBuilder.reverse();return strBuilder.toString().equals(str);}

删除字符串中重复的字符

public static String removeDuplicate(String s){char[] arr = s.toCharArray();int len = arr.length;for(int i=0; i

问:为什么针对安全保密高的信息,char[] 比 String 更好?

答:因为 String 是不可变的,一旦创建就不能更改,直到垃圾收集器将它回收才能消失,即使我们修改了原先的变量,实际上也是在内存中新建一个对象,原数据还是保留在内存中等待回收;而字符数组 char[] 中的元素是可以更改的,也就是说像密码等保密信息用完之后我们可以马上修改它的值而不留痕迹,从而相对于 String 有更好的安全性。

字符串KMP算法

内容太多,可以参考这个链接文章

https://blog.csdn.net/jia635/article/details/80330998

「每日一面」String 相关面试题全解


分享到:


相關文章: