java源码理解分析——String

java源码理解(一)

String相关源码解析

String的实现

String的底层是被final修饰的char数组
final修饰意味着传参的时候参数不可变,和不可被继承。众所周知Java传参是值传递,如果传对象实例的时候,传递过去的是一个引用副本,不是原本引用,而是会把这个对象引用克隆的副本传过去。若在方法里修改,原对象也会被修改。
1.String为什么用final修饰,这样做有什么好处?
(1)安全性
final设计可以确保很多规定的参数不会在方法调用时被无意或者恶意修改,比如网络连接主机参数之类的。
而String里面很多方法都会调用系统底层的API,和系统交流比较频繁,如果可被继承,里面的方法可能会被恶意重写,对系统造成威胁。
(2)高效性
例如,JVM的字符串常量池可以缓存字符串,提高程序运行效率,若String是可变的,字符串缓存池将失去高效的意义。
2.equals()和compareTo()方法的比较
(1)equals()
String重写了equals()方法,据源码分析,比较两个字符串对象是否相等,先用Instanceof比较是否同一个对象类型,再比较字符串长度是否相等,进而把二者都转换成char数组,一个一个的字符比较。可接收Object类型参数,返回值是boolean
(2)compareTo()
compareTo返回值是int,把两个String类型转换成char数组,然后字符相减,最后返回为零相等,为其他值不等。只能接受String类型参数(compareToIgnoreCase是忽略大小写的比较方法)
3.String和StringBuilder、StringBuffer的区别
String类型不可变,所以遇到字符串拼接的时候效率会很低,会不断创建新的字符串。StringBuffer类型是线程安全可以用来拼接,源码如下:

@Override
public synchronized StringBuffer append(Object obj) {
    toStringCache = null;
    super.append(String.valueOf(obj));
    return this;
}

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

但线程安全性能不是很高,而StringBuilder和StringBuffer具有同样的字符串拼接功能,但它是非线程安全的,可以使用在非并发操作追求性能的环境下。
4.String和JVM
new String()会在堆区创建一个字符串对象,字符串对象再去字符串常量区寻找有无相同的字符串,若无则在字符串常量区创建该字符串。
直接赋值是直接去字符串常量区寻找,若无则创建。
new String()比直接赋值多占用了一个空间,所以直接赋值使用的更频繁。new String()一般用来把其他类型转换成字符串。例子如下:


char[] array = new char[] {'a','b','c','d','e','f','g'};
String str = new String(array);
5.String的多构造方法

5.String的多个构造方法

// String 为参数的构造方法
public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
// char[] 为参数构造方法
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}
// StringBuffer 为参数的构造方法
public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}
// StringBuilder 为参数的构造方法
public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

本文参考了Java源码刨析34讲和csdn上的一些博客,单纯为了记录下来加深记忆理解,如有侵权请联系删除。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值