Java基础面试题(更新中……)

String、StringBuffer、StringBuilder的区别。

可变性

String不可变的原因是因为使用了final关键字定义字符数组保留字符串,private final char[] value;所以String是不可变的。

具体表现为,无论如何修改String都无法修改到这个字符串本身的值,而是返回一个新的字符串对象。

而StringBuffer和StringBuilder都是继承了AbstractStringBuilder,在AbstractStringBuilder中定于数组value没有使用final关键字,所以这两个对象都是可变的。

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

    /**
     * This no-arg constructor is necessary for serialization of subclasses.
     */
    AbstractStringBuilder() {
    }
    …………
}

线程安全性

String对象是不可变的,也就可以理解是String是线程安全的。

上面已知StringBuffer和StringBuilder是共同继承了AbstractStringBuilder类。

不过StringBuffer对方法或者对调用的方法加了同步锁,所以是线程安全的。而StringBuilder没有加同步锁,所以是非线程安全的。

性能方面

String若要修改值,每次都需要重新创建一个对象,然后再将指针指向新的对象,而旧的对象就会留存等待GC清除。StringBuffer和StringBuilder都是在对对象本身进行操作,不会重新再创建新的对象并改变对象引用。

但是StringBuilder比StringBuffer少了一个同步锁,所以StringBuilder会比StringBuffer性能高10%左右,但是却牺牲了线程安全性。如何取舍看各自的项目需求。

总结

  • 操作少量数据使用String
  • 单线程操作大量数据使用StringBuilder
  • 多线程操作大量数据使用StringBuffer

构造函数有哪些特点?是否可被Override?

特点

  • 名字和类名相同
  • 没有返回值,所以不用使用void声明构造函数
  • 生成类的对象时自动执行,无需再次调用

构造方法无法被Override(重写),但是可以被Overload(重载),所以也会看到一个类有多个构造函数的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值