字符 与 字符串Characters and Strings

概览

字符

什么是

一个文字

字面量

用单引号括起来

1 2 3
char number = '9';char letter = 'Z';char ideographic = '赵';
注意

有且只能有一个字符,不能多,不能少

1!2!
char empty = '';char zzax = 'ZZAX';

字符串

什么是

一堆字符

字符数组

字面量

双引号括起来

1 2
String brand = "ZZAX";String letter = "Z";
空字符串

数组可以没有元素

字符串也可以没有字符

1
String empty = "";

字符Characters

字符实质

一本字典

每页有一个字

存储页数

标准

ASCII 表

远古小字典

Unicode 表

地球大字典

运算

char 可以视为 int 进行数学计算

尺寸 比 int

1 2
char c1 = 'A';char c2 = (char)(c1 + 32);

运算时的类型问题

charchar 运算的结果 是 int

1 2
char c1 = 'A';char c2 = (char)(c1 + 'a' - 'A');

类型决定打印效果

1 2 <3 4 <
char c1 = 'A';Console.println(c1);A int pageNumber = c1;Console.println(pageNumber);65

特殊字符Special Characters

单双引号问题

问题

'" 也是字符,如何在字符和字符串里表达这两个字符

1 2!3 4!
char c1 = '"';char c2 = ''';String s1 = "'";String s2 = """;

'' 内无法表达 ' 因为 会被视为 字符结束

"" 内无法表达 " 因为 会被视为 字符串结束

解决方案
1 2
char c = '\'';String s = "\"";

转义字符Escape Character

\
作用

能解除 右侧字符的语法意义

能转移 右侧字符的本身意义

\ + 语法意义的" -> 没有语法意义的"
\ + 语法意义的' -> 没有语法意义的'
\ + 用于转义的\ -> 没有转义功能的\

换行符

\ + n -> 换行符
效果

换行

案例
1 < < <
Console.println("a\nb");ab

制表符

\ + t -> 制表符
效果

补充空格 到 4的倍数的列数

4 这个数 可以被改成别的,取决于编辑器

案例
1 2 3 4 < < < < <
Console.println("a\tb");Console.println("aa\tbb");Console.println("aaa\tbbb");Console.println("aaaa\tbbb");a baa bbaaa bbbaaaa bbbb

制表符与空格

敲代码时,按 tab

有些 编辑器,敲进去的是 空格

有些 编辑器,敲进去的是 制表符

肉眼是无法区分的

案例
1 2 < < <
Console.println("a\tb");Console.println("a b");a ba b

字符 常用函数Characters API

boolean isLetter(char c)

返回 c 是不是一个字母

1 2 =
char c = 'a';boolean test = Characters.isLetter(c);true

boolean isLowerCase(char c)

返回 c 是不是一个小写字母

1 2 =
char c = 'a';boolean test = Characters.isLowerCase(c);true

boolean isUpperCase(char c)

返回 c 是不是一个大写字母

1 2 =
char c = 'a';boolean test = Characters.isUpperCase(c);false

char toLowerCase(char c)

返回 c 对应的小写字母

1 2 =
char c = 'a';c = Characters.toLowerCase(c);'a'

char toUpperCase(char c)

返回 c 对应的大写字母

1 2 =
char c = 'a';c = Characters.toUpperCase(c);'A'

boolean isDigit(char c)

返回 c 是不是一个数字

1 2 =
char c = 'a';boolean test = Characters.isDigit(c);false

内容意义上的 char 转 int

方法 1
1 2 =
char c = '1';int v = c - '0';1
方法 2
1 2 =
char c = '1';int v = Characters.getNumericValue(c);1

字符串 常用函数String API

int length()

返回字符串的长度, 也就是检查这个字符串里有几个字符

1 2 =
String str = "ZZAX";int length = str.length();4

char charAt(int index)

获取在 index 位置上的字符

1 2 =
String str = "ZZAX";char c = str.charAt(0);'Z'

挑战

大小写格式化

输入一个单词,把它变成大写开头的命名格式

> <
chAR Char

int indexOf(int ch)

返回 ch 作为字符 第一次出现的位置索引值

如果没有,会返回 -1

1 2 =
String str = "ZZAX";int index = str.indexOf('A');2

int indexOf(String s)

返回 s 第一次出现的位置索引值

如果没有,会返回 -1

1 2 =
String str = "ZZAX";int index = str.indexOf("A");2

String substring(int startIndex)

返回从 startIndex 开始到结尾的字符串

1 2 =
String str = "ZZAX";String subStr = str.substring(2);"AX"

String substring(int startIndex, int endIndex)

返回 从 startIndexendIndex 区间内的字符串

不包含 endIndex

1 2 =
String str = "ZZAX";String subStr = str.substring(2, 3);"A"

挑战

表情解析

微信的聊天记录中有一段文字,文字中可能有一段表情,

请你把表情的内容扣出来,如果没有,则显示没有

案例
> <
呵呵呵,[捂脸]捂脸

int indexOf(int ch, int fromIndex)

从 fromIndex 的位置,从左往右开始找,返回 ch 作为字符 第一次出现的位置

1 2 =
String str = "ZZAX";int index = str.indexOf('Z', 1);1

int indexOf(String s, int fromIndex)

从 fromIndex 的位置,从左往右开始找,返回 s 第一次出现的位置

1 2 =
String str = "ZZAX";int index = str.indexOf("Z", 1);1

int lastIndexOf(int ch)

从右往左找,ch 作为字符,第一次出现的位置

1 2 =
String str = "ZZAX";int index = str.lastIndexOf('Z');1

int lastIndexOf(String s)

从右往左找,s 第一次出现的位置

1 2 =
String str = "ZZAX";int index = str.lastIndexOf("Z");1

挑战

字符串解析

用户输入一行 java 代码,解析里面是否有 字符串字面量,

如果有,则把字符串的内容扣出来

案例
> <
String str = "ZZAX"ZZAX

String trim()

返回一个新的字符串,内容是原始字符串消掉两边多余的空格

1 2 =
String str = " hi ha ";String trimmedStr = str.trim();"hi ha"

字符串 转 int

1 2 =
String str = "9917";int value = Integer.parseInt(str);9917

int 转 字符串

1 2 3 =
int value = 9917;String str1 = Integer.toString(value);String str2 = value + "";"9917"

挑战

坐标

一个消息里有个坐标信息,格式为

"x, y"

根据坐标信息,把里面的值扣出比一比,x 和 y 哪个更长

案例
> <
1, 2x < y

字符串比较

错误
1 2 3 4 5
String str1 = "abc";String str2 = "abc";if (str1 == str2) { System.out.println("same");}
正确
1 2 3 4 5
String str1 = "abc";String str2 = "abc";if (str1.equals(str2)) { System.out.println("same");}

字符串 拼接与构建String Concatenation

字符串拼接

+ 运算符 可以将 字符串 和 其它内容 拼接

1 2 3 4
int x = 3;int y = 4;String location = "(" + x + ", " + y + ")";Console.println(location);
注意优先级

+ 运算符 还有数值计算的意义, 结合时从左往右结合

如果结合时, 左右两边有一个是字符串, 就是字符串拼接效果

如果结合时, 左右两边都是数值, 就是数值加法效果

1 <2 <3 <4 <
Console.println("ZZAX" + 1 + 1);ZZAX11Console.println(1 + 1 + "ZZAX");2ZZAXConsole.println("ZZAX" + 'a' + 'a');ZZAXaaConsole.println('a' + 'a' + "ZZAX");aaZZAX

字符串构建

注意:字符串不支持修改,没有任何办法,可以修改一个字符串。

如果我们需要修改字符串,我们只能重建一个字符串

案例

写一个函数,将 字符串 改为 大写开头的字符串

1 2 3 4 5 6 7 8 9 10 11 12 13 14
public void run() { String word = "aRc"; Console.println(format(word));} public String format(String original) { String formatted = ""; for(int i = 0; i < original.length; i++) { char c = original.charAt(i); c = i == 0 ? Character.toUpperCase(c) : Character.toLowerCase(c); formatted += c; } return formatted;}

字符串 格式化显示Formatting Print Output

使用 format 拼接

制造一个模板,然后完形填空

1 2 3 4 <
int x = 3;int y = 4;String location = String.format("(%d, %d)", x, y);Console.println(location);(3, 4)
填空

%d 表明缺失一个整数

%f 表明缺失一个小数

%s 表明缺失一个字符串

%% 是 一个 %

Format 高级控制

基本款
1 2 3 <
int a = 9917String str = String.format("%d,", a);Console.println(str);9917
固定长度左对齐
1 2 3 <
int a = 9917String str = String.format("%-10d,", a);Console.println(str);9917 ,
固定长度右对齐
1 2 3 <
int a = 9917String str = String.format("%10d,", a);Console.println(str); 9917,
固定长度右对齐,左侧补0
1 2 3 <
int a = 9917String str = String.format("%010d,", a);Console.println(str);0000009917,
控制小数点
1 2 3 <
double d = 99.17String str = String.format("%.1f,", d);Console.println(str);99.2,

ZZAX 微信公众

文档一更新,立刻告诉你