问题一:String能被继承吗?为什么?
答:不能
解析:
String类的方法头是:public final class String extends Object,其中修饰关键字final是String不能够继承的关键。
【那final有哪些性质和功能呢】
- final可以修饰:类、变量和方法
- final修饰类的时候 ,这个类就不能被继承了,类中所有的方法也就被隐式的变为final方法
- final修饰的方法的类可以被继承,但是final修饰的方法无法被覆写
- final修饰的变量相当于常量,所以只能被赋值一次,赋值后,值不再更改 ,故final修饰的变量必须被初始化,初始化可以在声明变量的时候,也可以在构造函数中初始化
问题二:String str = “abc” 和 String str = new String(“abc”); 两者是否相同呢?
答:不相同
解析:
String str = “abc” 调用的是String.valueOf来返回String实例对象。(调用函数取决于所赋值的类型)
String num = 123 调用的函数为:
public static String valueOf(int number){
return Integer.toString(number);
}
String str = new String(“abc”); 调用的是:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
问题三:String, Stringbuffer, StringBuilder 的性质以及区别是什么?
String
- String类是java.lang包中的immutable类
- String类是字符串常量,一旦创建就不能修改
- 假若String对象已经存在,需要重新创建一个新的对象将值保存进去
- string覆盖了equals方法和hashCode()方法
【注:String里面所有的属性几乎也是final类,因此它的不可变性,类似拼接,裁剪字符串等动作(拼接次数过多建议使用StringBuffer,或者StringBuild)都会产生大量无用的中间对象,对项目的性能有明显的影响】
Stringbuffer(字符串可变对象)
- StringBuffer继承自AbstractStringBuilder类
- 为解决String拼接产生多余对象的问题而提供的一个类【区别String:修改字符串原有值时不用新建一个对象】
- 执行效率较慢,但是线程安全
- 可以动态的构造字符数据,append()方法
- StringBuffer没有覆盖equals方法和hashCode()方法
【注:Stringbuffer用于拼接,替换,删除。在项目多线程环境下运行,如:XML解析,HTTP参数解析与封装等】
StringBuilder(字符串可变对象)
- StringBuilder继承自AbstractStringBuilder类
- 同StringBuffer一样,可以对字符串进行操作,也不会新建对象
- 执行效率高效,但是线程不安全
【注:StringBuilder同StringBuffer使用方式相似,但在项目中使用的地方最好是单线程的环境下,如:SQL拼接,JSON封装等】
应用
- 初始化
String:String str = new String(“abc”);
StringBuffer:StringBuffer sb = new StringBuffer(“abc”); - 字符串修改(StringBuffer)
str = "abc";
StringBuffer sb = new StringBuffer(str);
sb.append("def");
str = sb.toString();
输出的结果为:abcdef
本文后续更新,欢迎相互交流。
1456

被折叠的 条评论
为什么被折叠?



