java String源码学习



一 定义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)无参的构造方法:

  1. public String() {  
  2.         this.value = new char[0];  
  3.    }  

         2)使用字符数组、字符串构造一个String

     String就是使用字符数组(char[])实现的。所以我们可以使用一个字符数组来创建一个String,那么这里值得注意的是,当我们使用字符数组创建String的时候,会用到Arrays.copyOf方法和Arrays.copyOfRange方法。这两个方法是将原有的字符数组中的内容逐一的复制到String中的字符数组中。同样,我们也可以用一个String类型的对象来初始化一个String。这里将直接将源String中的valuehash两个属性直接赋值给目标String。因为String一旦定义之后是不可以改变的,所以也就不用担心改变源String的值会影响到目标String的值。

       当然,在使用字符数组来创建一个新的String对象的时候,不仅可以使用整个字符数组,也可以使用字符数组的一部分,只要多传入两个参数int offsetint 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的时候,如果没有指明解码使用的字符集的话,那么StringCodingdecode方法首先调用系统的默认编码格式,如果没有指定编码格式则默认使用ISO-8859-1编码格式进行编码操作。

          4)使用StringBuffer和StringBuider构造一个String

  1.  public String(StringBuffer buffer) {  
  2.         synchronized(buffer) {  
  3.             this.value = Arrays.copyOf(buffer.getValue(), buffer.length());  
  4.         }  
  5.     }  
  1. public String(StringBuilder builder) {  
  2.         this.value = Arrays.copyOf(builder.getValue(), builder.length());  
  3.     }  

           StringBuffer或者StringBuilfer对象之后可以直接使用他们的toString方法来得到String,官方文档说StringBuilder效率更高,因为StringBuffer的toString方法是synchronized,牺牲效率保证性能安全

       5)保护类构造方法

  1. String(char[] value, boolean share) {  
  2.         // assert share : "unshared not supported";  
  3.         this.value = value;  
  4.     }  
  5.           
        share 只能为true, 此方法性能好,节约内存,相当于直接将String的value的指针指向char[]数组,方法为protected,防止在外部访问,破坏字符串的不可变性

。。。。 待续 明天学习String 的其他方法

            StringBu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值