JAVA源码剖析之---String类(一)

  String类是java.lang下一个非常重要的类,String本身又是很常用的数据类型,因此,剖析String类变的十分重要。

  首先,我们来看看jdk源码中对String类的解释:

  Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.

  字符串是常量,在创建后,字符串的值就不能改变,不过,stringbuffer(字符串缓冲区)支持可变的字符串.而正因为字符串不可变,所以字符串能够被共享。

  在源码中,开发人员给了一个小例子,来形象的说明String的本质:

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


  稍微有点java基础的人都清楚,char是java中八种基本数据类型的其中一种,代表的是一个字符。这里的data[]是一个字符的数组。

 

 String str = new String(data);


  str是一个常用的创建一个字符串的方式,在源码中,他们被认为是相同的,也就是说,字符串就是一个一个的字符拼接起来的。

  String 类被final修饰,不能被继承,同时,它实现了java.io.Serializable, Comparable<String>, CharSequence 借口,接下来,我们来看看具体的方法.

  这里可以看一下java源码中变量的注释风格哦!

  

 /** The value is used for character storage. */
    private final char value[];
    /** Cache the hash code for the string */
    private int hash; // Default to 0


 

   1 .String类的构造方法,首先可以看一看string的构造方法,很有意思.

  

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


   String的构造方法创建了一个空的字符数组。

 

    2.第二个构造方法

  

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }


 

 这个方法的源码里有讲到,新创建的字符串是原字符串original的一个副本,从构造方法里,我们可以很清晰的看到,将original的value和hash都赋值给了新的对象引用。

 

    3.第三个构造方法

   

    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }


   同理,是复制的字符串数组的某一部分.

 

    4.第四个构造方法

   

public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }


   这个方法传入一个字符数组, 一个int类型的偏移量,还有一个长度。在方法里,分别对不同的情况抛出了异常,并调用了工具类Arrays.copyOfRange方法,接下来,让我们来看看这个方法。

   

    public static char[] copyOfRange(char[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        char[] copy = new char[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }


  该方法是复制数组到另一个新的数组,其中,初始索引必须在0和original.length之间,否则会超出范围。然后调用了arraycopy方法,来复制一个新的数组。

     其余的构造方法,就不在此描述,大同小异,我们来看看其余的方法。

   5.第五个方法

    

    public int length() {
        return value.length;
    }


      一般来说,获得字符串的长度。

  6.第6个方法

   

 public boolean isEmpty() {
        return value.length == 0;
    }


 

    如果字符串的长度等于0,那么就返回为true,否则就返回为false 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值