Java学习笔记 (十二) String源码分析

该文章基于jdk1.8

String 不可变性

String类是被final修饰的,意味着String是不可变的,那么为什么这么设计呢?其实源码里的注释给出了答案:

their values cannot be changed after they are created. 
String buffers support mutable strings.
Because String objects are immutable they can be shared. 

因为String 可以被共享,所以不可变。

如果字符串可变的话,当两个引用指向指向同一个字符串时,对其中一个做修改就会影响另外一个。
不可变对象可以自由地在多个线程之间共享。不需要任何同步处理。
所以String设计成不可变是安全而且高效的。

String 实现的接口

String 实现了三个接口,分别是 java.io.Serializable ,Comparable,CharSequence
这里写图片描述

java.io.Serializable

序列化接口

Comparable

比较对象大小的接口 该接口有一个compareTo(T o)方法。实现 该方法比较对象大小,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。以下是String对compareTo的实现:
这里写图片描述
从第一个字符开始比较,当遇到较小的字符时,判断该字符串小,如果循环中两个字符串比较的字符都相等,那么判断字符串长度长的字符串大。

CharSequence

CharSequence 对许多不同实现类的 char 序列提供统一的只读访问。
CharSequence 有四个抽象方法,分别是:

int length();

返回字符序列的长度,也就是该字符序列字符的数量。以下是String 对int length()的实现
这里写图片描述
直接返回了字符数组的长度

char charAt(int index);

返回该字符序列指定索引的字符,以下是String 对char charAt(int index)的实现
这里写图片描述
判端了传入索引是否在字符数组索引范围内,不在范围内,抛出索引越界异常。反之则返回字符。

subSequence(int start, int end);

返回指定索引范围的子字符序列,如果start==end ,返回空字符串。
这里写图片描述
直接调用了substring方法。

String toString();

返回字符序列组成的字符串 直接返回自己:

    public String toString() {
        return this;
    }

CharSequence还有两个默认方法:

chars

    public default IntStream chars() {
        class CharIterator implements PrimitiveIterator.OfInt {
   
            int cur = 0;

            public boolean hasNext() {
                return cur < length();
          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值