程序员

深入理解Java String源码,用法,原理,存储方式

2020-05-05  本文已影响0人  鲨鱼爱吃蔬菜

前言:

《朱子语类》卷九《论知行》篇中说: “不可去名上理会。须求其所以然。”

作为一名Java新晋程序员,夯实基础是职业生涯实现长期可持续发展不可或缺的日常任务。随着高速的技术更新迭代,新兴的技术架构使得大部分编程学者的追慕,但却遗失了根本的原理,从而使我们留在这个方法我会用,但不知到它是怎么实现的层面。好像我们小时候背课文、背古诗,这篇课文我会背但不知道是什么意思就无法懂得诗篇美句及其作者背后的情感,就直到长大成人后的一些经历才真正的唤醒了我们对那篇诗句的共鸣,从而了解了诗篇的美好以及它告诉我们的真谛。


本文作者抱以学习的心态去学习并尝试深入理解 java.lang.String 类的原理。在学习之初,作者进行了一系列研究,搜索,收集String有关的知识点并对本文中所讨论的String类从以下几方面进行分析;知其然,并求其所以然。

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

    /* * @param  original
     *         A {@code String}
     */
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

String str1 = "Hello Qiyi";
String str2 = new String("Hello Qiyi");

    public boolean equals(Object anObject) {
        if (this == anObject) { //对象引用地址的比较
            return true;
        }
        if (anObject instanceof String) { //如果是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])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

 public native String intern();
    String str3 = new String("Hello") + new String(" Qiyi");
    str3.intern();
    String str4 = "Hello Qiyi";
    System.out.println(str3 == str4);//jdk6: false 、jdk7: true

    public String trim() {
        int len = value.length;//字符串的长度
        int st = 0;
        char[] val = value;    /* 赋值给新的char数组,避免getter操作 */
        //当     小于长度 并且 从头部位置小于等于空格(字符比较按照ASCII表)
        while ((st < len) && (val[st] <= ' ')) {//找到字符串前段没有空格的位置
            st++;
        }
        //当     小于长度 并且 从尾部位置小于等于空格
        while ((st < len) && (val[len - 1] <= ' ')) {
            len--;
        }
        //没有出现空格返回本身 反之返回头尾部位置的字符串
        return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
    }

replace()
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。

                         /*被替换字符*/ /*替换字符*/
    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];//申请一个和原来字符数组一样大小的buf数组
                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;
    }

本文将持续修订,如有错误欢迎大家指正!

上一篇 下一篇

猜你喜欢

热点阅读