在Java中,字符和字符串是两个不同的类型。
1. 字符
字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符:
char c1 = 'A';
char c2 = '中';
Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可:
int a = 'a'; // 字母“a”的Unicodde编码是97
int b = '张'; // 汉字“张”的Unicode编码是24352
还可以直接用转义字符\u+Unicode编码来表示一个字符:
// 注意是十六进制:
char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4e2d'; // '中',因为十六进制4e2d = 十进制20013
2. 字符串
和char类型不同,字符串类型String是引用类型,我们用双引号"..."
表示字符串。一个字符串可以存储0个到任意个字符。
源码中显示,String是以一个个字符的方式存储在final修饰的字符数组中。
String类型创建对象有两种方式:
-- ①通过"..."
赋值:会先去常量池中查找是否存在相同的字符串,若存在,栈中引用直接指定该字符串;若不存在,在常量池中进行缓存,再将栈中引用指向它。
-- ②通过new关键字:每次new出来的都是一个新的对象,在堆中开辟空间进行存储。
jdk1.8移除了永久代,字符串常量池应该也在堆中
String s = ""; // 空字符串,包含0个字符
String s1 = "A"; // 包含一个字符
String s2 = "ABC"; // 包含3个字符
String s3 = "中文 ABC"; // 包含6个字符,其中有一个空格
- 2.1 不可变特性
String是引用类型,如上,s1
只是一个引用,即它代表了一个指向。当s1改变时,只说明引用的指向改变了,原来的字符串还在常量池或堆中。public class Main { public static void main(String[] args) { String s = "hello"; System.out.println(s); // 显示 hello s = "world"; System.out.println(s); // 显示 world } }
public class Main { public static void main(String[] args) { String s = "hello"; String t = s; s = "world"; System.out.println(t); // hello } }
- 2.2 空值null
引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。例如:
注意要区分空值String s1 = null; // s1是null String s2; // 没有赋初值值,s2也是null String s3 = s1; // s3也是null String s4 = ""; // s4指向空字符串,不是null
null
和空字符串""
,空字符串是一个有效的字符串对象,它不等于null
。 - 2.3 字符串连接
Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。例如:
如果用+连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串,再连接:public class Main { public static void main(String[] args) { String s1 = "Hello"; String s2 = "world"; String s = s1 + " " + s2 + "!"; System.out.println(s); } }
public class Main { public static void main(String[] args) { int age = 25; String s = "age is " + age; System.out.println(s); // age is 25 } }
- 2.4 多行字符串
如果我们要表示多行字符串,使用+号连接会非常不方便:
从Java 13开始,字符串可以用String s = "first line \n" + "second line \n" + "end";
"""..."""
表示多行字符串(Text Blocks)了。举个例子:
注意:上述多行字符串实际上是5行,因在最后一个DESC后面还会有一个\n。如果我们不想在字符串末尾加一个\n,就需要这么写:public class Main { public static void main(String[] args) { String s = """ SELECT * FROM users WHERE id > 100 ORDER BY name DESC """; System.out.println(s); } }
String s = """ SELECT * FROM users WHERE id > 100 ORDER BY name DESC""";
3. 转义字符
因为字符串使用双引号"..."
表示开始和结束,那如果字符串本身恰好包含一个"
字符怎么表示?例如,"abc"xyz"
,编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束。这个时候,我们需要借助转义字符\
:
String s = "abc\"xyz"; // 包含7个字符: a, b, c, ", x, y, z
因为\是转义字符,所以,两个\表示一个\字符:
String s = "abc\\xyz"; // 包含7个字符: a, b, c, \, x, y, z
常见的转义字符包括:
-
\"
表示字符"
-
\'
表示字符'
-
\\
表示字符\
-
\n
表示换行符 -
\r
表示回车符 -
\t
表示Tab -
\u####
表示一个Unicode编码的字符
例如:
String s = "ABC\n\u4e2d\u6587"; // 包含6个字符: A, B, C, 换行符, 中, 文
- Java的字符类型char是基本类型,字符串类型String是引用类型;
- 基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;
- 引用类型的变量可以是空值null;
- 要区分空值null和空字符串""。
网友评论