Java Interview

B.String Interview Questions

2018-10-01  本文已影响0人  mitsuii

1.什么是Java中的String?String是一种数据类型吗?

String是Java一个类,定义在java.lang包中,它不像int和long一样是原始数据类型。String类相当于字符串,它应用在几乎所有的Java应用中,有些关于String的有趣的事情我们是需要了解的。String是不可变的,final修饰,JVM用String池来存储所有的String对象,另外一些String有意思的地方是我们可以通过双引号和使用+运算符来实例化String对象。

2.有哪些不同方式创建String对象?

我们可以像普通对象一样使用new操作来创建String对象,或者使用双引号来创建。String还有一些构造的方法通过char array, byte array, StringBuffer and StringBuilder来做。

String str = new String("abc");

String str1 = "abc";

我们可以使用双引号创建String,JVM会在String池中查找是否有相同的存储值的字符串。如果有,直接返回该字符串对象的引用,否则会创建一个新的字符串对象来存给定的值存入String池里。当我们使用new操作符,JVM创建字符串对象但不会将其存入String池。我们可以使用intern()方法来将String对象存到String池中,或者在String池中已经存在相同值的时候直接返回其引用。

3.写一个方法检查输入的字符串是顺序和逆序都一样的字符(Palindrome)?

一个“回文”String是指String的值正序、反序都是一样的。例如:“aba”就是“回文”型字符串。

String类没有提供反转字符串的方法,但StringBuffer和StringBuilder类有反转的方法,我们可以用来检查String是否是“回文”。

4.写一个方法可以删除String中的指定字符串?

我们可以使用replaceAll方法来替换String,它的关键点在于可以接受String作为参数,所以我们可以用Character类来创建字符串,然后替换掉空字符。

5.如何使String实现大小写转换?

我们可以使用String类的toUpperCase和toLowerCase方法来将字符串的字符全部大、小写化。这些方法的区别在于可以接受Locale参数,用locale规则来转换字符串大小写。

6.什么是String subSequence方法?

Java1.4引入CharSequence接口且String实现了这个接口,其唯一原因就是将切分字符串的方法私有化。

7.如何比较两个字符串?

String实现了Comparable接口且有两个不同的compareTo()方法。

compareTo(String anotherString)方法比较字符串对象和传入的字符参数的字典顺序。如果字符对象先于参数里的字符,返回负整数,否则返回正整数。如果两个字符串相同则返回0,这时候equals(String str)也会返回true。

compareToIgnoreCase(String str):方法和第一个类似,区别在于它不区分字符大小写。它使用CASE_INSENSITIVE_ORDER比较器使大小写不敏感。如果返回值是0,那么equalsIgnoreCase(String str)也是返回true。

8.如何实现String转char和char转String?

这是个棘手的问题,因为String是一系列characters(字符串是由一串字符组成),所以我们不能转成单个字符。我们可以使用charAt方法来获取字符所在的索引位置或者用toCharArray方法来转换String成字符数组。可以看一些转换程序的例子String to character array to String

9.如何实现String转byte array和byte array转String?

我们可以使用getBytes()方法来转换String变成字节数组,我们可以用字符串构造器new String(byte[] arr)来转字节数组变成String。

10.是否可以在switch case使用String?

这是个棘手的问题,考察你对Java开发版本的知识点。Java7扩展了switch case使用字符串,之前的Java版本是不支持的。

如果你要实现一串字符串的条件流,你可以使用if-else条件,或在Java7及以上版本使用switch case来实现。

阅读这篇文章Java Switch Case String的例子。

11.写一个程序打印所有的组合String?

这是个棘手的问题,需要用到递归来查出所有的组合字符串,例如“AAB”组合可以有“AAB”,“ABA”,“BAA”几种组合。

我们还需要使用Set来确保没有重复的值,查看这篇文章有完整的程序find all permutations of String

12.写一个函数找出给定String里最长的回问(palindrome)?

一个含有回文的字符串并且查找出最长的回文,查看这篇文章palindrome in a String

13.String, StringBuffer and StringBuilder三者有什么区别?

String是不可变和final型,所以当无论何时使用字符串操作,都是创建一个字符串。字符串操作是资源消耗,所以Java提供两种工具类来操作字符串:StringBuffer和StringBuilder。

StringBuffer和StringBuilder是可变类。StringBuffer操作是线程安全和synchronized同步的,而StringBuilder是非线程安全。所以当多线程下应该使用StringBuffer,在单线程环境使用StringBuilder。StringBuilder性能优于StringBuffer,因为没有被synchronized限制。

查看文章String vs StringBuffer vs StringBuilder了解更多细节。

阅读这篇文章StringBuffer vs StringBuilder查看性能测试。

14.为什么String是不可变或者final的?

String是不可变和final的有几个好处:

∆ 由于String的不可变性使得String池成为可能;

∆ 它增加了安全性,字符串可以存数据库用户名和密码,这样任何黑客没法修改它的值;

∆ 因为String是不可变,所以在多线程中使用是安全的,我们不必考虑同步;

∆ 字符串被用在Java类加载器,不可变提供了安全性使得正确的类被加载器加载。

阅读这篇文章why String is immutable in java了解更多细节。

15.如何切分String?

我们可以使用split(String regex)方法的规则来切分字符串成字符数组。

阅读java String split了解更多。

16.为什么Char array比String更优于存储密码?

String在Java中是不可变的,存储在String池中。一旦被创建,就一直存于String池直至被垃圾回收掉,所以我们使用完有效密码还是会在内存中保留很长时间,也没有办法避免它不这样。这样就存在安全风险,因为任何人只要dump出内存,就能像清晰的文本一样找出密码。如果我们使用字符数组来存储密码,我们这样就能让密码隐藏。所以我们能在String的生命周期里不用担心String的安全威胁。

17.如何判断两个String是否相等?

两种方法来检查字符串是否相等,用“==”或者equals方法。当使用“==”操作符,它检查的是值和引用是否相等,但我们编码时,大多数情况只是检查值是否相等。所以我们使用equals方法。

另一个函数equalsIgnoreCase检查忽略大小写的值相等。

18.什么是String Pool?

就像名字暗示的,字符串池是一个在Java内存中存储Strings的池子。我们知道String是特殊的类,我们创建字符串对象用new操作符也可以使用双引号。

阅读String Pool了解更多

19.String中intern()方法的作用?

当intern方法被调用,如果String池里包含了和这个字符串相同值的字符串,那么直接返回池中的字符串对象。否则,字符串对象会添加到池中,然后该字符对象的索引被返回。

该方法始终返回一个相同内容的字符串,池里会确保返回的是唯一字符串。

20.Java中String是否线程安全?

String是不可变的,所以我们不能在程序里改变其值。因此是线程安全,多线程环境也是线程安全。查看thread-safety-in-java了解更多。

21.为什么HashMap的key流行用String?

因为String是不可变的,从一开始创建就把其hashcode缓存而且不需要再次计算。这个特性是它成为Map中key的最佳候选,同时它作为HashMap的key比其他对象作为key要效率快。这就是为什么HashMap的key常用String对象。

上一篇下一篇

猜你喜欢

热点阅读