标签:
String类是我们最常用的类之一。
String定义的字符串是不可变得。
众所周知,它是用来定义字符串的类。但是字符串在java的底层结构中又是什么呢?
首先我们来了解java1.6中的5个常量和1个变量。(这些常量或变量是jdk1.6里面的,到了1.7以后常量就被缩减为了4个)
value数组
1 private final char value[];
The value is used for character storage. 这是源码中的注释,很明确的告诉了你:这个value是用字符型来存储的。
java中定义的字符串的形式其实都是用这个char数组的形式来存储的。例如:
1 String str = "bj";
以上一段代码在String中存储是这样的:
index: 0 1
value:‘b‘ ‘j‘
这个char类型的数组常量决定了String是不可变字符串的特性。为什么这么说呢?
首先他是以private修饰的,那么其他类是不可以访问的,并且在String中也没有提供任何关于value[]这个数组public的get,set方法。
再看,他还用了final修饰,final这个关键字表明了它是最终的,不可变的!!!
这两个修饰符首先你访问不到,其次还是不可变的。。。这就相当于这是他的镇家之宝,不仅不给你看,自己还不能改变,改变了那就是对不起祖宗。。。那么你还怎么来访问和改变他呢?
offset
private final int offset;
The offset is the first index of the storage that is used. ---这个offset是用来存储第一个索引的值的
在执行代码的时候可以看到他的值:
这个值表示了value数组的索引是从几开始的。
这个常量也没有get,set方法
这个特性在1.7以后被移除了。
count
1 private final int count;
The count is the number of characters in the String. ---这个count是计算String字符串中的字符数的
在以上的那个截图中我们可以看到count这个属性的值是2,他计算的是“aa”这个字符串在value数组中字符的个数。
这个常量没有get,set方法
这个特性在1.7以后被移除了。
hash
1 private int hash; // Default to 0
Cache the hash code for the string. ---缓存字符串的hash代码
这个并没有final,他只是一个私有的变量。。。。。终于有一个可以改变的了,String好吝啬呀。。。
他的作用就是获得这个String定义的字符串的内容对应的hash代码,但是后边还有加了一句注解,指明了他默认情况下是0,那么他都默认是0了,还有什么用呢?
虽说他理论上是可以变得,但是它并没有get,set方法,那么他的值是怎么来的呢?
他的值是依赖于hashcode()这个方法的,这个一会再说。。
serialVersionUID
1 private static final long serialVersionUID = -6849794470754667710L;
use serialVersionUID from JDK 1.0.2 for interoperability ---使用serialVersionUID为JDK 1.0.2提供互操作性
这个常量是用来序列化和反序列化控制的,具体怎么用,这里就不赘述了,大家有兴趣可以百度一下。。。
serialPersistentFields
1 private static final ObjectStreamField[] serialPersistentFields = 2 new ObjectStreamField[0];
Class String is special cased within the Serialization Stream Protocol. ---String类是特殊包装在序列化流协议中的。
A String instance is written initially into an ObjectOutputStream in the following format: ---一个String实例最初书写是生成ObjectOutputStream,格式如下:
<pre>
<code>TC_STRING</code> (utf String)
</pre>
The String is written by method <code>DataOutput.writeUTF</code> ---这个String是通过DataOutPut接口中的writeUTF这个方法书写的
A new handle is generated to refer to all future references to the string instance within the stream. ---一个新的操作是参考以后所有的引用去生成流内的字符串实例
ObjectStreamField 类为序列化机制提供序列化对象的成员变量以及成员变量的类型。在这里我们不深究它。。。
这个常量也是与序列化有关的。。。
接下来就是一些String的构造方法
这些String的构造方法,不建议大家去深究。。。
在源码中其实最重要的就是无参构造,因为这关系到初始化的时候这个类是怎么样的。。。
1 public String() { 2 this.offset = 0; 3 this.count = 0; 4 this.value = new char[0]; 5 }
String的无参构造指定了offset,count,value这三个常量的初始状态。
标签:
原文地址:http://www.cnblogs.com/zuijiu/p/4454198.html