• String源码解析


    1、String源码结构

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        //用于存储字符的字符数组,值不可更改
        private final char value[];
    
        /** Cache the hash code for the string */
        //该字符的hash code; 默认为0
        private int hash; // Default to 0
    
        ......
    
    }
    

      String类被final修饰,说明该类不能被继承。String类用字符数组存储数据,说明该数组变成了常量,只能被赋值一次。

    2、String类的构造函数

    我们以 String(char value[], int offset, int count)构造函数为例

        //返回一个新的字符串,其中以指定位置的offset的字符开始,长度为count
        public String(char value[], int offset, int count) {
            if (offset < 0) {
                throw new StringIndexOutOfBoundsException(offset);
            }
            if (count <= 0) {
                if (count < 0) {
                    throw new StringIndexOutOfBoundsException(count);
                }
                if (offset <= value.length) {
                    this.value = "".value;
                    return;
                }
            }
            // Note: offset or count might be near -1>>>1.
            if (offset > value.length - count) {
                throw new StringIndexOutOfBoundsException(offset + count);
            }
    	//把一个新指定字符数组(从offset开始,以offset+count结尾)赋值给新的字符串value属性。
            this.value = Arrays.copyOfRange(value, offset, offset+count);
        }
    
        //Arrays.copyOfRange(value, offset, offset+count)方法
        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;
        }
    

      

    System.arraycopy是一个native方法

     public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);
    

      

      

  • 相关阅读:
    IDEA快捷的添加包名
    Spring源码(一)
    Java的理解
    剪绳子
    机器人的运动范围
    矩阵中的路径
    N皇后问题
    回溯法
    全排列
    反转链表
  • 原文地址:https://www.cnblogs.com/linlf03/p/12684622.html
Copyright © 2020-2023  润新知