侧边栏壁纸
博主头像
Curllen博主等级

早上的云霞好美~

  • 累计撰写 12 篇文章
  • 累计创建 18 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

01. String和Long源码分析(一)

Curllen
2020-05-07 / 0 评论 / 1 点赞 / 1,470 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-05-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

String 和 Long 是我们经常使用的,这次从源码角度对 String 和 Long 的底层实现进行解读。

1 String

1.1 不变性

String 为不可变类,不可变类定义:一旦被初始化,就不能够被修改,如果被修改,则将会是行的实例。代码演示:

String str = "Hello"; //地址:args = char[5]@542
str = "World"; //地址:args = char[5]@543

542和543可以看作类似内存地址

从代码层面来看,str 的值已经由 Hello 变成了 World,但是通过 Debug 查看,str 实际修改的是内存地址,已经由542指向543。

为啥是内存地址修改了?查看相关源码:

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

从源码上来看,可以得出两点结论:

  • String 类被 final 修饰,即 String 类不会被继承,换言之,String 中的任何操作方法,都不存在被继承覆写的可能。
  • String 类中保存数据的是一个 char 数组 value(这个通过 Debug 调试,观察数据时也可以明显观察到数据存储的形式),而 value 同样被 final 修饰,也就是说,value 一旦被赋值,内存地址则会被确定且不可被修改,同时 value 的权限修饰符为 private,即仅限类内部使用,String 中也未暴露出可以对 value 进行赋值操作的方法,即外部也不可能修改 value 的值。

'String 充分利用了 final 关键字的特性,达到不可变的目的,在我们开发过程中,如果需要创建不可变类时可以借鉴该方式。'

通过对源码的解读得出:String 具有不可变性,所以 String 的大多数操作方法都会返回一个新 String 对象,如下代码示例:

String str = "Hello″;
str = str.tolowerCas(new Local("en"));

1.2 字符串乱码

在很多情况下,我们需要进行二进制转换代码写好后,本地测试验证通过,但是一旦更换环境,则有可能会出现字符串乱码的情况,这个问题产生的原因是:在进行转换是,没有强制规定文件的字符集

未完待续

1

评论区