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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值