走进大数据丨 String、StringBuffer和StringBuilder详解

String操作详解 

StringBuilder>StringBuffer>String  why? 

String:字符串常量 

StringBuffer:字符串变量 

StringBuilder:字符串变量 

从名字分析来看,String是一个常量,也就是它产生之后就不能被改变,那么等等看看下面的代码

 String s = "hello";s+="world";System.out.println(s);//结果为:"helloworld"

 我们不是说String是字符串常量吗?那为什么?它又改变值了呢?下面我们看一下内存图

 

走进大数据丨 String、StringBuffer和StringBuilder详解_第1张图片

  首先我们要明确一下:字符串的直接赋值的方式是先到字符串常量池当中去找,如果没有就创建并返回,如果有就直接返回;字符串的另一个特性就是一旦被赋值就不能被改变; 

先说一下上面代码的执行过程:a:在栈内存当中执行String s = "hello"的代码,首先我们要判断"hello"这个字符串是否存在字符串常量池。 

b:如果"hello"不在字符串常量池当中,那么就创造一个,然后把"hello"的地址给s,赋值给s; 

c:当执行s+="world";时,由于字符串常量的特点,所以给"world"从新开一个空间。 

d:然后在从新开一个空间把两个串拼接在一起,把地址给s赋值给s; 注意:我们说的字符串一旦创建就不能被改变,不是说的s不能被改变,而是说的"hello"字符串不能被改变 

从上面执行过程发现:每当用String进行操作的时候会创建好几个对象,所以这特别耗时和浪费空间,而StringBufferStringBuilder就不一样了,他们是字符串变量,是可以改变,所以在进行操作的时候是不用在内存当中新开辟一个空间的,直接调用append()方法在原先的空间后面添加就可以。

StringStringBufferStringBuilder的区别?

String 是内容不可变的,而其他两者内容是可以改变的;

StringBuffer是同步的,数据安全,效率低;

StringBuilder是不同步的,数据不安全,效率高。(以上说的是多线程)

StringBuffer和数组的区别? 

二者都可以看做是一个装数据的容器,但是呢,StringBuffer是一个字符串数据,而数组可以是任何类型的数据,但是必须是同一类型。

形式参数问题

String作为形式参数传递,把String当成一个基本数据类型;

StringBuffer作为形式参数

基本类型:形式参数的改变不影响实际参数。

引用类型:形式参数的改变直接影响实际参数。

注意:String作为形式参数和基本类型一样,因为它在内存中的位置不一样,所以是一个特殊的类

你可能感兴趣的:(走进大数据丨 String、StringBuffer和StringBuilder详解)