String类和CharSequence接口源码分析

对你有帮助的话,亲动动小手指,留言点赞o( ̄▽ ̄)d哦​​​​!给我一份坚持写博客的力量​​​

1、String类

       看String的源码可以看到,String是被final修饰的类,final类是不能被继承的。这意味着该类中的成员方法都是默认为final方法。从源码中看,很明显,String其实是通过char数据来保存字符串的,并且String几乎所有的方法都是基于value数组来的。

String a = "ab"+"cd";相当于String a = "abcd"

2、CharSequence接口

       看到String类还实现了几个接口,Serializable(序列化接口Serializable没有方法或字段,仅用于标识可序列化的语义),CharSequence接口中也就只是有一个compareTo(T o)方法。重点来了CharSequence。

        而这个接口中要强调的重点是:CharSequence并没有提取出IObject中的hashCode和equals方法的通用规范。所以对于2个不仅实现了CharSequence接口的对象(还继承了其他的类)的对象来说,在比较时,其结果也是未定义的。(因为对于继承了Object的类来说,根据具体的实现,比较时,是有2中选择的,比较地址用==,比较内容用equals。),每一对象都可以由不同的类来实现,不确定其是否具备同等比较的能力。因此,使用任意 的CharSequence实例作为Set集合的元素或者map中的key,都是不合适的,因为CharSequence实例没有equlas方法。

3、volatile:每一个变量被volatile修饰,表明该变量是被多线程共享的。一般的情况下你修改一个非volatile修饰的变量,需先从主存中读取再copy一份到高速缓存,然后再刷新到主存中,这种情况下在多线程的时候就会产生多线程问题。而volatile保证了变量的可见性,线程读取到的是最新的值。

4、transient:举一个例子来说,你新建一个EntityBean并实现Serializable接口,在序列化的时候会包含Bean下所有的变量,但总有那么1、2个是你不需要序列化的,就可以在变量上加transient注解。但如果类不是实现Serializable而是实现Externalizable,那即便加transient注解,变量还是会被序列化。

5、下面来说一说StringBuffer、StringBuilder。

看StringBuffer的源码,很明显,它是线程安全的,因为其下的所有方法都加上了synchronized。

猜你喜欢

转载自blog.csdn.net/babyyaoyao/article/details/80483023
今日推荐