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