zoukankan      html  css  js  c++  java
  • java面试-String、StringBuffer和StringBuilder的区别

    一、String的创建机制

    由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。 

    运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;

                     如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。

                     但是,通过new方法创建的String对象是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。

    String str1 = "123"; //通过直接量赋值方式,放入字符串常量池
    String str2 = new String(“123”);//通过new方式赋值方式,不放入字符串常量池

    二、String特性:

    1、不可变:当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅度提高系统性能。

                   不可变模式是一个可以提高多线程程序的性能,降低多线程程序复杂度的设计模式

    2、常量池的优化:当两个String对象拥有相同的值时,他们只引用常量池中的同一个拷贝。当同一个字符串反复出现时,这个技术可以大幅度节省内存空间

    三、String、StringBuffer和StringBuilder的区别

    1、String是内容不可变的,而StringBuffer和StringBuilder都是内容可变的。

    2、StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高。

    三、StringBuffer的方法

    1.添加:append(),insert()

    2.删除:deletecharAt(),delete()

    3.替换:replace()

    4.反转:reverse()

    5.截取:subString()(返回值类型String)

    四、.StringBuffer和String的相互转换

    String->StringBuffer

        //方式1:通过构造方法
        String s = "hello";
        StringBuffer sb = new StringBuffer(s);
       //方式2:通过append方法
        String s2 = "hello";
        StringBuffer sb2 = new StringBuffer();
        sb2.append(s);
    

    StringBuffer->String  

       //方式1:通过构造方法
        StringBuffer buffer = new StringBuffer("hello");
        String str = new  String(buffer);
        //方式2:通过toString()方法
        String str2 = buffer.toString();  

    五、String和StringBuffer作为形参传递(要特别注意)

    String做为形参传递,效果和基本数据类型一致。

    public class StringTest {
        public static void main(String[] args) {
            String s1 = "hello";
            String s2 = "world";
            System.out.println(s1+"===="+s2);//hello====world
            change(s1,s2);
            System.out.println(s1+"===="+s2);//hello====world
    
    
            StringBuffer sb1 = new StringBuffer("hello");
            StringBuffer sb2 = new StringBuffer("world");
            System.out.println(sb1+"======"+sb2);//hello====world
            change(sb1,sb2);
            System.out.println(sb1+"======"+sb2);//hello======worldworld
    
        }
    
        public static void change(StringBuffer sb1, StringBuffer sb2) {
            sb1 = sb2;
            sb2.append(sb1);
        }
    
        public static void change(String s1, String s2) {
            s1 = s2;
            s2 = s1 + s2;
        }
    }
    

      



  • 相关阅读:
    PMM Client 安装异常报错
    安装Docker时错误提示 "could not change group /var/run/docker.sock to docker: group docker not found"的解决方案
    简单概括下MongoDB 4.0 新特性
    MySQL 关于性能的参数配置梳理
    MySQL数据库在IO性能优化方面的设置选择(硬件)
    MongoDB 集合间关联查询后通过$filter进行筛选
    MySQL 基础知识梳理学习(七)----sync_binlog
    第八章 (一)分治 练习题
    第八章 (一)分治
    Logistic回归
  • 原文地址:https://www.cnblogs.com/wjh123/p/6066775.html
Copyright © 2011-2022 走看看