StringBuilder和StringBuffer

StringBuilder的介绍

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。 这两个类大 部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其它需要用到了大家可参阅 StringBuilder在线文档

public static void main(String[] args) {
    StringBuilder sb1 = new StringBuilder("hello");
    StringBuilder sb2 = sb1;
    // 追加:即尾插-->字符、字符串、整形数字
    sb1.append(' '); // hello
    sb1.append("world"); // hello world
    sb1.append(123); // hello world123
    System.out.println(sb1); // hello world123
    System.out.println(sb1 == sb2); // true
    System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
    System.out.println(sb1.length()); // 获取字符串的有效长度14
    System.out.println(sb1.capacity()); // 获取底层数组的总大小
    sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
    sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
    System.out.println(sb1);
    System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
    System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
    sb1.deleteCharAt(0); // 删除首字符
    sb1.delete(0,5); // 删除[0, 5)范围内的字符
 
    String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
    System.out.println(str);
    sb1.reverse(); // 字符串逆转
    str = sb1.toString(); // 将StringBuffer以String的方式返回
    System.out.println(str);
}

从上述例子可以看出:String和StringBuilder最大的区别在于String的内容无法修改, 而StringBuilder的内容可 以修改。频繁修改字符串的情况考虑使用StringBuilder。

注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

String变为StringBuilder: 利用StringBuilder的构造方法或append()方法

StringBuilder变为String: 调用toString()方法.

面试题:

1. String、StringBuffer、StringBuilder的区别

String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.

StringBuffer与StringBuilder大部分功能是相似的

StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
  1. 以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】
    String str = new String("ab"); // 会创建多少个对象
    String str = new String("a") + new String("b"); // 会创建多少个对象
    

    String类oj

    1. 第一个只出现一次的字符

    class Solution {
     public int firstUniqChar(String s) {
         int[] count = new int[256];
         // 统计每个字符出现的次数
         for(int i = 0; i < s.length(); ++i){
             count[s.charAt(i)]++;
         }
     
         // 找第一个只出现一次的字符
         for(int i = 0; i < s.length(); ++i){
             if(1 == count[s.charAt(i)]){
                 return i;
             }
         }
     
         return -1;
     }
    }
    

    2. 最后一个单词的长度 ```java import java.util.Scanner;

public class Main{ public static void main(String[] args){ // 循环输入 Scanner sc = new Scanner(System.in); while(sc.hasNext()){ // 获取一行单词 String s = sc.nextLine();

// 1. 找到最后一个空格
// 2. 获取最后一个单词:从最后一个空格+1位置开始,一直截取到末尾
// 3. 打印最后一个单词长度
int len = s.substring(s.lastIndexOf(' ')+1, s.length()).length();
System.out.println(len);
}
sc.close();
} } ``` ## 3. 检测字符串是否为回文
class Solution {
    public static boolean isValidChar(char ch){
        if((ch >= 'a' && ch <= 'z') ||
            (ch >= '0' && ch <= '9')){
            return true;
        }
 
        return false;
    }
 
    public boolean isPalindrome(String s) {
        // 将大小写统一起来
        s = s.toLowerCase();
        int left = 0, right = s.length()-1;
        while(left < right){
        // 1. 从左侧找到一个有效的字符
        while(left < right && !isValidChar(s.charAt(left))){
            left++;
        }
        // 2. 从右侧找一个有效的字符
        while(left < right && !isValidChar(s.charAt(right))){
            right--;
        }
        if(s.charAt(left) != s.charAt(right)){
            return false;
        }else{
            left++;
            right--;
        }
    }
    return true;
    }
}