JAVA 字符串
ASCII码
每个常用字符都对应一个-128 ~ 127的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符。
常用ASCII值:'A'- 'Z'
是65 ~ 90
,'a' - 'z'
是97 - 122,0 - 9
是 48 - 57
。
字符可以参与运算,运算时会将其当做整数:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int a = 'B' - 'A';
int b = 'A' * 'B';
char c = 'A' + 2;
System.out.println(a); //1
System.out.println(b); //65*66=4290
System.out.println(c); //C
}
}
String类
初始化:(常见的)
String a = "Hello World";
String b = "My name is ";
String x = b; // 存储到了相同地址(x和b都指向了相同的String对象)
String c = b + "yxc"; // String可以通过加号拼接
String d = "My age is " + 18; // int会被隐式转化成字符串"18"
System.out.println(d.concat("18")); // 字符串连接
(不常见的)
String str = String.format("My age is %d", 18); // 格式化字符串,类似于C++中的sprintf
String money_str = "123.45";
double money = Double.parseDouble(money_str); // String转double
String m_s = "123";
int m = Integer.parseInt(m_s) //String转int,Double,Integer分别为双精度浮点数和整数对象
String 为只读变量,不能修改,(C++可修改)例如:
String a = "Hello ";
a += "World"; // 会构造一个新的字符串,和原来的不在同一地址
访问String中的字符:(不能像C++一样直接访问下标)
charAt (int index) 方法用于返回指定索引处(index)的字符。索引范围为从 0 到 length() - 1。
String str = "Hello World";
for (int i = 0; i < str.length(); i ++ ) {
System.out.print(str.charAt(i)); // 只能读取,不能写入
}
常用API:(所有改变字符串的API都不会改变原串的值,而是返回一个新串)
-
length()
:返回长度,注意此处要加小括号,区分于数组求长度,数组求长度的length
不加小括号 -
trim()
:去掉首尾的空白字符(空格,回车,制表符等) -
split(String regex):
分割字符串 -
indexOf(char c,int fromIndex)
、indexOf(String str,int fromIndex)
、lastIndexOf(char c,int fromIndex)
、lastIndexOf(String str,int fromIndex)
:以fromIndex
为始查找字符或字符串出现的位置,找不到返回-1(
indexOf
返回从fromIndex
往后找字符或字符串第一次出现的位置,lastIndexOf
返回从0往后以fromIndex
为止字符或字符串最后一次出现的位置) -
equals()
:判断两个字符串是否相等,注意不能直接用==(等号比较的是两String对象的地址是否相同) -
compareTo()
:按字典顺序比较两个字符串,判断两个字符串的字典序大小,负数表示小于,0表示相等,正数表示大于,输出的正负数代表两字符串按照字典序出现第一个可比较的字符的差值 -
startsWith()
:判断是否以某个前缀开头 -
endsWith()
:判断是否以某个后缀结尾 -
toLowerCase()
:全部用小写字符 -
toUpperCase()
:全部用大写字符 -
replace(char oldChar, char newChar)
:替换字符,返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 -
replace(String oldRegex, String newRegex)
:替换字符串(可用replace
函数进行删除,将待删除的替换为空) -
substring(int beginIndex, int endIndex)
:返回[beginIndex, endIndex)
中的子串,省略第二参数时返回到末尾的结果(C++第一个参数为beginIndex,第二个下标为length) -
toCharArray()
:将字符串转化成字符数组(遍历字符串比较麻烦,转换成字符数组容易遍历)
StringBuilder、StringBuffer(可修改字符)
String
不能被修改,如果打算修改字符串,可以使用StringBuilder
和StringBuffer
。
StringBuffer
线程安全(一般多线程编程时使用),速度较慢;StringBuilder
线程不安全(算法题常用),速度较快。
StringBuilder sb = new StringBuilder("Hello "); // 初始化
sb.append("World"); // 拼接字符串
System.out.println(sb);
for (int i = 0; i < sb.length(); i ++ ) {
sb.setCharAt(i, (char)(sb.charAt(i) + 1)); // 读取和写入字符
}
System.out.println(sb);
常用API:
append()
:将指定字符串追加到此字符序列(类似python数组追加)reverse()
:翻转字符串delete(int start,int end)
: 移除此序列的子字符串中的字符。insert(int offset,obj x)
:将整数或字符或字符串x插入到offset处。replace(int start,int end,String str)
:使用给定String
中的字符替换此序列的子字符串中的字符。(注意这个replace
和String
的replace
用法不同)setCharAt(int index, char ch)
:将给定索引处的字符设置为ch
。StringBuilder
和StringBuffer
的比较(==)需要先转换为String类(toString()
)以后才能比较toString()
可将StringBuilder
和StringBuffer
转为String