动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

java字符串面试题(附答案)

08-21 16:30 297浏览
举报 T字号
  • 大字
  • 中字
  • 小字

字符串广泛应用在java编程中,在java中字符串属于对象,java提供了 String类来创建和操作字符串。因为字符串是java程序中经常处理的对象之一,如果字符串运用的好的话,会提高程序的运行效率,所以在java面试中,字符串是面试官常考察的内容,下面整理了一些java字符串面试题,并附上答案,供各位面试java程序员岗位和java零基础的朋友们学习。

1、String、StringBuffer、StringBuilder的区别是什么?

答:(1String是字符串常量,StringBuffer和StringBuilder都是字符串变量,后两者的字符内容可变,而前者创建后内容不可变

2StringBuffer是线程安全的,而StringBuilder是非线程安全的,线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高;

3String的每次修改操作都是在内存中重新new一个对象出来,而StringBuffer、StringBuilder则不用,且提供了一定的缓存功能,默认16个字节数组的大小,超过默认的数组长度时扩容为原来字节数组的长度 * 2 + 2,所以使用StringBuffer和StringBuilder 时可以适当考虑下初始化大小,以便通过减少扩容次数来提高代码的高效性。

2、String为什么是不可变的?

答:(1String不可变是因为在JDK中String类被声明为一个final类,且类内部的value字节数组也是 final 的;(2只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串;(3因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享,这样便不用因为线程安全问题而使用同步,字符串自己便是线程安全的;(4因为字符串是不可变的所以在它创建的时候hashcode就被缓存了,不变性也保证了hash码的唯一性,不需要重新计算,这就使得字符串很适合作为Map的键,字符串的处理速度要快过其它的键对象,这就是HashMap中的键往往都使用字符串的原因。

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

答:因为String是不可变的,一旦创建就不能更改,直到垃圾收集器将它回收才能消失,即使我们修改了原先的变量,实际上也是在内存中新建一个对象,原数据还是保留在内存中等待回收。

而字符数组char[]中的元素是可以更改的,也就是说像密码等保密信息用完之后我们可以马上修改它的值而不留痕迹,从而相对于String有更好的安全性。

4、String是线程安全的吗?

答:String是不可变量,一旦创建了String对象,我们就无法改变他的值,因此,它的线程是安全的,可以安全的用于多线程环境中。

5、为什么我们在使用HashMap的时候总是用String做key?

答:因为字符串是不可变的,当创建字符串的时候,他的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。这也就是为什么我们平时使用String作为HashMatp对象。

6、String是不可变的有什么好处?

答:(1)由于String是不可变类,所以在多线程中使用是安全的,我们不需要做其他任何同步操作;(2)String是不可变的,其值也是不可变的,所以用来存储数据密码很安全;(3)因为java字符串不可变,可以在java运行时节省大量堆空间。因为不同的字符串变量可以引用池中的相同的字符串。如果字符串是可变的话,任何一个变量的值改变,就会映射到其他变量,那么字符串池也就没有什么意义了。

7、用 java 代码写一个方法从字符串中删除给定字符?

答:public static String remove(String string,char c){

    if (string == null){

        return null;

    }

    return string.replaceAll(Character.toString(c),"");

}

8、用 java 代码实现字符串的反转?

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

public static String reverse(String string){

    if (null ==string || string.length()<=1){

        return string;

    }

    return new StringBuffer(string).reverse().toString();

}

2)使用递归方案实现,代码如下:

public static String reverse(String string){

    if (null==string || string.length()<=1){

        return string;

    }

    return reverseOther(string.substring(1))+string.charAt(0);

}

9、下面程序的运行结果是什么?

private static String getMsg() {

    return "world";

}

 

String s1 = "helloworld";

final String s2 = getMsg();

String s3 = "hello" + s2;

System.out.println(s1 == s3);   //1

答:final String s2 = getMsg() 其实与 final String s2 = new String(“world”) 是一样的,也就是说 returnworld会在堆中创建一个 String 对象保存world。虽然 s2被定义成了final,但不代表是常量,因为虽然将 s2 用final修饰了,但是由于其赋值是通过方法调用返回的,那么它的值只能在运行期间确定,因此指向的不是同一个对象所以可见并非定义为 final 的就保存在常量池中,很明显此处s2常量引用的String对象保存在堆中,因为 getMsg() 得到的String已经保存在堆中了,final的String引用并不会改变 String已经保存在堆中这个事实;对s2换成final String s2 = new String("world"); 一样会返回false,原因同理。

10、创建String对象的不同方式有哪些?

答:两种方式:(1)一种是通过new很关键字来创建。使用这种方式时,JWM创建字符串对象但不存储在字符串池中,我们可以调用intern()方法将该字符串对象存储在字符串池中,如果该字符串池已经有了同样值得字符串,则返回引用。(2)另一种是使用双引号来直接创建。使用这种方式时。JVM去字符串找有没有相同值得字符串,如果有,则返回找到的字符串引用。否则创建一个新的字符串对象,并存储在字符串池中。

上面就是整理的10道java字符串面试题的内容,因为java字符串是比较基础的内容,想成为一名合格的java程序员,扎实的基本功是不可缺少的。希望大家在学完java字符串知识以后,多多学习其他java培训课程,增长java知识,提高java编程水平。

0人推荐
共同学习,写下你的评论
0条评论
蛙课资讯
官方自媒体蛙课资讯

172篇文章贡献491043字

作者相关文章更多>

推荐相关文章更多>

蛙课网手机站正确的打开姿势~!

蛙课资讯07-11 17:20

【福利】来蛙课网,免费学Java全栈技术--已经结束

蛙课资讯09-04 15:27

Java面试前的突击要准备些什么

蛙课资讯06-12 17:09

Java开发招聘为什么有年龄的要求

蛙课资讯06-17 17:37

检测自己是否达到了java入门水平

蛙课资讯06-12 17:07

发评论

举报

0/150

取消