Java源码初窥--String

来源:互联网 发布:mac mini 更新 编辑:程序博客网 时间:2024/06/10 22:49

String类代表文字串,java程序中所有的字符常量,如"abc",都是String类的实例.String是常量,他的值只要创建之后都不会改变(此处说的不可变不是说不能改变,我们再写程序时通常会给string变量赋值,其实不是改变他的值,我们知道string是引用对象,赋值实际上是在内存string pool中添加一个新的对象然后再指向赋值的对象),string buffer 则支持可变string,因为string的不可变,所以他们可以共享:举个例子

         Stringstr = "abc"; 1

         char[] data = {'a','b','c'};

         Stringstr = new String(data); 2

其实1和2两个对象是同等概念。

         String类包括用于检查单个字符的顺序、比较字符串、搜索字符串、提取字符串、创建一个字符串全部转换为大写或者小写的拷贝等方法。

         Java语言提供的字符串的特殊支持 连接运算符(+),以及将其他对象转换为String类型,字符串连接的实现是通过StringBuffer类中的一些方法实现的。String转换是通过toString方法实现的,它被定义在Object以及所有继承Object的类。

         在一般情况下,传递null参数给String构造函数将导致抛出NullPointedException.

(以上信息由String源码说明翻译过来)

 

通过对String源码的阅读:

 我们发现他共有四个私有成员变量:

         1.char [] value  :用于存放string值的字符数组,在进行所有操作是基本上都是对这个数组的操作。

         2.int hash   :这个是 string的 hash值 默认是0

         3.static final long serialVersionUID  : 这个是 序列号 java 序列化用到的

         4.static final ObjectStreamField[] serialPersistentFields  : 串行持久化字段 String是序列化流协议中的特殊情况,String实例最初写入ObjectOutputStream时是以 utf 格式写入的。

 

他的构造函数很多,有些也是已经过时的了,我们平时使用最多的差不多有一下一些情况:

         String(),String(String original), String(char value[]),String(char value[], int offset,int count), String(byte bytes[],int offset, int length), String(byte bytes[]),String(StringBuffer buffer), String(StringBuilder builder).

         方法的话,这里就介绍一个重要的方法:

         1. char charAt(int index)  :返回执行位置的字符

   2.equals(Objectobj)  : 比较两个字符串的值,它的源代码如下:

   if (this == anObject) {

            return true;

        }

        if (anObjectinstanceof String) {

            String anotherString = (String)anObject;

            int n =value.length;

            if (n == anotherString.value.length) {

                char v1[] =value;

                char v2[] = anotherString.value;

                int i = 0;

                while (n-- != 0) {

                    if (v1[i] != v2[i])

                            returnfalse;

                    i++;

                }

                returntrue;

           }

我们可以看出,首先,是比较对象是否是同一个,然后再比较value数组是否相等。

   3. compareTo(String anotherString)  :比较方法,string是实现了Comparable这个接口的,所以必须实现这个方法。

   4. regionMatches(int toffset, String other,int ooffset,

           intlen) :区域匹配,与另外一个字符串进行一个块的匹配,返回值类型为布尔

   5.startsWith(String prefix, int toffset):判断是否已在toffset开始时是否以prefix开头。

   6. endsWith(String suffix)  :是否以suffix结尾

   7. hashCode() : 计算hash值,是根据value来计算的的,还是老方法,31是个神奇的数字。

   8. indexOf 系列:都是返回指定字符的顺序即数组下标。

   9. substring(int beginIndex,int endIndex) : 截取字符串,内部实现是通过构造函数实现的,有个offset什么东东的.

   10. concat(String str)  : 连接字符串

   11. trim() : 去掉首尾的空字符,

以上只是部分String类中的内容,更多详细信息请参照java源码java.lang.String.class。

1 0
原创粉丝点击