一 定义:public final class String implements java.io.Serializable, Comparable<String>, CharSequence {}
从该类的声明中我们可以看出String是final类型的,表示该类不能被继承,同时该类实现了三个接口:java.io.Serializable
、 Comparable<String>
、 CharSequence
二 属性:private final char value[];//The value is used for character storage.
字符数据,且是final类型,用于存储字符串内容,由此可见,String 一旦被赋值便不可改变。String其实就是用char[]实现的。
private int hash;//Cache the hash code for the string .Default to 0
缓存字符串的hash code
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
String
实现了Serializable
接口,所以支持序列化和反序列化支持。 serialVersionUID:验证版本一致性,反序列化时,JVM会把传来的字节流中的serialVersionUID
与本地相应实体(类)的serialVersionUID
进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常:InvalidCastException
JDK1.7版本之前,还有private final int offset; 和 private final int count
三 构造方法:
1)无参的构造方法:
- public String() {
- this.value = new char[0];
- }
2)使用字符数组、字符串构造一个String
String就是使用字符数组(char[])实现的。所以我们可以使用一个字符数组来创建一个String,那么这里值得注意的是,当我们使用字符数组创建String的时候,会用到Arrays.copyOf
方法和Arrays.copyOfRange
方法。这两个方法是将原有的字符数组中的内容逐一的复制到String中的字符数组中。同样,我们也可以用一个String类型的对象来初始化一个String。这里将直接将源String
中的value
和hash
两个属性直接赋值给目标String
。因为String一旦定义之后是不可以改变的,所以也就不用担心改变源String
的值会影响到目标String
的值。
当然,在使用字符数组来创建一个新的String对象的时候,不仅可以使用整个字符数组,也可以使用字符数组的一部分,只要多传入两个参数int offset
和int count
就可以了。
3)使用字节数组构造一个String
在Java中,String实例中保存有一个char[]
字符数组,char[]
字符数组是以unicode码来存储的,String 和 char 为内存形式,byte是网络传输或存储的序列化形式。所以在很多传输和存储的过程中需要将byte[]数组和String进行相互转化。所以,String提供了一系列重载的构造方法来将一个字符数组转化成String,提到byte[]和String之间的相互转换就不得不关注编码问题。String(byte[] bytes, Charset charset)
是指通过charset来解码指定的byte数组,将其解码成unicode的char[]数组,够造成新的String。
这里的bytes字节流是使用charset进行编码的,想要将他转换成unicode的char[]数组,而又保证不出现乱码,那就要指定其解码方式
字节数组构造String就会使用StringCoding.decode
方法进行解码,使用的解码的字符集就是我们指定的charsetName
或者charset
。 我们在使用byte[]构造String的时候,如果没有指明解码使用的字符集的话,那么StringCoding
的decode
方法首先调用系统的默认编码格式,如果没有指定编码格式则默认使用ISO-8859-1编码格式进行编码操作。
4)使用StringBuffer和StringBuider构造一个String
- public String(StringBuffer buffer) {
- synchronized(buffer) {
- this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
- }
- }
- public String(StringBuilder builder) {
- this.value = Arrays.copyOf(builder.getValue(), builder.length());
- }
StringBuffer或者StringBuilfer对象之后可以直接使用他们的toString方法来得到String,官方文档说StringBuilder效率更高,因为StringBuffer的toString
方法是synchronized,牺牲效率保证性能安全
5)保护类构造方法
- String(char[] value, boolean share) {
- // assert share : "unshared not supported";
- this.value = value;
- }
-
share 只能为true, 此方法性能好,节约内存,相当于直接将String的value的指针指向char[]数组,方法为protected,防止在外部访问,破坏字符串的不可变性
。。。。 待续 明天学习String 的其他方法