😀一:String 能被继承吗?为什么?
不可以,因为 String 类有 final 修饰符,而 final 修饰的类是不能被继承的,实现细节不允许改变。
平常我们定义的 String str=”abc”(直接赋一个字面量)
其实和 String str=new String(“abc”)(通过构造器构造)还是有差异的。
下一题
😁二:String str=“abc” 和String str=newString(“abc”) ——分别产生几个对象?
1.前者 1 或 0,后者 2 或 1,先看字符串常量池,如果字符串常量池中没有,都在常量池中创建一个,如果有,前者直接引用,后者在堆内存中还需创建一个“abc”实例对象。
2.对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
3.为了提升 jvm(JAVA 虚拟机)性能和减少内存开销,避免字符的重复创建 项目中还是不要使用 new String 去创建字符串,最好使用 String 直接赋值。
下一题
😃三:String, Stringbuffer, StringBuilder 的区别
String 字符串常量(final 修饰,不可被继承),String 是常量,当创建之后即不能更改。(可以通过 StringBuffer 和 StringBuilder 创建 String 对象(常用的两个字符串操作类)。)
StringBuffer 字符串变量(线程安全),其也是 final 类别的,不允许被继承,其中的绝大多数方法都进行了同步处理,包括常用的 Append 方法也做了同步处理(synchronized修饰)。其自 jdk1.0 起就已经出现。其 toString 方法会进行对象缓存,以减少元素复制开销
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 字符串变量(非线程安全) 其自 jdk1.5 起开始出现。与 StringBuffer 一样都继承和实现了同样的接口和类,方法除了没使用 synchronized 修饰以外基本一致,不同之处在于最后 toString 的时候,会直接返回一个新对象
public String toString() {
return new String(value, 0, count);
}
下一题
😄四:String 类的常用方法都有那些?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
|