String知识点
String面试题
String是不可变的有什么好处?
String是不可变类有以下几个优点
- String不可变,所以线程安全。
- 以String作为HashMap的key,String的不可变保证了hash值的不可变。
- 因为java字符串是不可变的,可以在java运行时节省大量java堆空间。因为不同的字符串变量可以引用池中的相同的字符串。如果字符串是可变得话,任何一个变量的值改变,就会反射到其他变量,那字符串池也就没有任何意义了。
如何分割一个String?
用split()方法进行分割。
如何判断两个String是否相等?
有两种方式判断字符串是否相等,使用""或者使用equals方法。当使用""操作符时,不仅比较字符串的值,还会比较引用的内存地址。大多数情况下,我们只需要判断值是否相等,此时用equals方法比较即可。
还有一个equalsIgnoreCase可以用来忽略大小写进行比较。
String的intern()方法
当intern()方法被调用,如果字符串池中含有一个字符串和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串。如果池中没有的话,则首先将当前字符串加入到池中,然后返回引用。
String是线程安全的吗?
String是不可变类,一旦创建了String对象,我们就无法改变它的值。因此,它是线程安全的,可以安全地用于多线程环境中。
为什么我们在使用HashMap的时候总是用String做key?
因为字符串是不可变的,当创建字符串时,它的它的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。这也是为什么我们平时都使用String作为HashMap对象。
String编程题
1、下面的代码输入什么
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
输入false
2、下面的代码输入什么
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
输入false,因为s2不是String类型,String的equals方法进行了类型判断。
3、下面的代码输入什么
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 ==s2);
输出false,intern()方法将返回从字符串池中的字符串对象的引用,但因为我们没有分配到S2,S2没有变化,如果该第三行代码为s2 =
s2.intern(),则输入true。
4、下面的代码将创建几个字符串对象。
String s1 = new String("Hello");
String s2 = new String("Hello");
答案是3个对象.
第一,行1 字符串池中的“hello”对象。
第二,行1,在堆内存中带有值“hello”的新字符串。
第三,行2,在堆内存中带有“hello”的新字符串。这里“hello”字符串池中的字符串被重用。