String 的基本操作新建字符串
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:
String s1 = "Runoob"; // String 直接创建
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建

求字符串长度: s.length();
返回指定索引处的 char 值: s.charAt();
将字符串转换为新的字符数组:char[] charArray = s.toCharArray();
返回子串:s.substring(int beginIndex, int endIndex); 或 s.substring(int beginIndex);
数字转字符串:strs = String.valueOf(nums);
字符串转数字
<aside>
💡 Integer.parseInt(String s) 和 Integer.valueOf() 的区别:
两者遇到特殊字符都会抛异常,valueOf() 本质上调用 parseInt(),但是返回的是 Integer
</aside>
比较字符串一定要使用 a.equals(b);
TODO:墨墨记忆卡
去除首尾空格:s.trim()
分割字符串:String[] strs = s.trim().split(" "); // 删除首尾空格,分割字符串
<aside> ⚠️ 注意:分割的结果存在空字符串(也就是如果存在两个相邻空格,会分割出来一个空字符串)
</aside>
<aside> 🔥 验证 IP 地址使用分割字符串遇到的坑:
public static void *main*(*String*[] *args*) {
*String* s = ":2001:0db8:85a3:0:0:8A2E:0370::7334:";
System.out.println(Arrays.toString(s.split(":")));
}
// 输出结果:
// [, 2001, 0db8, 85a3, 0, 0, 8A2E, 0370, , 7334]
冒号放开头,length + 1;冒号放结尾,length 值不变,有时候测试用例会故意在结尾放个冒号
</aside>
StringBuilder 的基本操作新建一个空的 StringBuilder:StringBuilder res = new StringBuilder("");
转为 String:res.toString()
翻转字符:res.reverse();
添加字符到末尾:res.append("int or else");
代码示例:
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder res = new StringBuilder("");
int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
while(i >= 0 || j >= 0){
int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
int tmp = n1 + n2 + carry;
carry = tmp / 10;
res.append(tmp % 10);
i--; j--;
}
if(carry == 1) res.append(1);
return res.reverse().toString();
}
}
LinkedList 是解决这类问题的首选,因为栈和队列(也包括双端队列)都可以用 LinkedList 实现