zoukankan      html  css  js  c++  java
  • String、StringBuffer和StringBuilder区别

    String、StringBuffer和StringBuilder区别

    1、长度是否可变

    • String 是被 final 修饰的,他的长度是不可变的,就算调用 String 的concat 方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的 String 的值赋给新创建的对象
    • StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象,StringBuffer 与 StringBuilder 中的方法和功能完全是等价的。调用StringBuffer 的 append 方法,来改变 StringBuffer 的长度,并且,相比较于 StringBuffer,String 一旦发生长度变化,是非常耗费内存的!

    2、执行效率

    • 三者在执行速度方面的比较:StringBuilder > StringBuffer > String

    3、应用场景

    •  如果要操作少量的数据用 = String
    • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

    StringBuffer和StringBuilder区别

    1、是否线程安全

    • StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问),StringBuffer是线程安全的。只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

    2、应用场景

    • 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
    • 然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。 append方法与直接使用+串联相比,减少常量池的浪费。

    字符串联的方式

    1、测试案例:

    package ecut.strings;
    
    /**
     * 当 字符串 变量 参与 串联 操作时
     * 是通过 StringBuilder ( 或 StringBuffer ) 类及其 append 方法实现的
     */
    public class StringTest5 {
    
        public static void main(String[] args) {
            
            String a = "abc" ;
            String b = "xyz";
            
            String d = "abcxyz" ;
            // 两个字符串字面值 通过 + 串联,直接在 池中完成
            String c = "abc" + "xyz" ; // + 是 "串联" 作用
    
            System.out.println( c == d );
            
            System.out.println( "~~~~~~~~~~~~~~" );
            
            // 字符串串联是通过 StringBuilder ( 或 StringBuffer ) 类及其 append 方法实现的
            // 1、StringBuilder sb = new StringBuilder( a );
            // 2、sb.append( b ) ;
            // 3、sb.toString() ---> new String( chars )
            String e = a + b ;
            System.out.println( e == c );
            System.out.println( e == d );
            
            String f = e.intern();
            
            System.out.println( f == d );
            //JAVA编译器对string + 基本类型/常量 是当成常量表达式直接求值来优化的。  运行期的两个string相加,会产生新的对象的,存储在堆(heap)中 
            String g = a + "xyz" ;//a为变量,在运行期才会被解析。 
            System.out.println( g == c );
            
            final String h = "abc" ;
            String i = h + "xyz" ;
            System.out.println( i == c );//h为常量,编译期会被优化  
            
        }
    
    }

    运行结果如下:

    true
    ~~~~~~~~~~~~~~
    false
    false
    true
    false
    true

    两个字符串字面值 通过 + 串联,直接在 池中完成,例如String c = "abc" + "xyz" ; + 是 "串联" 作用。两个string对象用+,是在编译器被优化为StringBuild再进行append()。

    牛客网笔试题

    1、应用程序的main方法中有以下语句,则输出的结果( )

    String s1=new String( ” xyz ” );
    
    String s2=new String( ” xyz ” );
    
    Boolean b1=s1.equals(s2);
    
    Boolean b2=(s1==s2);
    
    System .out.print(b1+ ” ” +b2); 

    正确答案: A

    A、true false

    B、false  true

    C、true true

    D、false  false

    解析:

    • 所有的 "" 包起来的 字符串字面值一律放在字符串常量池中,去字符串常量池池寻找相同内容的字符串。
    • 如果存在就直接拿出来应用,如果不存在则创建一个新的字符串放在常量池中通过 new关键字创建 String 对象,每次调用都会创建一个新的对象。
    • == 判断两个对象是否指向同一个引用,比较的是堆内存中的地址;而equals出了比较地址还比较“内容”是否一致。

    2、下面程序的运行结果是

    String str1 = "hello";
    
    String str2 = "he" + new String("llo");
    
    System.err.println(str1 == str2);

    正确答案: B

    A、 true

    B、false

    C、exception

    D、无输出

    3、java中,StringBuilder和StringBuffer的区别,下面说法错误的是?

    正确答案: C  

    A、StringBuffer是线程安全的

    B、StringBuilder是非线程安全的

    C、StringBuffer对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。

    D、效率比较String<StringBuffer<StringBuilder,但是在 String S1 = “This is only a” + “ simple” + “ test”时,String效率最高。

    解析:

    • String拼接会创建一个新的String对象,存储拼接后的字符串;StringBuffer拼接是直接在本身拼接,会即时刷新。
    • String只能拼接String类型的字符串;StringBuffer能够拼接所有的类型的值。   

    4、执行如下代码段后,变量s1引用的字符串值是(    )。

    String s1 = "ABCD"; 
    String s2 = "1234"; 
    System.out.println(s1 + s2); 

    正确答案: A 

    A、ABCD

    B、1234

    C、ABCD1234

    D、1234ABCD

    5、不考虑反射,String类型变量所指向内存空间中的内容是不能被改变的 。 ( )

    正确答案: A  

    A、正确

    B、错误

    解析:

    • String类不可变,指的是String对象内容不可变,因为'String对象存在常量池中,而String的引用是可以可变,可以为String引用赋予新的对象字符串。

    6、String与StringBuffer的区别。

    正确答案: A B  

    A、String是不可变的对象,StringBuffer是可以再编辑的

    B、字符串是常量,StringBuffer是变量

    C、String是可变的对象,StringBuffer是不可以再编辑的

    D、以上说法都不正确

    7、StringBuffer类对象创建之后可以再修改和变动.

    正确答案: A  

    A正确

    B错误

  • 相关阅读:
    Spring Cloud Hystrix Dashboard的使用 5.1.3
    Spring Cloud Hystrix 服务容错保护 5.1
    Spring Cloud Ribbon 客户端负载均衡 4.3
    Spring Cloud 如何实现服务间的调用 4.2.3
    hadoop3.1集成yarn ha
    hadoop3.1 hdfs的api使用
    hadoop3.1 ha高可用部署
    hadoop3.1 分布式集群部署
    hadoop3.1伪分布式部署
    KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机
  • 原文地址:https://www.cnblogs.com/mjtabu/p/11864924.html
Copyright © 2011-2022 走看看