String StringBuilder StringBuffer的区别

String

1、String的定义

String是Java中的字符串关键字,用来声明一个字符串变量

2、String在Java中的实现

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

String在Java中被定义为final类型的,即不可修改,不可被继承、方法不能被重写、属性不能被修改,因此对String类型的操作,如拼接、截取、赋值等,都会在常量池中创建一个新的字符串对象,并将变量指向新的对象

StringBuilder和StringBuffer

1、StringBuilder和StringBuffer的继承和实现

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

StringBuilder和StringBuffer的继承类和实现类都一样,都继承自AbstractStringBuilder类

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

AbstractStringBuilder中定义的变量value是一个可以修改的字符数组,这表示通过StringBuilder和StringBuffer定义的字符串发生修改时,不会创建新的对象。

2、StringBuffer和StringBuilder的区别

StringBuffer和StriStringBuilder的实现是相同的,但是StringBuffer是线程安全的,StringBuilder是非线程安全的。StringBuffer中的许多方法都被关键字synchronized修饰,这保证了这些方法是线程安全的,而StringBuilder中的方法没有被synchronized关键字修饰,因此StringBuffer的速度慢于StringBuilder,开销大于StringBuilder,但是在多线程中,只能使用StringBuffer。

String、StringBuilder、StringBuffer的比较

1、开销和执行速度

StringBuilder > StringBuffer > String
String是不可修改的,因此每次对String进行操作,都会产生新的字符串对象,开销最大,StringBuffer是线程安全的,相较于非线程安全的StringBuilder,开销和执行速度都较差

通过toString方法打印类的地址

Java的每个类从根本上都是继承自Object,Object类中定义了toString方法,当一个容器类想要通过toString打印自己的地址时,可以通过调用super.toString()打印

import java.util.ArrayList;
import java.util.List;

public class InfiniteRecursion {
    public String toString() {
        return "InfiniteRecursion address : " + super.toString();
    }

    public static void main(String[] args) {
        InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
        System.out.println(infiniteRecursion);
    }
}

执行结果如下

InfiniteRecursion address : com.myProject.InfiniteRecursion@677327b6

若将super.toString()改为this关键字,则发生栈溢出错误

Exception in thread "main" java.lang.StackOverflowError

是因为在执行"InfiniteRecursion address : " + this时发生自动类型转换,将InfiniteRecursion类型转换为String类型,此时会调用toString()方法,导致了无尽的递归调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值