1.String可以被继承吗?如果不可以,请说出原因。
不可以,String类被final关键字修饰。final关键字修饰的类不可以被继承,final修饰的方法不可以重写(覆盖),final修饰的属性不可以改变。这里多说一句,final修饰的属性如果是基本数据类型,那么值不能改变;如果修饰的是引用数据类型,那么引用(指针)不能改变。
2.String,StringBuffer和StringBuilder的区别。
String是字符串常量,创建之后不可以修改;StringBuffer和StringBuilder是字符串变量,创建之后可以修改。所以拼接字符串较多的场景下应该尽量使用Buffer和Builder,因为String更耗费内存。StringBuffer和StringBUilder的区别主要是线程是否安全,前者线程安全,效率低下;后者线程不安全,效率较高。二者的方法基本一样,不过Buffer的方法有synchronized关键字修饰。如果不考虑线程安全的问题,建议使用Builder。
3.String直接赋值和构造器创建对象的区别。
直接赋值更节约内存。首先去常量池寻找是否有该字符串,如果有,直接引用,如果没有,先在常量池创建该对象,然后再进行引用;构造器创建对象,直接去堆内存中创建该对象,然后进行引用,同时也会在常量池中创建对象,如果再new一个相同内容的字符串,那么会再次在堆内存中进行创建,而常量池不会再去创建,也就是说每次都会新创建对象,至少进行一次,所以会耗费一些内存。
4.String s1=null;和String s2=" ";的区别。
前者是空对象,声明并进行初始化,但是引用没有进行指向,也没有申请内存资源。本质上不是字符串,所以调用字符串的方法会出现空指针异常;后者是空字符串,存在常量池中,可以调用字符串的方法。
5.判断String的内容是否相等用什么方法?双等为什么不行?
equals方法。重写了父类object的equals方法,又添加了几种情况。父类的equals方法对两个对象进行比较,如果是同一个对象返回true。String的equals方法在此基础上考虑了对象是否是字符串类型,如果是,先比较length,长度相同则比较每个字符,毕竟是char数组,每个字符都相同则返回true,否则返回false。如果length不同直接或者不是String类型那么直接返回false。
双等用于比较对象是否相同,因为String是引用类型,所以比较的是引用,如果是构造器创建的两个相同内容的对象,它返回的也是false。不适用该场景。
equals源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
6.请列举一些String的方法。
length() 查看长度
hashCode() 查看哈希码
equals() 判断内容是否相等
split() 根据字符进行分割
idnexOf() 查看字符第一次出现的位置
concat() 拼接字符串到尾部
charAt() 返回字符出现的位置
replace() 替换字符
compareTo() 按数据字典的顺序进行比较
这里非常感谢“直系学长”的指导和“璐兄”的校对,有问题欢迎来喷!有则改之,无则加勉。