String源码分析

这篇博客详细分析了Java lang包中的String类源代码,探讨了String系列的类结构,重点在于理解源码实现的思想,字符串类型间的关系以及性能考量。
摘要由CSDN通过智能技术生成

Class About String In  Package Of Java Lang

这篇笔记主要用于分析Java中String系列的源代码。以下是String系列的的类层次结构图。这篇博文主要目的在于分析String系列源码思想、以及String系列类型之间的关系,以及性能等。

第一序  String类型源码解析
String类型是一个final类型,是不允许继承一改变的。
1.持有成员变量
          一直疑惑String字符串类型为什么那么类似于字符数组char[ ],分析源码后将会发现,本质就是字符数组。String类型持有私有访问权限的字符数组。
源码:private final char value [];
都发现String中的字符串是连续不可变的,也正说明该value[ ]数组是final类型。同事Java程序中将类似于“abc”这样的字符串编译为String类型的实例对象,至于这个实现细节有待于进一步学习!
同时String类型实现了Serializable序列化标记接口,所以拥有序列化ID。
源码:private static final long serialVersionUID = -6849794470754667710L;
String类型持有一个整形,作为hash值。
源码: private int hash ;

2.实例构造器
a.无参构造器
  public String() {
       
this . value = new char [0];
    }

b.字符数组作为入参构造器
  public String( char value []) {
       
this . value = Arrays.copyOf( value , value . length );
    }

c.”abc”这样的字符串作为入参构造器
  public String(String original ) {
       
this . value = original . value ;
       
this . hash = original . hash ;
    }

d.整形数组作为入参构造器
  public String( int [] codePoints , 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 >
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Java String类的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; } ``` 这个方法用于将字符串中的一个字符替换成另一个字符,并返回新的字符串。我们来逐行分析一下它的源码: 1. 如果要替换的字符和替换后的字符相同,则直接返回原字符串。 ``` if (oldChar != newChar) { ``` 2. 获取字符串的长度和字符数组。 ``` int len = value.length; char[] val = value; /* avoid getfield opcode */ ``` 3. 在字符数组中查找要替换的字符。 ``` int i = -1; while (++i < len) { if (val[i] == oldChar) { break; } } ``` 4. 如果找到了要替换的字符,则将其替换为新字符,否则直接返回原字符串。 ``` 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); } ``` 5. 如果要替换的字符不存在,则直接返回原字符串。 ``` return this; ``` 总体来说,这个方法的实现比较简单,就是遍历字符数组,找到要替换的字符,然后再将其替换成新字符,最后返回新的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值