Java的String、StringBuilder 和 StringBuffer类详解及区别

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

java基础(jdk1.8)

**

String相关

**

字符串在Java基础中是比较重要的,这里我们对String及StringBuffer和StringBuilder进行研究

      字符串的操作我们在String、StringBuffer、StringBuilder这里同时对这三个类进行分析

String

源码内容:

    1、String是一个final的class

    2、String实现了Serializable, Comparable, CharSequence三个接口

    3、String储存字符串用的是一个final的char数组

    4、String的构造方法传参可为空、字符数组(char [])、字节数组(byte [])和String字符串常量

根据源码,我们可以得出String的特点

1.String类不可被继承、且String字符串是一个常量

2.String类实现了compareTo方法、charAt、toString方法…

除此之外,我们要知道的还有


 String str = new String("123abc");

 String str1 = "123abc";

这两个到底创建了几个对象,它们分别储存在哪,区别又是什么?

这个容易牵扯到Java内存,这里可以戳戳看,但下面阅读不是太影响

我们知道的是new会将引用引用到堆空间,那么接下来就好办了

str = new String(“123abc”)

    1.str引用必定指向堆空间的new String(“123abc”)

    2.同时会从常量池(方法区的一部分)内寻找有无"123abc"这个字符串。方便理解起见,之后将常量池叫做String池

    3.String池没有这个字符串则创建一个对象在池中,有则不创建

这里注意

因为字符串经常创建,使用。所以String池为了节省空间、提高效率,String池不可重复

str1 = “123abc”

    1.str1没有使用new,那么str1自然直接引用到String池内

    2.String池内同样找是否已经有了同样的字符串

这里我们基本对这两有何区别已经了解,我们看一段代码和一个关系图来在加深印象


public class StrTest {

    public void strTest(){

        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);

        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s3 == s4);
        System.out.println(s1 == s3);

        System.out.println(s1 == s3.intern());

    }

    public static void main(String[] args) {

        StrTest strtest = new StrTest();

        strtest.strTest();

    }

}

结果


    true
    false
    false
    true

结果是此的原因也就出来了

上述我使用了s3.intern(),用它和s1比较,结果为true,这是intern将s3的引用从堆改到了String池。所以结果为true。

另外

==和equals

我们使用==比较的是地址,有一个方法为equals

equals方法源码


    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

这里,我们知道所有类都继承了Object类。

    看类是否将Object类的equals是否重写,重写则比较值、无则比较地址。

    而String将equals重写,所以equals方法是比较对象数值

    这时我们将之前的==改为equals,那么结果将全部为true

String类的其他方法

先瞧:

这里我挑几个看看

length()

    length()方法是字符串的长度。

String使用char数组,而length()源码调用的就是char数组的length方法

charAt(int index)

    charAt()方法是传入下标,返回下标对应的字符。

isEmpty()

    isEmpty()方法判断字符串是否为空

substring()

    substring()方法是截取字符串

根据传参的下标,对截取你所需要的部分(左闭右开)

在这里插入图片描述

StringBuilder 和 StringBuffer

StringBuilder和StringBuffer都继承的是AbstractStringBuilder,实现Serializable, CharSequence

而且两者的构造方法及方法基本一致,区别则是StringBuffer类的方法加了一个synchronized关键字,这个关键字保证了线程安全性。

因此StringBuilder是线程非安全类、StringBuffer是线程安全类

与String的区别:

1、String的值不可改变,而StringBuilder 和 StringBuffer的值可改变。

2、StringBuffer及Builder只能使用new关键字进行初始化,初始化调用其append方法再到super.append,如果非空则调用到System.arraycopy方法

3、StringBuffer及Builder没有重写equals方法1

StringBuilder 和 StringBuffer的常用方法:增删改

insert(int,obj)

从int位置插入obj(string、byte、char…)

delete(int,int)

从int到int删除(左闭右开)

replace(int,int,String)

左闭右开替换

length()

charAt(int index)

isEmpty()

substring()

补充

String a = "123";
//a在栈里,引用指向方法区里“123”这个对象(创建一个对象)
String b = "123";
//b指向方法区里“123”(未创建对象)
String c = new String("123");
//c 在堆创建一个对象并指向它,方法区有则不创建(创建一个对象)
String d = new String("456");
//d 在堆里和方法区分别创建一个(共创建两个对象)
String b = a+"12";
//这里并不是说b的值改变,而是将原来的b销毁,创建一个方法区的“12”对象,而这个a已经创建过了,最后将a+"12"共同创建一个新的对象(new堆上),和原来的b并不是同一个

注意

subString方法


    public String substring(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            throw new StringIndexOutOfBoundsException(end);
        if (start > end)
            throw new StringIndexOutOfBoundsException(end - start);
        return new String(value, start, end - start);
    }

返回的是一个new的对象

上一篇 》常用类

下一篇 》 异常处理

java StringBuilder详解 NULL 博文链接:https://hui-jing-880210.iteye.com/blog/2173195 立即下载

相关推荐

StringStringBufferStringBuilder区别——(详细叙述)

StringStringBufferStringBuilder区别 String StringBuffer StringBuilder 执行速度 最差 其次 最高 线程安全 线程安全 线程安全 线程不安全 使用场景 少量字符串操作 多线程环境下的大量操作 单线程环境下的大量操作 String: 对于String来说,是把数据存放在了常量池中,因为所有的String,默认都是以常量形式保存,且由final修饰,因此在线程池中它是线程安全的。因为每一个String当被创建好

Turniper的博客 5万+

java提供了StringStringBufferStringBuilder三个来封装字符串(String three brothers)(网络摘抄)

