基础——String和StringBuilder

一、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)

猜你喜欢

转载自blog.csdn.net/weixin_38708854/article/details/106438420