Java的String为什么是常量字符串?String和StringBuffer有何不同?相信做Java的伙伴们应该大多被面试过这道题,String是字符串常量类,StringBuffer是可变的。

为什么String是不可变的(即常量)呢?

查看Jdk的源码一看就明白了。

public final class String

implements java.io.Serializable, Comparable, CharSequence

{

/** The value is used for character storage. */

private final char value[];

value是一个final修饰的char数组,final修饰的。这就意味着value在构造器中被初始化后,无法再被修改了。

为什么说StringBuffer是可变的呢?

看实例源码。

public final class StringBuffer

extends AbstractStringBuilder

implements java.io.Serializable, CharSequence

{

/** use serialVersionUID from JDK 1.0.2 for interoperability */

static final long serialVersionUID = 3388685877147921107L;

/**

* Constructs a string buffer with no characters in it and an

* initial capacity of 16 characters.

*/

public StringBuffer() {

super(16);

}

StringBuffer继承了AbstractStringBuilder类。接着看AbstractStringBuilder的源码

* @author Michael McCloskey

* @version 1.15, 11/17/05

* @since 1.5

*/

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() {

}

/**

* Creates an AbstractStringBuilder of the specified capacity.

*/

AbstractStringBuilder(int capacity) {

value = new char[capacity];

}

终于清楚了,value不是final的。当然可以扩展存储空间。


版权声明:本文为weixin_35387135原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_35387135/article/details/114447716