在Java中,字符和字符串是两个不同的类型。
字符类型
Java在内存是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。
赋值
char是基本数据类型,保存一个Unicode字符
- 字符赋值
char s1 = 'A';
char s2 = '你';
- Unicode编码赋值
转义字符\u+Unicode编码来表示一个字符
// 注意是十六进制:
char c3 = '\u0041'; // 'A',因为十六进制0041 = 十进制65
char c4 = '\u4f60'; // '你',因为十六进制4f60 = 十进制20320
char类型赋值必须要有一个,char s1 = 'AB';和char s1 = '';都会编译错误
获取Unicode
int s3 = 'A';//65 十六进制0041 = 十进制65
int s4 = '你';//20320 十六进制4f60 = 十进制20320
字符串类型
字符串类型String是引用类型,我们用双引号""表示字符串,一个字符串可以存储0个到任意个字符
赋值
String s = ""; // 空字符串,包含0个字符
String s1 = "A"; // 包含一个字符
String s2 = "Hello World"; // 包含11个字符,其中有一个空格
String s3 = "你好 ABC"; // 包含6个字符,其中有一个空格
String s = "ABC\n\u4e2d\u6587"; // 包含6个字符: A, B, C, 换行符, 中, 文
需要注意转义字符,转义字符只计算转义后的字符
常见的转义字符包括:
\"表示字符"
\'表示字符'
\\表示字符\
\n表示换行符
\r表示回车符
\t表示Tab
\u####表示一个Unicode编码的字符
字符串连接
使用+连接任意字符串和其他数据类型
String s1 = "Hello";
String s2 = "World";
System.out.println(s1 + " " + s2);//Hello World
String s3 = "年龄:";
String s4 = "18";
System.out.println(s3 + s4);//年龄:18
如果用+连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串,再连接
多行字符串
- java13以前
String s = "first line \n"
+ "second line \n"
+ "end";
- java13
使用"""...."""
String s5 = """
first line
second line
end""";
多行字符串前面共同长度的空格会被去掉
不可变特性
Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。
String s1 = "hello";
System.out.println(s1);//hello
s1 = "你好";
System.out.println(s1);//你好
String s1 = "hello";时,JVM虚拟机先创建字符串"hello",然后,把字符串变量s1指向它:
s
│
▼
┌───┬───────────┬───┐
│ │ "hello" │ │
└───┴───────────┴───┘
紧接着,执行s1 = "你好";时,JVM虚拟机先创建字符串"你好",然后,把字符串变量s1指向它:
s ──────────────┐
│
▼
┌───┬───────────┬───┬───────────┬───┐
│ │ "hello" │ │ "world" │ │
└───┴───────────┴───┴───────────┴───┘
原来的字符串"hello"还在,只是我们无法通过变量s访问它而已。因此,字符串的不可变是指字符串内容不可变。
空值null
引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。
String s1 = null; // s1是null
String s2 = s1; // s2也是null
String s3 = ""; // s3指向空字符串,不是null







网友评论