Java基础(3)String、StringBuffer、StringBuilder

2024-04-29 08:20

本文主要是介绍Java基础(3)String、StringBuffer、StringBuilder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Java中,字符串处理是日常开发的重要组成部分。主要有三种类型的类用于创建和操作字符串:StringStringBufferStringBuilder。虽然这三个类都能够处理字符串,但它们在功能和性能方面存在显著差异。

String

String是不可变的(immutable)。每当对字符串进行修改时,实际上是创建了一个新的String对象。因此,频繁修改字符串会导致大量内存占用和最终的垃圾回收,这可能会影响性能。

String str = "Hello";
str = str + " World"; // 创建了一个新的String对象
源码解析(简化)

String类的内部,内容存储在一个final字符数组中,这就是为什么字符串是不可变的原因。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {private final char value[];// 其他方法和构造器...
}

StringBuffer

StringBuffer是可变的,并且是线程安全的,所有的公共方法都是同步的。这意味着在多线程环境下,StringBuffer的操作会比StringBuilder慢,因为它确保了线程安全。

StringBuffer buffer = new StringBuffer("Hello");
buffer.append(" World"); // 可以在不创建新对象的情况下修改字符串
源码解析(简化)

StringBuffer内部使用字符数组存储字符串内容,但没有使用final修饰符,所以内容是可变的。它通过synchronized关键字加锁以保证线程安全。

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {// AbstractStringBuilder内部实现char[] value;@Overridepublic synchronized StringBuffer append(String str) {super.append(str);return this;}// 其他方法...
}

StringBuilder

StringBuilderStringBuffer十分相似,都是可变的,并且内部实现也类似。不同之处在于StringBuilder的方法没有同步,这使得它在单线程环境下比StringBuffer更快,因为它避免了线程安全带来的性能开销。

StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 可以在不创建新对象的情况下修改字符串
源码解析(简化)

StringBuilder的内部也是使用字符数组来存储数据,但是它没有StringBuffer中的synchronized关键字,这意味着它不是线程安全的。

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {// AbstractStringBuilder内部实现char[] value;@Overridepublic StringBuilder append(String str) {super.append(str);return this;}// 其他方法...
}

代码演示

为了更直观地展示这三种类的使用,以下是一个简单的代码示例:

// String
String s = "Java";
s = s.concat(" Guide"); // 新建String对象// StringBuffer
StringBuffer sb = new StringBuffer("Java");
sb.append(" Guide"); // 在原有对象基础上修改// StringBuilder
StringBuilder sd = new StringBuilder("Java");
sd.append(" Guide"); // 在原有对象基础上修改

总结

  • String:不可变,适用于字符串少量操作的场景。
  • StringBuffer:可变,线程安全,适用于多线程环境下需要大量修改字符串内容的场景。
  • StringBuilder:可变,非线程安全,适用于单线程环境下需要大量修改字符串内容的场景,性能优于StringBuffer

选择哪一种取决于你的具体需求,尤其是线程安全和性能之间的权衡。

这篇关于Java基础(3)String、StringBuffer、StringBuilder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945573

相关文章

Java枚举类型的基本应用

1. 在J2SE5.0中要定义枚举类型是使用enum关键词,枚举类型主要提供一些常数。如下列代码定义了Action枚举类型:   Java代码   public enum Action{TURN_LEFT,TURN_RIGHT,SHOOT}   在Action.java中编写此段代码并编译,虽然语法上不像是在定义类,但枚举类型本质上就是一个类。所以编译完成后,会产生一

Java枚举类型的基本使用(一)

突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。既然不明白就抽时间研究下吧。 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都

玫瑰花Java web程序

玫瑰花Java web程序   有兴趣的同学可以参考一下 Java类RoseController package com.spring.controller;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;

探索Java的未来!

Java是一种成熟、稳定且广泛使用的编程语言,它在企业级应用、Android 应用开发和大数据处理等领域有着广泛的应用。虽然Java已经存在了30多年,但它依然在不断发展和进化。以下是一些可能会影响 Java 未来的因素: 新版本的发布:Java的维护者Oracle会定期发布新版本的Java,每个版本通常都会引入新的语言特性、性能改进和安全性增强。例如,Java 17 和 Project Lo

Java之Socket的TCP

//客户端发数据到服务端 * Tcp传输,客户端建立的过程。 * 1,创建tcp客户端socket服务。使用的是Socket对象。 * 建议该对象一创建就明确目的地。要连接的主机。  * 2,如果连接建立成功,说明数据传输通道已建立。 * 该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入,又有输出。 * 想要输入或者输出流对象,可以找Socket来获取。  * 可以通过ge

Java设计模式-------观察者模式

* 简单来说,观察者模式=发布者+订阅者。下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:  * 猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,  * 猎头就会把这个信息通知给曾经向他订阅过的人。 猎头接口: package com.pattern.observer;/*** @author Qixuan.Chen* 创建

Java设计模式------------策略模式

下面是一个有关于策略模式的故事。假设Mike在开车的时候,会很频繁的加速,有一天因为超速他被一个警察拦下来了。有可能这个警察会比较友好,  没开任何罚单就让Mike把车开走了。(我们把这类型的警察称之为“NicePolice”)。也有可能Mike遇到了一个不太友好的警察,然后这个警察  给Mike出具了一张罚单。(我们把这类型的警察称之为“HardPolice”)。Mike其实并不知道他会遇到什么

memcached第一个程序(memcached --Java客户端spymemcached-2.10.6.jar)

第一步安装memcached  for win64版本,这样可以再本机链接服务pc 链接别的pc,如果它的pc上有装memcached就可以链接 该程序是在spring 的web程序上的demo (memcached --Java客户端spymemcached-2.10.6.jar) package com.memcached.controller;import java.io.IO

Java简易聊天室程序socket

Java简易聊天室程序socket chatroomdemo.java package com.socket.demo;import java.io.IOException;import java.net.DatagramSocket;public class ChatRoomDemo {/*** @param args* @throws IOException*/public stat