一 String
在 java 中,String 不是一个基本数据类型,而是一个对象,且是一个不可变的对象(被 final 修饰),这也就是说每一个对 String 的操作都是重新创建了一个 String 。
二 String 的初始化
在未对 String 进行初始化时,String 的默认值为 null,String 对象可以通过下列几种方式进行初始化:
- String str;
创建了引用,但未赋值。也就是说在堆栈中已经存在了该对象的引用,但是在堆中还没有分配地址 - String str = "" 和 String str = new String();
创建了引用且进行赋值。这两种方式,在堆栈中创建了对象的引用,且在堆中也进行了内存的分配
三 String 的存储
String 存储在字符串常量池中。当我们要创建一个新的 String 对象时,先会在字符串常量池中进行查找,是否有相等的字符串,如果有那么会直接返回常量池中的字符串的引用。如果没有,那么会在常量池中先创建一个字符串,然后返回该字符串的引用。
当我们对某个字符串进行操作时,我们不需要考虑是否会对其它引用相同字符串的对象造成影响,因为每一个对字符串的操作都会重新创建。
public static void main(String[] args) {
String str = "aaa"; //第一次创建会在常量池中创建 ”aaa“ 字符串
String str1 = "aaa";//第二次创建会先在常量池中查找,并返回该字符串的引用
System.out.println(str == str1);// == 是判断二者的引用是否相等
}
/** output
true
**/
四 StringBuffer 和 StringBuilder
StringBuffer 和 StringBuilder 都是一个可变长的字符串对象,也就是说每次对该字符串对象进行操作时,不会新创建新的字符串对象。
StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder,在 AbstractStringBuilder 中使用了 char[] 数组来保存字符串,当 char[] 数组满后,会自动追加容量(原来容量的2倍)
StringBuffer 和 StringBuilder 的区别:
- StringBuffer :效率比 StringBuilder 低,因为 StringBuffer 是线程安全的,StringBuffer 中大部分的方法都被 synchronized 修饰,
- StringBuilder : 效率比 StringBuffer 高,但是线程不安全,在单线程中使用
五 使用场景
-
String:在字符串不经常变化的场景中可以使用String类,如:常量的声明、少量的变量运算等。
-
StringBuffer:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装等。
-
StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用StringBuffer,如SQL语句的拼装、JSON封装等(貌似这两个我也是使用|StringBuffer)
网友评论