首页 > 编程语言 >(转)Java中的String、StringBuilder和StringBuffer

(转)Java中的String、StringBuilder和StringBuffer

时间:2023-05-06 18:13:40浏览次数:39  
标签:Java String 对象 StringBuilder StringBuffer 字符串 常量

1、String

String对象是不可变的,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

那么我们new一个String对象,比如

String a = new String("A")
String a2 = new String("A")

和直接创建一个字符串,比如

String b = "A"

这两种方法有什么区别呢。

对于第一种方法,当new一个String对象时会在栈空间开辟一块空间存放引用a,在堆空间中开辟一块空间存放一个新建的"A"对象,栈空间的引用指向堆空间中的新对象,如果存在两个相同的字符串,则会分配不同的内存地址,调用intern方法,intern方法会从字符串常量池中查询当前字符串是否存在,如果存在,就直接返回当前字符串,如果不存在就会将当前字符串放入常量池中,之后再返回;对于第二种方法,直接创建的时候,会先查看字符串常量池有没有相同的字符串,如果没有"A"会存放在字符串常量池,如果有引用则直接指向常量池中的地址。

说到这里关于字符串常量池,究竟是在方法区中,还是在堆中可以看一下这篇文章

字符串常量池和运行时常量池是在堆还是在方法区?

2、StringBuilder

Sting对象是不可变的,那么关于字符串的拼接是怎么实现的呢。

public static void main(String[] args) {
    String b = "cd";
    String s = "ab" + b + "ef";
    System.out.println(s); //abcdef
}

编译器会创建一个StringBuilder对象,用以构造最终的String,并为每个字符串调用一次StringBuilder的append()方法,总计三次。最终调用toString()生成结果。

StringBuilder在进行append连接字符串的时候并不是用String存储,而是存放到一个名为value的char数组当中,Sring中的value由final修饰,而另外两种可变字符串对象的value数组是可以扩容的,这样就不需要不停创建对象了。

数组默认的初始长度是16,扩容系数是value.length * 2 + 2,也即 (value.length << 1) + 2,而且只有当append之后的数据长度大于value.length时才会扩容一次,并不是每次连接都会进行扩容操作。

 

3、StringBuffer

StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized修饰。StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。

————————————————
原文链接:https://blog.csdn.net/weixin_44153131/article/details/126187193

标签:Java,String,对象,StringBuilder,StringBuffer,字符串,常量
From: https://www.cnblogs.com/bruce-he/p/17378190.html

相关文章

  • 如何理解理解Java对象与引用?
    一、关于对象与引用之间的一些基本概念  为便于说明,先定义一个类:classVehicle{intpassengers;intfuelcap;intmpg;}有了这个类,就可以用它来创建对象: Vehicleveh1=newVehicle() ,通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作:newVehicleVehicleveh1= ......
  • JavaScript封装大全
    JavaScript封装大全-持续更新Ajax封装//使用该封装需注意//Ajax(method(默认GET),url(网址必传),success(res){(成功时数据处理函数必传)},error(res)(失败时数据处理函数),data(网址中qurey部分用对象形式存储默认为空))//使用ES6语法classAjax{//解构传......
  • k10_java数据类型
    数据类型强类型语言java是强类型语言要求变量的使用过要严格符合规定,所有的变量需要先定义后才能使用。弱类型语言就是类型定义不太严格,变量名可以不可以直接使用,或者直接定义个变量名,不用声明其类型java数据类型分类————Java的数据类型分为两类基本数......
  • 28基于java的简单酒店数据管理
    本文章介绍一个基于java的简单酒店数据管理系统项目介绍该项目适用于初学java后,需要一个小练手的javaweb项目,该项目是只有一个酒店数据表,然后实现对该酒店增加,修改,删除和分页查询的小案例,虽然项目不是很复杂,但麻雀虽小但五脏俱全,适合于个人学习适用。项目使用的技术架构后......
  • java filter过滤器 读取配置文件properties的值
    http://www.yayihouse.com/yayishuwu/chapter/29811.获取application.properties的值如userId=1 2.一般实体中采用@Value既可获取@Value("userIdl")privateStringuserId; 但是在filter中,需要用上下文对象来获取filter的生命周期如下:web应用程序启动时,web服务器将创......
  • Java之Object类
    1、Object类概述 Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类(可以在代码中明确地写出声明要“继承Object类”,没有任何错误)。当然,数组也继承了Object类。但是,接口是不继承Object类的。接口只是是抽象类的延伸,可以将它看做是纯粹的抽象类,接口中的所有方法,......
  • Java文件流(IO流)
    在编程中,数据存储是重中之重,在之前的学习中所有程序中的数据都是临时存放在内存中的,不能做到有效存储和长久保存,而本次的文件流就暂时解决了数据不能长久存储的问题(虽然后面会学习数据库存储,但文件流存储也很常用)。须知无论是读取文件还是写入文件等操作,在计算机中都是以流的形式进......
  • javaScript 常用去除 ‘console
    javaScript常用去除‘console.log’办法手动注释掉console.log语句:可以手动在代码中注释掉所有console.log语句,但是这种方法比较繁琐,并且需要手动维护,不太适合大型项目。使用Babel插件去除console.log:Babel是一个JavaScript编译器,它可以将ES6+的代码转换成......
  • java类序列化和反序列化
    参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0https://blog.csdn.net/qq_42617455/article/details/1096223901、问题解答(1)序列化和反序列化都需要哪些操作对象要实现java.io.Serializable接口增加序列化ID(privatestaticfinallongserialVersionUID)转化成便于传......
  • java内存监控工具及命令
    关键字:内存监控工具及命令一篇非常好的内存监控知识,分享给爱学习的亲们.....jinfo:可以输出并修改运行时的java进程的opts。jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。jstat:一个极强的监视VM......