zoukankan      html  css  js  c++  java
  • 【Java基础】String、StringBuffer、StringBuilder

    我是 啤酒就辣条,一个Java。
    学而时习之,不亦说乎?希望通过博客的形式,总结、分享,梳理自己、帮助他人。
    另外,啤酒就辣条,味道不错哦~

    可变性

    可变性是指引用所指向地址区域的内容是否可变。 下面通过示例来说明String是不可变的,StringBuffer、StringBuilder是可变的

    示例

    public class StringTest {
        public static void main(String[] args) {
            String string = "初始值";
            StringBuffer stringBuffer = new StringBuffer("初始值");
            StringBuilder stringBuilder = new StringBuilder("初始值");
            System.out.println("string:"+string.hashCode());
            System.out.println("stringBuffer:"+stringBuffer.hashCode());
            System.out.println("stringBuilder:"+stringBuilder.hashCode());
            string = string+"更新了";
            stringBuffer = stringBuffer.append("更新了");
            stringBuilder = stringBuilder.append("更新了");
            System.out.println("***********************************");
            System.out.println("string:"+string.hashCode());
            System.out.println("stringBuffer:"+stringBuffer.hashCode());
            System.out.println("stringBuilder:"+stringBuilder.hashCode());
        }
    }
    输出:
    string:20934318
    stringBuffer:1452126962
    stringBuilder:931919113
    ***********************************
    string:910164828
    stringBuffer:1452126962
    stringBuilder:931919113
    

    通过改变值并输出指向地址hashCode,可以看出string指向的地址变了,原地址(20934318)内容还是“初始值”,新地址(910164828)内容是“改变值更新了”。而stringBuffer和stringBuilder的地址并没有改变,是在原地址上改变数据。所以说String是不可变的,StringBuffer和StringBuilder是可变的

    源码

    private final char value[];
    

    这是String的源码,可以看出value[]是被final修饰的,所以不可改变。这样极大方便了常量池数据复用

    char[] value;
    

    这是StringBuffer、StringBuilder共同的父类AbstractStringBuilder的变量,没有被final修饰,所以可以改变。

    线程安全

    线程安全是指多个线程操作同一数据,数据不会被污染。解决方案一般是操作的时候加锁,可用关键字synchronized

    由于String每次都是新开辟地址,所以数据不会被污染,是线程安全的。

    StringBuffer绝大部分方法都是加了synchronized,所以也是线程安全的。

    StringBuilder,方法没有被synchronized修饰,所以是线程不安全的。

    显而易见,没有被synchronized执行效率最高,所以字符串追加的速度是StringBuilder > StringBuffer > String。

    应用场景

    String 适合基本不会改变的常量。

    StringBuffer 适合多线程下经常改变的值。

    StringBuilder 适合单线程下经常改变的值。

  • 相关阅读:
    kafka 学习笔记
    awk命令详解
    apache 的 配置项
    Apache 的 httpd.conf 详解
    如何设置httpd-mpm-conf的参数
    apache 服务器概述--安装(一)
    centos 修改时区
    docker(三)docker镜像和镜像发布方法
    docker(二)部署docker容器虚拟化平台
    sql的存储过程使用详解--基本语法
  • 原文地址:https://www.cnblogs.com/pjjlt/p/12408092.html
Copyright © 2011-2022 走看看