JDK之String源码解读(一)

目录

类的属性

String()

String(String original)

String(char value[])

String(char value[], int offset, int count)

String(int[] codePoints, int offset, int count)


String类表示字符串。所有Java程序中的字符串文字,如“ABC”,都是该类的实例。

String是常量;它们的值在被创建之后不能更改。StringBuffer支持可变字符串。因为字符串对象是不可变的,所以可以共享它们。例如:

String str = "abc";

等价于

char data[] = {'a', 'b', 'c'};
String str = new String(data); 

Java语言为String提供了特殊的支持。串联运算符+,用于转换其他对象到字符串。通过Stringbuilder(或Stringbuffer)实现了字符串连接类及其append方法。

类的属性

//内部是字符数组
private final char value[];

//String的hashCode,默认值是0
private int hash;

String()

作用:无参的构造函数。

String(String original)

作用:将String original赋值给当前String。

String(char value[])

作用:将字符数组赋值给当前String。

String(char value[], int offset, int count)

作用:将字符数组指定位置处的指定长度个字符赋值给当前String。

String(int[] codePoints, int offset, int count)

public String(int[] codePoints, int offset, int count) {
        //起始位置小于0,抛出异常
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }

        if (count <= 0) {
            if (count < 0) {
                //赋值的内容小于0,抛出异常
                throw new StringIndexOutOfBoundsException(count);
            }
            //赋值的内容长度等于0,将当前对象初始化成空字符串
            if (offset <= codePoints.length) {
                this.value = "".value;
                return;
            }
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > codePoints.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }

        //int[] codePoints内要赋值的内容的结束位置
        final int end = offset + count;

        // Pass 1: Compute precise size of char[]
        int n = count;
        //遍历要插入的数组int[] codePoints
        for (int i = offset; i < end; i++) {
            int c = codePoints[i];
            //如果是BMP类型的代码点,则跳过本次循环。因为BMP类型的本身就只占用1个char
            if (Character.isBmpCodePoint(c)) 
                continue;
            //如果是valid的代码点,则会占用两个char的长度,因此总长度的+1
            else if (Character.isValidCodePoint(c))
                n++;
            else throw new IllegalArgumentException(Integer.toString(c));
        }

        // Pass 2: Allocate and fill in char[]
        //创建一个新的字符数组,长度是前面计算过的长度
        final char[] v = new char[n];

        //遍历要插入的数组int[] codePoints
        for (int i = offset, j = 0; i < end; i++, j++) {
            int c = codePoints[i];
            //如果是BMP类型的代码点,则直接赋值
            if (Character.isBmpCodePoint(c))
                v[j] = (char)c;
            //如果不是BMP类型的代码点,则需要占用2个char长度,调用Character.toSurrogates()来赋值
            else
                Character.toSurrogates(c, v, j++);
        }

        this.value = v;
    }

作用:将整型数组指定位置处的指定长度个字符赋值给当前String。

其中,toSurrogates(int codePoint, char[] dst, int index)会赋值两次,即赋值lowSurrogate和highSurrogate给字符数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pattern是Java中用于进行正则表达式匹配的类,其码比较复杂,需要仔细研究才能理解其中的实现细节。下面是Pattern类的主要解读: 1. Pattern类的构造函数 Pattern类只有一个私有构造函数,因为其实例都是通过静态工厂方法Pattern.compile()创建的。在构造函数中,主要进行了一些初始化操作,如设置默认的标志位和编译正则表达式等。 2. 静态工厂方法Pattern.compile() 这是Pattern类的主要工厂方法,用于将正则表达式编译为一个Pattern对象。在该方法中,会根据传入的参数,设置Pattern对象的各种属性,如标志位、编译器等。然后,通过调用Matcher类的构造函数,生成一个Matcher对象,并将其返回。 3. Matcher类 Matcher类是用于进行匹配操作的类,其实例可以从Pattern类中获取。在Matcher类中,主要包含了一些用于匹配操作的方法,如find()、start()、end()等。在这些方法中,主要进行的就是正则表达式的匹配操作,其中涉及到一些复杂的算法,如回溯、贪婪匹配等。 4. PatternSyntaxException类 这是一个异常类,用于表示正则表达式语法错误。在Pattern.compile()方法中,如果正则表达式存在语法错误,就会抛出该异常。在PatternSyntaxException类中,主要包含了错误的位置、错误信息等属性,便于程序员进行调试。 总体来说,Pattern类的码比较复杂,主要涉及到正则表达式的编译和匹配操作,其中涉及到一些复杂的算法和数据结构。如果想深入了解该类的实现细节,需要仔细研究其码并进行调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值