JDK源码分析之String、StringBuilder和StringBuffer

yizhihongxing

JDK源码分析之String、StringBuilder和StringBuffer

什么是String、StringBuilder和StringBuffer

  • String是Java中的一个不可变字符序列,使用final char[] value来存储数据,也就是说,一旦被初始化,就不能再对其进行修改。
  • StringBuilder和StringBuffer实现的是可变的字符序列,都是在原有的值基础上进行修改,区别在于StringBuilder是非线程安全的,而StringBuffer是线程安全的。

String、StringBuilder和StringBuffer的区别

  • String是不可变的,每次修改都会产生新的对象,效率相对较低,但在多线程的情况下是线程安全的。
  • StringBuilder是可变的,每次修改都是在原有的对象中进行修改,效率相对较高,但在多线程的情况下是不安全的。
  • StringBuffer是可变的,每次修改都是在原有的对象中进行修改,效率也不如StringBuilder高,但在多线程的情况下是线程安全的。

String、StringBuilder和StringBuffer的使用场景

  • 当字符串内容不会改变时,使用String;
  • 当字符串内容经常会发生改变时,并且不是在多线程环境下,使用StringBuilder;
  • 当字符串内容经常会发生改变时,并且是在多线程环境下,使用StringBuffer。

String、StringBuilder和StringBuffer的源码实现分析

String的源码实现

  • String底层实现是一个char数组,使用final修饰,也就是说,一旦被初始化,就不能再对其进行修改;
  • String在创建过程中会常量池中查找是否有相同值的字符串,如果有就直接返回该字符串的引用,否则才会创建新的字符串。

示例1:String的使用

String str = "hello world";
System.out.println(str);//输出hello world
  • 上面的代码中,字符串"hello world"以常量的形式存储在常量池中,当我们定义一个字符串变量str时,只是将该字符串的地址赋值给str,而并不是重新创建一个字符串。

StringBuilder的源码实现

  • StringBuilder底层实现也是一个char数组,但并没有使用final修饰,因此可以进行修改;
  • 在进行字符串拼接等操作时,会根据当前的容量和最小需要的容量来判断是否需要扩容,扩容的大小为原来的2倍+2;
  • StringBuilder没有线程安全的实现。

示例2:StringBuilder的使用

StringBuilder builder = new StringBuilder();
builder.append("Hello");
builder.append(" World");
System.out.println(builder.toString());//输出Hello World
  • 上面的代码中,我们通过append方法进行字符串拼接,最终输出Hello World。

StringBuffer的源码实现

  • StringBuffer底层实现也是一个char数组,但是所有的方法都使用了synchronized关键字进行同步,因此是线程安全的;
  • 在进行字符串拼接等操作时,会根据当前的容量和最小需要的容量来判断是否需要扩容,扩容的大小为原来的2倍+2。

总结

  • String、StringBuilder和StringBuffer都是用来存储字符串的类,它们之间有很多的区别,根据不同的场景选择合适的类使用是十分重要的;
  • 源码实现中,需要注意String的不可变性,而StringBuilder和StringBuffer的扩容机制。

参考资料:

  • 《深入理解Java虚拟机》
  • 《Effective Java》

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDK源码分析之String、StringBuilder和StringBuffer - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java的nio的使用示例分享

    Java NIO的使用示例分享 Java NIO(New IO)是从Java 1.4版本引入的替代标准IO的API,它提供了更快的IO操作,包括文件操作、网络操作等。本篇文章将详细介绍Java NIO的使用示例。 NIO基础知识 NIO的核心是缓冲区(Buffer)和通道(Channel)。缓冲区是一个对象,在IO操作中作为数据容器使用,通道则是表示和数据源…

    Java 2023年5月20日
    00
  • 一个用JSP做的日历

    下面我来为您详细讲解“一个用JSP做的日历”的完整攻略。 1. 准备工作 在使用JSP制作日历前,需要准备以下工具和环境: Java Web开发环境(如Apache Tomcat) 文本编辑器(如Notepad++, Sublime Text等) 了解基本的HTML、CSS和JavaScript 2. 创建JSP文件 首先,创建一个JSP文件,并添加HTML…

    Java 2023年6月15日
    00
  • 基于SpringBoot核心原理(自动配置、事件驱动、Condition)

    我将详细讲解基于SpringBoot核心原理的完整攻略,包括自动配置、事件驱动和Condition。 自动配置 SpringBoot通过自动配置(autocconfiguration)的方式,大大减轻了开发人员的工作负担。自动配置就是在应用运行时,根据类路径下的jar包、类的反射信息、注解等信息,自动配置应用所需要的组件和参数,而不需要显示的在代码中进行配置…

    Java 2023年5月15日
    00
  • Java面试题之基本语法(图解)

    Java 面试题之基本语法攻略 1. 概述 本篇攻略将涵盖 Java 基本语法面试题的相关知识点,包括数据类型、流程控制、对象、类、接口等方面。这些知识点是 Java 程序员必须了解和掌握的内容,在面试中也是常常被提及到的话题。掌握这些知识点能够让你在面试中更加得心应手。 本攻略分为以下几个部分: 数据类型 流程控制 对象与类 接口 2. 数据类型 Java…

    Java 2023年5月23日
    00
  • Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    这里提供一种Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法,共分为以下几个步骤: 步骤一:导入必要的依赖库 Java的MD5加密算法和FTP传输需要用到两个依赖库:commons-codec和commons-net。所以,需要在Java项目中导入相应的依赖库,示例代码如下: <dependency> <groupId&gt…

    Java 2023年5月23日
    00
  • 详解Java中的八种单例创建方式

    下面我来详细讲解Java中的八种单例创建方式的完整攻略。 标题 一、单例模式概述 单例模式是设计模式中常见的一种,用于保证一个类仅有一个实例,并提供一个全局的访问点进行访问。 二、Java中八种单例创建方式 1. 饿汉式 饿汉式是最基本的实现方式,它在类加载的时候就创建了对象实例。 public class Singleton { private stati…

    Java 2023年5月26日
    00
  • Sprint Boot @EnableTransactionManagement使用方法详解

    在Spring Boot中,@EnableTransactionManagement注解用于启用事务管理。使用@EnableTransactionManagement注解可以确保在使用@Transactional注解时,Spring Boot能够正确地管理事务。本文将详细介绍@EnableTransactionManagement注解的作用和使用方法,并提供…

    Java 2023年5月5日
    00
  • Java数组与二维数组及替换空格实战真题讲解

    标题:Java数组与二维数组及替换空格实战真题讲解 一、Java数组 在Java中,数组是一组相同类型数据的集合。数组可以存储基本数据类型和对象类型。数组的声明方式如下: //声明一个int类型的数组 int[] array = new int[5]; //声明一个String类型的数组 String[] strs = new String[10]; 数组中…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部