Java的String和StringBuffer和StringBuilder详解

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/45776403 Java的String和StringBuffer和StringBuilder详解作者:chszs,转载需注明。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/45776403

Java的String和StringBuffer和StringBuilder详解

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

前言

最近发现团队成员在Java代码方面的质量不够高,准备写一些基础的文章,供大家参考。

一、定义

String是不可变字符序列。
StringBuffer是可变的字符序列。
StringBuilder也是可变的字符序列。

1、StringBuffer和StringBuilder的唯一区别

StringBuffer对象是线程安全的,这意味着StringBuffer对象可以同时被多个并行线程修改,因为它所有的方法都被声明为”synchronized(同步)”。
StringBuilder类是JDK 1.5版引入的非线程安全的类,这意味着它的所有方法都是非同步方法。
因此,在单一模型的应用中,我们应该使用StringBuilder,这样对象不会有锁定和解锁,这样性能就会增加。
而在单线程模型应用中,会按顺序执行操作,因此对象不会崩溃。

2、什么时候选择String和StringBuffer

如果我们不需要在同一内存空间中存储字符串的修改,那么我们必须使用String。
而如果需要在同一内存空间中存储字符串的修改,那么我们必须使用StringBuffer或StringBuilder。

3、String的优缺点

优点:使用String时,如果字符串发生修改,那么修改后的内容会保存在内存中的不同位置,这样的话,内存中就同时有原始的字符串值和修改后的字符串值。
缺点:对于每一个这样的操作,它会消耗更多的内存,因为它把修改后的字符串值存储在新的内存空间中。因此它会导致性能问题。
解决方案:要解决这个性能问题,开发者应该使用StringBuilder或者StringBuffer来实现字符串的修改,然后再转换成String对象把字符串传递给用户。

4、StringBuffer和StringBuilder的优缺点

优点:StringBuffer和StringBuilder有更好的性能,因为它们对内存的消耗更少,所有对字符串的修改操作都存储在同一内存位置。
缺点:修改前的原始字符串值不会被保留。

二、创建String或StringBuffer对象

String对象的创建有两种方式
1)直接使用字符串赋值创建对象

String str = "instance of java for us";

2)使用String构造器创建对象

String str = new String("instance of java for us");

StringBuffer对象的创建
使用构造器

StringBuffer str = new StringBuffer();

StringBuilder对象的创建
使用构造器

StringBuilder str = new StringBuilder();

三、在StringBuffer和StringBuilder只能执行指定的操作

可以执行字符串的追加、插入、删除、反向等操作
因为String对象是不可变的对象,因此这些操作不能在String对象中执行。

四、字符串的连接

使用String对象来把新字符串连接到现有的字符串上,有两种方法:

1、使用“+”操作符

2、使用concat()方法

而使用StringBuffer连接字符串,只有一种方法:使用append()方法
而使用StringBuilder连接字符串,只有一种方法:使用append()方法
示例代码:

package com.ch;
public Class Demo{
public static void main(String args[]) {
    String str="Java";
    StringBuffer sb= new StringBuffer("Java");
    StringBuilder sbr= new StringBuilder("Java");

    System.out.println(str.concat(" language"));    
    System.out.println(sb.append(" language"));
    System.out.println(sbr.append(" language"));
    }
}

输出:

Java language
Java language
Java language

五、比较

Object对equals()方法的定义是:对象a和b如果是同一个对象的引用,那么a.equals(b)返回true,否则返回false。
而String类重写了Object的equals()方法,String对象的equals()方法比较的是内容,内容相等则返回true。
StringBuffer和StringBuilder则没有重写equals()方法,与Object的equals()方法的定义相同。

目录
相关文章
|
9天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
15天前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
2月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
122 65
|
26天前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
38 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
9天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
25天前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
49 7
|
27天前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
2月前
|
存储 SQL 安全
Java零基础-StringBuilder类详解
【10月更文挑战第12天】Java零基础教学篇,手把手实践教学!
32 5
|
2月前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
57 1
|
2月前
|
存储 SQL 安全
Java零基础-StringBuilder类详解
【10月更文挑战第11天】Java零基础教学篇,手把手实践教学!
41 1