Java中String、StringBuffer及StringBuilder(小结)

String类是java中常用来对字符串操作的一个类,java程序中所有的字符串文字都可被实现为此类的实例。
与之还有StringBuffer和StringBuilder两个类可对字符串进行操作,下面将对前面提到的这三个类做以总结。

String

理解String

String 不同于Java中规定的八中基本数据类型,它属于这些之外的引用类型,在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而其引用的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
*引用类型:它是由类型的实际值引用表示的数据类型(功能上可简单的类比成C语言的指针,只是在栈上开辟了一小块内存空间保存一个地址,但没有指针中直接访问内存的概念)

Sting str = "hello word";

在这里插入图片描述

如何创建字符串

常用的几种构造方法:

// 方式一
String str = "Hello wold";
// 方式二
String str2 = new String("Hello wold");

官方文档中提供的 String 构造方法的部分截取
在这里插入图片描述

Sting字符串的比较

因为其是引用类型,所以两种该类型创建的变量使用 == 进行比较时,与基本数据类型不同,而比较的是这两个引用是否指向同一个对象,而要想要比较其表示的对象值是否相等时,需要用到String类下的equals方法

String str1 = new String("hello word")String str2 = new String("hello word");
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true

在这里插入图片描述

字符常量池的理解

在Java中设计String类时使用了一种设计模式——享元模式(即对对象的重用提供一种解决方案,使用共享技术对相同或者相似对象实现重用)
JVM虚拟机中,底层维护了一块区域用来存放字符串,即字符串常量池
如果在创建String字符串是使用直接赋值的方式,则该实例化的对象会自动被保存到字符串常量池中
如下次再使用相同方法创造,若字符串常量池中以用该值的对象,则会直接引用该对象,反正再创建
在这里插入图片描述

ps:如果使用构造方法创建字符串(new String(“abc”)),则会在堆上开辟两个内存空间不会自动保存到字符串常量池中

String类两种实例化对象的区别:

直接赋值创建(String str = “abc”):只开辟一个内存空间,并该字符串对象会自动保存到字符串常量池中以供下次创建使用
构造方法创建(String str = new String(“abc”)):会开辟两个内存空间,new的对象在堆普通区中,创建的字符串在常量池中,并且不会自动保存到字符串常量池中,如入池需要调用String的intern()方法

为什么String字符串要设为不可变的?

1.方便实现字符串常量池,不可变则无需考虑深浅拷贝问题
2.因为对象不可变致使无需考虑线程安全问题
3.不可变更加方便缓存hashCode,作为key时可以跟高效的保存到HashMap中

String类常用api
在这里插入图片描述

StringBuffer与StringBuilder

由于String声明的字符串本身不可变,如要改变其内容只能改变其引用的指向,因此为了String字符串修改方便,Java提供了两个类StringBuffer与StringBuilder来进行操作

StringBuffer与StringBuilder的功能大部分相同,下面介绍一些其常用api

Constructor :
在这里插入图片描述
Modifier:
在这里插入图片描述
String 转 StringBuffer/StringBuilder 需要用StringBuffer与StringBuilder的构造方法
StringBuffer与StringBuilder 转 String 直接使用toString()方法

String,StringBuffer与StringBuilder的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可修改
  2. StringBuffer采用同步锁实现了线程安全;StringBuilder未实现线程安全
  3. StringBuffer的toString()方法添加了一个缓冲区,StringBuilder直接复制一次字符数组构建字符串
  4. 由于StringBuilder未实现线程安全,其方法未加同步锁,使得StringBulider的执行效率远高于StringBuffer

以上便是对String的知识点小结,随着后续学习的深入还会同步的对内容进行补充和修改,如能帮助到各位博友将不胜荣幸,敬请斧正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
StringStringBufferStringBuilder都是Java用于处理字符串的类。 String是一个不可变的字符串类,也就是说一旦创建了一个String对象,它的值就不能被修改。每次对String进行修改操作时,都会创建一个新的String对象,这样会浪费内存空间和时间。因此,当需要频繁地对字符串进行修改时,使用String并不高效。 StringBufferStringBuilder是可变的字符串类,它们可以被用来进行字符串的修改操作。StringBufferStringBuilder的主要区别在于StringBuffer是线程安全的,而StringBuilder是非线程安全的。这意味着在多线程环境下,如果有多个线程同时访问一个StringBuffer对象,它们是安全的;而多个线程同时访问一个StringBuilder对象时,可能会导致数据错乱。 使用StringBufferStringBuilder的场景通常是在需要频繁地对字符串进行修改的情况下。例如,在循环拼接字符串、在递归函数修改字符串等情况下,使用StringBufferStringBuilder可以提高性能。 如果需要将StringBufferStringBuilder转换为String对象,可以使用两种方式。一种是调用它们的toString()方法,将其转换为String对象。另一种是使用String的构造器String(StringBuffer buffer)来创建一个新的String对象,将StringBufferStringBuilder的内容复制到新的String对象。 总结起来,String是不可变的字符串类,而StringBufferStringBuilder是可变的字符串类,适用于需要频繁修改字符串的场景。转换为String对象可以通过调用toString()方法或使用String的构造器来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值