字符串 字符串就是一连串的字符序列,java提供了StringStringBufferStringBuilder三个来封装字符串,并提供了一系列方法来操作字符串对象。 StringStringBufferStringBuilder之间的区别如下: String创建的字符串是不可变的,当使用String创建一个字符串后,该字符串在内存...

jake_Aaron的博客 2148

StringStringBufferStringBuilder区别详解

虽然印象中记得StringBuffer是线程安全,所以性能比StringBuilder慢一丢丢,但是实话说对于它们3个的了解还是很浅,本文我们就深入♂一些,彻底搞明白这三兄贵。   首先我们要清楚一个知识:String是不可变的。 1.不可变的String 这是啥意思呢,就是一个String对象,它所存储的具体字符串值,是不可修改的。String本质上也是一个,它里面有很多属性方法,而存储的字符串值在它里面也只是一个char数组的属性而已,但是这个属性却被final修饰了,不可更改,所以这.

From zero 735

Java字符串

Java字符串

qq_64439709的博客 1235

Java学习之StringStringBufferStringBuilder区别特点

Java学习之StringStringBufferStringBuilder区别特点

sssss_summmer的博客 828

JavaStringStringBufferStringBuilder区别以及方法详解

1.区别: 1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String String最慢的原因:   String为字符串常量,而StringBuilderStringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。  2. 再来说线程安全 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的 3. 总结一下

qq_43743819的博客 256

javaStringStringBufferStringBuilder区别详解

StringJava 中基础且重要的,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个。它提供了 append add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。

weixin_60257072的博客 259

String详解, StringCharSequence区别, StringBuilderStringBuffer区别 (String系列之1)

String详解, StringCharSequence区别, StringBuilderStringBuffer区别 (String系列之1) 本章主要介绍StringCharSequence的区别,以及它们的API详细使用方法。 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01.html 更多内容请参考: 1.

XINJing的专栏 522

String,StringBuffer以及区别

Java中,因为String是final型的,所以使用String定义的字符串是一个常量,也就是说使用String定义的字符串一旦创建,其内容长度是不可改变的.为了便于对字符串进行修改,Java提供了StringBuffer(也成字符串缓冲区)来操作字符串.StringBufferString最大的区别在于他的内容长度都是可以改变的.StringBuffer就像一个字符容器,当在其中添加或删除字符时,操作的都是这个字符容器,因此并不会产生新的StringBuffer对象.

m0_74268079的博客 2282

StringStringBufferStringBuilder区别

StringStringBufferStringBuilder区别: 文章目录StringStringBufferStringBuilderStringBuffer是如何实现线程安全的呢?Java9的改进 String   String是不可变,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。   这个是String的解释,之前小咸儿看...

幸遇三杯酒好,况逢一朵花新 26万+

String,StringBufferStringBuilder区别

一、Java String ——String字符串常量 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 来创建操作字符串。 需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图: 我们可...

黎明前的准备 30万+

JavaStringStringBuilderStringBuffer区别

这三个的主要区别在两个方面:运算速度(运算性能或执行效率)线程安全性。 1、运算速度比较(通常情况下):StringBuilder &gt; StringBuffer &gt; String String是final不能被继承且为字符串常量,而StringBuilderStringBuffer均为字符串变量。String对象一旦创建便不可更改,而后两者是可更改的,它们只能通过构造函数来...

Calvin的博客 3万+

StringStringbufferStringbuilder区别

JAVAStringStringbufferStringbuilder区别** javaStringStringBufferStringBuilder区别及使用方法 String  String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。 String a = “a”; //假设a指向地址0x0001 a = “b”;//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不

bxl1998720的博客 1万+

javaStringStringBufferStringBuilder区别

简单介绍 java中用于处理字符串常用的有三个: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder 三者共同之处:都是final,不允许被继承,主要是从性能安全性上考虑的,因为这几个都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。 StringBuffer是线程安全,可以不需要额外的同步用于多线程中; StringBuilder是非同步,运行于多线程中就需要使用着单独同步...

fu6543210的博客 4317

JavaStringStringBufferStringBuilder区别

Strings are constant; their values cannot be changed after they

王德昌的博客 2万+

StringStringBufferStringBuilder区别

StringStringBufferStringBuilder区别 1、String的内容是不可改变的。能改变的只是其内存指向。 2、String对象不可修改指的是对象本身不可修改,而不是引用不可修改。 3、StringBuffer的对象内容是可以修改的。 4、String可以直接通过赋值的方式实现对象实例化,而StringBuffer只能通过构造方法的方式对象实例化。 5、StringBuffer在处理字符串的时候,不会生成新的对象。从内存这个角度来说,StringBuffer要比String

qq_57181249的博客 5804

StringStringBufferStringBuilder区别

StringStringBufferStringBuilder区别String String是不可变,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 这个是String的解释,之前看到这个情况,不能理解上述的解释,如下 String a = "123"; a = "456"; // 打印出来的a为456 System.out.println(a) 看到这里,不明白了,这不是明明已经对他进行修改了吗?为什么还说他是一个不可变呢? 经过学习

DDDDeng_的博客 7297

StringStringBuilderStringBuffer区别

在实际开发中需要对字符串进行频繁的修改的,不使用String;若要考虑线程安全的时候使用StringBuffer;若不需要考虑线程安全,选择使用StringBuilder

m0_68903702的博客 1247

Java中的StringStringBuffer StringBuilder 的应用

在实际开发中,我们可以根据具体的需求选择合适的: 如果需要表示一个固定的字符串,可以选择String。 如果需要在多线程环境中对字符串进行修改,可以选择StringBuffer。 如果需要在单线程环境中对字符串进行修改,并且对性能有较高要求,可以选择StringBuilder

MrxiaoAXiao的博客 1045
上一篇: 数据及符号
下一篇: Java异常及异常处理详解
xygzf
博客等级 码龄8年 16粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值