话不多说,直接叙述。
String类型对于初学者来说几乎是天天打交道的,既然这么熟,就得深入了解彼此,做彼此之间最好的,哈哈~
1.String
首先得回顾下String的创建方法:
//第一种
String name = "";
//第二种
String name = new String("");
典型案例:
package com.gaga;
public class Demo{
public static void main(String[] args) {
//第一种方式创建字符串
String name1 = "laowang";
String name2 = "laowang";
//第二种方法创建字符串
String name3 = new String("laowang");
String name4 = new String("laowang");
System.out.println("name1:"+ name1);
System.out.println("name2:" + name2);
System.out.println("name3:" + name3);
System.out.println("name4:" + name4);
//第一种同方法相比
System.out.println(name1 == name2);
//第一种方法与第二种方法相比
System.out.println(name1 == name3);
//第二种同方法相比
System.out.println(name3 == name4);
}
}
运行结果:
String创建字符串后,存储在一个“池”中,创建多个相同的字符串,方法区只会存储一个,不同的创建方法字符串不相等,不能用“==”来判别两个字符串是否相等。所以java给出了equals方法,我画了张图便于理解,如图:
string对象是不可变得,查看JDK文档就会发现,string中的每一个看起来修改字符串的方法,其实都是创建了一个新的string对象。
正是因为string是一个不可变的量,所以才有了以下几个优点:
1、只有当字符串不可变时,所以多线程中使用是安全的
2、只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。
3、如果字符串是可变的话可能会造成很大的安全问题
stringbuilder和stringbuffer主要区别是在于stringbuffer是线程安全的而stringbuilder是线程不安全的,
正是因为这个区别决定了他们不同的使用场景
相较于stringbuffer而言,stringbuilder在速度上优于stringbuffer,所以大多数场景下stringbuilder的使用率更高,但是由于stringbuilder的线程不安全所以stringbuilder更适用于单线程下操作字符串缓冲区下的大量数据
应用场景
string:适用于操作少量数据。
stringbuffer:线程安全 适用于多线程下操作字符串缓冲区下的大量数据
stringbuilder:线程不安全适用于单线程下操作字符串缓冲区下的大量数据。
区别
string :不可变字符串
stringbuffer :可变字符串 线程安全 效率低
stringbuilder: 可变字符串 线程不安全 效率高