Head First Java 和 AcWing Java课程做的总结4。
计算机中只有0/1,会有字符是因为将特定的0/1序列转换为字符。
4.1 ASCII
码
每个常用字符都对应一个-128 ~ 127
的数字,二者之间可以相互转化。注意:目前负数没有与之对应的字符。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
char c = 'a';
System.out.println((int)c);
int a = 66;
System.out.println((char)a);
}
}
比较重要的要记得是:
字符 —— ASCII
0 —— 48
A —— 65
a —— 97
常用ASCII值:'A'- 'Z'是65 ~ 90,'a' - 'z'是97 - 122,0 - 9是 48 - 57。
可以去网上找ASCII表,很常见。
字符可以参与运算,运算时会将其当做整数:
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);
System.out.println(b);
System.out.println(c);
}
}
4.2 String
类
初始化:
String a = "Hello World";
String b = "My name is";
String x = b; // 存储到了相同地址
String c = b + "yxc"; // String可以通过加号拼接
String d = "My age is " + 18; // int会被隐式转化成字符串"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
//Integer.praseInt()
int money = 123;
String money_str = "" + 123;
//或者
Integer money = 123;
String money_str = money.toString(0)
只读变量,不能修改,例如:
(如果用 + ,则会生成一个新的字符串对象,与之前的字符串对象不同)
String a = "Hello ";
a += "World"; // 会构造一个新的字符串
//与原来的Hello不在同一个地方
访问 String 中的字符:
String str = "Hello World";
for (int i = 0; i < str.length(); i ++ ) {
System.out.print(str.charAt(i)); // 只能读取,不能写入
}
常用API
:
length()
:返回长度split(String regex)
:分割字符串indexOf(char c)
、indexOf(String str)
、lastIndexOf(char c)
、lastIndexOf(String str)
:查找,找不到返回-1equals()
:判断两个字符串是否相等,注意不能直接用==compareTo()
:判断两个字符串的字典序大小,负数表示小于,0表示相等,正数表示大于startsWith()
:判断是否以某个前缀开头endsWith()
:判断是否以某个后缀结尾trim()
:去掉首尾的空白字符toLowerCase()
:全部用小写字符toUpperCase()
:全部用大写字符replace(char oldChar, char newChar)
:替换字符replace(String oldRegex, String newRegex)
:替换字符串substring(int beginIndex, int endIndex)
:返回[beginIndex, endIndex)中的子串toCharArray()
:将字符串转化成字符数组
//上述API都不改变原串的值
4.3 输入与输出
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next(); // 输入字符串,遇到空格、回车等空白字符时停止输入
String str2 = sc.nextLine(); // 输入一整行字符串,遇到空格不会停止输入,遇到回车才会停止
System.out.println(str1); // 可以直接输出
System.out.printf("%s\n", str2); // 也可以格式化输出,用 %s 表示字符串
}
}
4.4 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 :
reverse()
:翻转字符串toString()
:转换成Stringappend(String str)
:添加字符串
StringBuilder
和 String
相互转换
-
StringBuilder
转换为String
:public String toString(): 通过toString() 就可以实现把StringBuilder 转换为String -
String
转换为StringBuilder
:public StringBuilder(String s):通过构造方法就可以实现把String转换为StringBuilder -
//StringBuilder -> String StringBuilder sb1 = new StringBuilder(); sb1.append("hello"); String s = sb1.toString(); System.out.println(s); //String -> StringBuilder String ss = "hello"; StringBuilder sb2 = new StringBuilder(s); System.out.println(sb2);