String类、StringBuffer类与StringBuilder(内存角度)

String类

1String不变对象

2Java.lang.String使用final修饰,不能被继承

3字符串底层封装了字符数组以及针对字符数组的操作算法;

4字符串一旦创建,对象永远无法改变,但字符串引用可以重写赋值;

5Java字符串在内存中Unicode编码方式,任何一个字符对应两个字节的定长编码

内存角度:

字符串常量池因为JDK不同版本的迭代,存放的位置一直在变。

JDK1.7之前运行时常量池(包含字符串常量池)存放在方法区,此时hotspot

虚拟机对方法区实现为永久代。

JDK1.7字符串常量池从方法区拿到了堆中

JDK1.8hotspot移除了永久代用元空间取代,字符串常量池还在堆,运行时常量池在方法区。

堆:

在逻辑上分为三部分:

新生代:新创建的对象,垃圾回收器机制:GC会很频繁的来回收没有引用的对象

(新职员上岗,经过每年的考验。)

老年代:

在新生代中新创建的对象被垃圾回收器GC回收次数超过15次依旧还存在的对象

会从新生代转移到老年代。(新职员上岗,经过每年的考验,没有被劝退的。)

老年代的GC:不会很频繁的来回收,当然也有可能被退回新生代

永久代(元空间):

不GC,加载一次的类,方法,常量,特别是静态的一切。

为什么说String不变对象?

1每一个字符串对象的创建都会放在永久代里面。作为一个常量。

2当下一次创建字符串对象的时候,会去找永久代里面有没有相同的,有就直接给引用指向它不创建新的字符串对象,没有才会创建新的字符串对象。

3如果使用new关键词创建字符串对象,一定时开辟新的空间。

String类与StringBuffer类和StringBuilder类区别

String对象是不变对象(定长)一旦产生后就不可以被修改,作为常量在永久代。

StringBuffer和StringBuilder的内容可以修改。

简单地说,就是一个变量和常量的关系。

StringBuilder作StringBuffer替代品

StringBuffer线程安全的,多线程操作字符串  ,性能稍慢

StringBuilder非线程安全,单线程操作字符串,性能稍微快

内存角度:

String类

StringBuffer和StringBuilder的内容可以修改。

在内部构建数组,能够良好的进行垃圾回收

故:对字符串内容更改用StringBuffer或StringBuilder。在可能的情况下,建议使用StringBuilder类优先于StringBuffer,因为在大多数实现中它会更快

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值