码迷,mamicode.com
首页 > 编程语言 > 详细

Java高频词之--String(从源码角度分析String 对象)

时间:2017-10-15 22:38:54      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:private   详细说明   serial   可变   stringbu   [1]   style   storage   java   

  String可以说是Java中最常见的词之一,与他相关的还是StringBuffer和StringBuild,这俩之后再说,现在先说说String即字符串。Java之中万物皆对象,String也不例外。而且Java中的String是不可变的。

  1.关于String不可变我当初刚学java是存有疑问

String s = "aaa";
s="bbb";
print.out(s); //输出bbb

这段代码里String  s明明发生改变,为啥说String 不可变。 在这里解释一下,这里变的只是引用 ,而非改变堆内存中的实际值。例如:

String s = "aaa";
String s2 = s.replace("a","b");
out.print(s2); //输出bbb
out.print(s1); //输出aaa

这里可以看出replace方法会产生一个新字符串,而原字符串并没有发生改变。下面从源码角度来分析为什么String对象是不可变的。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
}

打开String源码,可以看到String是个final类,表明它不可继承,用于存储值的char数组也是final类型,表明它不可被改变,但仅用final还不够,因为final修饰的数组虽然不可改变引用,但其本身值是可变。例如:final char value[] = {1,2,3};  value[1] = 4;  这时数组内值变为{1,4,3}。为了防止这种情况,Sun公司就把String类设置为不可继承,并在char数组前用private修饰,并且小心的编写String类的所有方法,保证每个方法都没有改动数组的值。

上文有提String类的所有方法都没改动Array都值,下面就来详细说明一下。    

以replace 方法为例

    public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {
                    break;
                }
            }
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                return new String(buf, true);
            }
        }
        return this;
    }

 

Java高频词之--String(从源码角度分析String 对象)

标签:private   详细说明   serial   可变   stringbu   [1]   style   storage   java   

原文地址:http://www.cnblogs.com/FindRui/p/7674009.html

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