黑马程序员技术交流社区
标题:
求解
[打印本页]
作者:
悦鹏
时间:
2015-6-14 21:43
标题:
求解
String的不可变性和toString的可变性该怎么证明?
作者:
曲终烟尽
时间:
2015-6-14 22:13
第一个问题,看String类的源代码可以理解一点。
String 使用 final修饰的 是不可以继承的。也就无法覆盖。
---------------------------------------------------------------------------------------------------------------
JDK中的说明:
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是
常量
;它们的值在
创建之后不能更改
。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
---------------------------------------------------------------------------------------------
你翻译一下第一句注释
The value is used for character storage.
value字符数组是用来存放字符数据的.
据我观察这个 value字符数组就是用来存放 字符串的数组。
定义是使用的 private final修饰的,就是不可变的。
这是String类的源代码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */ //偏移(offset)是存储空间使用的第一个索引
private final int offset;
/** The count is the number of characters in the String. *///count 是字符串中字符们的数量.
private final int count;
public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
}
public String(String original) {
int size = original.count;//大小等于传入的字符串大小
char[] originalValue = original.value;//char[] 原value=原字符串.value
char[] v;//新的字符数组 v
if (originalValue.length > size) {//如果字符数组长度 大于 字符串长度size
// The array representing the String is bigger than the new
// String itself.
// Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;//偏移
v = Arrays.copyOfRange(originalValue, off, off+size);//数组复制(原字符数组,偏移,偏移+大小)
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;//字符串对象自己的value等于传入的 原字符串的字符数组 进行判断修改后的 v
}
}
复制代码
第二个问题
toString是Object类中的方法
[size=-1]
String
toString
()
返回该对象的字符串表示。
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
所有对象(包括数组)都实现这个类的方法。
所有类都继承这个toString()方法。
你可以覆盖它,所以它返回的字符串是根据你的需要定制的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2