从String,StringBuilder和StringBuffer的使用谈起JVM的内存区域与内存分配(一)

  好记性不如烂笔头,抽出闲暇时间总结一下JVM的内存区域,这里我从字符串的StringBuilder的和StringBuffer的的的区别和使用谈起。

首先我们先了解一下String's ==和equals的区别:

这里先直接给出结论:
      String定义的对象是引用类型的变量,该变量存储的并不是“值”本身,而是其关联的对象在内存中的地址。==比较的是两个变量是否指向同一个地址.equals比较的是两个对象的值是否相等。

      对于这8种基本数据类型的变量:使用“==”比较值是否相等直接
看代码方便理解上面的总结,如上,可以看出str1 ,STR2地址相同,且与STR3,STR4地址不同.str1 =“ABC”的创建过程:先在栈中创建一个字符串对象的引用变量STR1;然后查找堆中常量池里是否有“ABC”;如果没有,则将“ABC”存放进常量池,并令STR1指向“ABC”;若有” ABC‘则直接令STR1指向’ABC“而STR3,STR4使用新的关键字创建字符串对象,每调用一次就会创建一个新的对象:先在堆中创建一个包含指定内容的字符串对象,并将在栈中创建的引用变量STR3指向该对象;去字符串常量池中 看,是否包含该内容的对象,若有,则将堆中的对象与字符串常量池中内容相同的对象联系起来,若没有,则在字符串常量池中再创建一个包含该内容的字符串对象,并将堆中的对象与字符串常量池中新创建出来的对象联系起来下面我们从字符串的源码分析:如上,为字符串的相等的源码,首先判断两个对象变量是否指向同一个对象,如果是返回真;然后判断是否是字符串对象,是字符串对象包含的字符串长度相同,逐位比较。
在这里插入图片描述


在这里插入图片描述

字符串的StringBuilder和StringBuffer的

同样我们直接给出结论:
a,String中的值[]字符数组是私有的,不可以修改,String是不可变类;而StringBuilder和StringBuffer继承AbstractStringBuilder类,是可变类
.b,三者在执行速度方面的比较:StringBuilder> StringBuffer> String
c,StringBuffer:线程安全的,String和StringBuilder线程非安全的
       

如下图,是三者的运行时间,很明显String的执行速度最慢,这是因为str1 + = “c”的运行过程是:将原有的str变量指向的对象内容取出与“c”作字符串相加操作再存进另一个新的字符串对象当中,再让str变量指向新生成的对象而原来的str指向的地址就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改;str1 + = “c”对字符串对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程。

对于三者使用的总结:

1、如果要操作少量的数据用String 

2、单线程作字符串缓冲区下操作大量数据用StringBuilder

3、多线程操作字符串缓冲区下操作大量数据用 StringBuffe
在这里插入图片描述


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值