码迷,mamicode.com
首页 > 其他好文 > 详细

String

时间:2015-04-24 20:43:50      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

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这三个常量的初始状态。

String

标签:

原文地址:http://www.cnblogs.com/zuijiu/p/4454198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!