怎么理解,String是不可变类
2018-07-16 · 国内最优秀java资源共享平台
关注
展开全部
1. 不可变类:
所谓的不可变类是指这个类的实例一旦创建完成后,
就不能改变其成员变量值。如JDK内部自带的很多不可变类:I
nterger、Long和String等。
2. 可变类:
相对于不可变类,
可变类创建实例后可以改变其成员变量值
,开发中创建的大部分类都属于可变类。
3.string对象在内存创建后就不可改变(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. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
....
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length); // deep copy操作
}
...
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
...
}
源码发现:
1.String类被final修饰,不可继承
2.string内部所有成员都设置为私有变量
3.不存在value的setter
4.并将value和offset设置为final。
5.当传入可变数组value[]时,进行copy而不是直接将value[]复制给内部变量.
6.获取value时不是直接返回对象引用,而是返回对象的copy.
所谓的不可变类是指这个类的实例一旦创建完成后,
就不能改变其成员变量值。如JDK内部自带的很多不可变类:I
nterger、Long和String等。
2. 可变类:
相对于不可变类,
可变类创建实例后可以改变其成员变量值
,开发中创建的大部分类都属于可变类。
3.string对象在内存创建后就不可改变(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. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
....
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length); // deep copy操作
}
...
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
...
}
源码发现:
1.String类被final修饰,不可继承
2.string内部所有成员都设置为私有变量
3.不存在value的setter
4.并将value和offset设置为final。
5.当传入可变数组value[]时,进行copy而不是直接将value[]复制给内部变量.
6.获取value时不是直接返回对象引用,而是返回对象的copy.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询