一、String
- String是引用类型,创建并初始化以后不能改变字符串内容,但可以改变字符串变量指向不同内存区域的字符串。
- String在效果上相当于是char[ ](字符数组),但是在底层原理上是byte[ ](字节数组)。
String的比较
String由于是引用类型,所以比较两个字符串内容是否相同时,不能直接使用 ==
进行比较,必须使用equals()
函数进行比较。
因为==
比较的地址是否相同,然而String
是引用类型会存在地址不同而字符串内容相同的情况。
注:只有在相同字符串(顺序和大小写全相同)常量赋值的时候,两个字符串使用==
才可能出现true的情况。
String对象的内存原理
public static void main(String[] args) {
char[] chars = {'a','b','c'};
String s1 = new String(chars);
String s2 = new String(chars);
String s3 = "abc";
String s4 = "abc";
System.out.println(s1 == s2 ? "true": "false"); // false
System.out.println(s1 == s3 ? "true": "false"); // false
System.out.println(s3 == s4 ? "true": "false"); // true
}
字符串变量直接赋值字符串,JVM会在常量池中先寻找时候已经存在此字符串常量,要是存在直接引用常量池中字符串地址,不会在创建新的字符串变量;要是不存在,JVM会在常量池中为这个字符串常量开辟空间,之后让被赋值字符串变量引用这个字符串常量地址,也不会为被赋值字符串开辟新的内存空间。总而言之,只有new
操作会在内存中开辟新的空间。
常见API查阅JDK文档
字符串比较:boolean equals(String s)
字符串遍历:char chartAt(int index)
字符串长度:int length()
字符串替换:String replace(char olderChar, char newChar) , String replaceAll(String regex, String replacement)
字符串截取:String subString(int begin,int end(可选))
二、StringBuilder
String字符串拼接的内存原理,说明为什么需要StringBuilder
public static void main(String[] args) {
String s = "hello";
s += "world";
System.out.println(s); // “helloworld”
}
如此看来,每一次拼接出新的字符串都会内存中开辟新的空间,要是这样的操作过于频繁,一定会影响程序的性能。
StringBuilder
的作用就是防止这种情况的出现,如果使用了StringBuilder
,可以调用append()
函数实现字符串拼接,他返回值是对象本身,可以支持链式操作。
因此,在String
类型字符串需要频繁对内容进行改动的时候可以构造StringBuilder
对象,其中StringBuilder
的构造函数就支持直接通过String
对象来创建StringBuilder
对象,在字符串内容操作完成以后通过toString()
方法转换为String
对象。
StringBuilder常用函数参考JDK文档
字符串拼接:StringBuilder append(任意类型)
字符串反转:StringBuilder reverse()
字符串的插入:StringBuilder insert(int offset, 任意类型)
字符串截取删除:StringBuilder delete(int start, int end)
字符串删除指定位置字符:StringBuilder deleteCharAt(int index)