【JavaSE】string与StringBuilder和StringBuffer

2024-01-03 08:55:47

区别:

  1. 不可变性:

    • String: String 类是不可变的,一旦创建就不能被修改。对字符串的任何操作都会创建一个新的字符串对象。
    • StringBuffer: StringBuffer 是可变的,允许对字符串进行修改,而不创建新的对象。
    • StringBuilder: StringBuilder 也是可变的,与 StringBuffer 类似,但不同的是 StringBuilder 不是线程安全的。
  2. 线程安全性:

    • String: 是线程安全的,因为它的不可变性使得多线程操作时不会有竞争条件。
    • StringBuffer: 是线程安全的,内部的方法使用了 synchronized 关键字,可以保证线程安全。
    • StringBuilder: 不是线程安全的,适合在单线程环境下使用。
  3. 性能:

    • String: 对于字符串的拼接或修改,每次都会生成新的字符串对象,可能会造成大量的对象创建和销毁,影响性能。
    • StringBuffer 和 StringBuilder: 对于字符串的拼接或修改,可以直接在原对象上进行操作,避免了不必要的对象创建,因此在性能上优于 String。

类名包含 Buffer 的类的内部实现原理和优势:

????????类名包含 "Buffer" 的类通常是为了提供一种缓冲区的概念,用于暂时存储数据,以提高对数据的读写效率。这些类常用于 I/O 操作、通道处理等场景。主要的类有 ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 和 DoubleBuffer。

内部实现原理: 这些 Buffer 类在内部通常使用数组(Array)作为数据存储结构提供了对数组的包装和操作方法,同时也包含了读写指针等信息。它们提供了一系列方法来方便地对缓冲区进行读写操作,例如 put() 用于写入数据,get() 用于读取数据等。

优势:

  1. 提高性能: 使用缓冲区可以减少直接对底层数组进行操作的复杂性,提高了读写数据的效率。
  2. 统一接口: 不同数据类型的 Buffer 类提供了相似的接口,使得处理不同类型数据时更加方便。
  3. 底层数据结构: 使用数组作为底层数据结构,使得 Buffer 在底层实现上更加高效。

????????总的来说,类名包含 "Buffer" 的类主要提供了对数据的缓冲区管理,通过对底层数组的封装,提高了对数据的读写效率。这些类在处理 I/O 操作、通道处理等场景中都发挥着重要作用。

package aop;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

public class BufferExample {
    public static void main(String[] args) {
        // 使用 StringBuilder 进行字符串拼接
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("Hello, ");
        stringBuilder.append("world!");
        String resultString = stringBuilder.toString();
        System.out.println("Concatenated String: " + resultString);

        // 使用 ByteBuffer 进行字节缓冲区操作
        String textData = "ByteBuffer Example";
        Charset charset = Charset.forName("UTF-8");

        // 将字符串转换为字节数组
        byte[] byteData = textData.getBytes(charset);

        // 使用 ByteBuffer 存储字节数据
        ByteBuffer byteBuffer = ByteBuffer.allocate(byteData.length);
        byteBuffer.put(byteData);

        // 切换到读取模式
        byteBuffer.flip();

        // 使用 CharBuffer 存储字符数据
        CharBuffer charBuffer = charset.decode(byteBuffer);

        // 输出字符数据
        System.out.println("Decoded Text: " + charBuffer.toString());
    }
}

文章来源:https://blog.csdn.net/m0_62645012/article/details/135348968
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。