java:String,StringBuffer,StringBuilder区别

本文解析了Java中String类的内存管理,包括栈区、堆区和常量池,以及String与其他可变/不可变字符串类(StringBuffer、StringBuilder)的比较,强调了线程安全性和性能差异。
摘要由CSDN通过智能技术生成

一、String类初始化后是不可改变的、使用String不一定创建对象、使用newString一定创建对象。

1.物理的内存是线性结构,并不存在拥有不同功能的不同区域。

编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为不同的区域,不同区域拥有各自的特性,再java中,内存可以分为栈,堆,静态和常量池等

2.不同内存区域的功能和特点:

a)栈区:存放局部变量(变量名,对象的引用等)特点:内存随着函数的调用而开辟,随着函数调用结束而释放。

b)堆区:存放对象(也就是new出来的东西)特点:可以跨函数使用,每个对象有自己对应的储存空间。

c)静态域:存放在对象中static定义的静态成员。

d)常量池:存放常量。(常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。)

3.创建字符串的方法有两种:

a) String str1=“直接赋值法”;

b)String str2= new String(“通过new关键字的方法来创建”);

4.这两种方法的区别:

a)第一种:首先检查字符串常量池中是否存在该字符串对象,如果已经存在,那么就不会在字符串常量池中创建了,直接返回该字符串常量池中内存地址;如果该字符串还不存在字符串常量池中,那么就会在字符串常量池中创建该字符串的对象,然后再返回。

b)第二种:首先会检查字符串常量池中是否存在“java”的字符串,如果已经存在,则不会在字符串常量池中创建了,如果没有存在,那么就会在字符串常量池中创建“java”对象,然后还会再堆内存再创建一分字符串对象,把字符串常量池中的“java”字符串内容拷贝到内存中字符串对象,然后返回堆内存中字符串对象的内存地址。即栈内存存储的地址是堆内存的内存地址。

5.这是一道面试题,来一起探讨一下吧!

问题:(1)在程序的第7~9行处,String对象创建了几个对象?分别写出。

           (2)在程序的第10~12行处,分别写出输出结果。

分析:当程序执行到第七行时,现在常量池中查找有没有常量good如果没有就创建good对象 当执行到new String时会在java堆中创建一个good对象 在栈中用str引用 共两个对象。

执行到第8行,首先在String常量池中查找有没有字符串常量“good",有则直接将str1作为String常量池中“good”的一个引用,当你重新声明一个String型变量为“good”时,将使用串池里原来的那个“good",而不用重新分配内存,也就是说,str与str1将会指向同一块内存,因此,此时没有创建任何对象。

          执行到第9行,依次在String常量池中查找有没有字符串常量“good”,有则不进行再次创建,由于这里用了new关键字(有new就有对象),所以在Java堆中又创建了一个“good”对象(地址与第一句在堆中创建的地址不同),而str2则是这个对象的引用,因此执行此句时,创建了1个对象。

          执行到第10行, “==”是判断对象的,由于str指向的是Java堆中的“good”对象,而str1指向的是String常量池中的“good”对象,所以返回值为false。

          执行到第11行,由于String类中的equals判断的是对象的内容而不是内存地址,由于所有内容都是good,所以返回值为true。

          第12行与第10行类似。
答案:两个对象、没有对象、1个对象、false、true、false

二、 String 、 StringBuffer、StringBuilder的区别

1.可变与不可变

a) String 不可变

b)StringBuffer、StringBuilder可变

2.是否多线程安全

a)String类中对象,也就可以理解为常量。显然是线程安全的。

b)AbstractStringBuilder是StringBuffer和StringBuilder共同父类。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。StringBuilder并没有对方法加同步锁,所以是非线程安全的。

3.     执行速度

  a)       StingBuilder>StringBuffer>String

对于三者使用的总结: 1.如果要操作少量的数据用String

                                     2.多线程操作字符串缓冲区下操作大量数据 StringBuffer

                                     3.单线程操作字符串缓冲区下操作大量数据 StringBuilder

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值