Java之字符和字符串
字符类型
字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符:
1 2 | char c1= 'A' ; char c2= '中' ; |
因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char
类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char
类型直接赋值给int
类型即可:
1 2 | int n1 = 'A' ; // 字母“A”的Unicodde编码是65 int n2 = '中' ; // 汉字“中”的Unicode编码是20013 |
还可以直接用转义字符\u+Unicode编码来表示一个字符:
1 2 3 | // 注意是十六进制: char c3 = '\u0041' ; // 'A',因为十六进制0041 = 十进制65 char c4 = '\u4e2d' ; // '中',因为十六进制4e2d = 十进制20013 |
字符串类型
和char
类型不同,字符串类型String
是引用类型,我们用双引号"..."
表示字符串。一个字符串可以存储0个到任意个字符:
1 2 3 4 | String s = "" ; // 空字符串,包含0个字符 String s1 = "A" ; // 包含一个字符 String s2 = "ABC" ; // 包含3个字符 String s3 = "中文 ABC" ; // 包含6个字符,其中有一个空格 |
因为字符串使用双引号"..."
表示开始和结束,那如果字符串本身恰好包含一个"
字符怎么表示?例如,"abc"xyz"
,编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束。这个时候,我们需要借助转义字符\
:
1 | String s = "abc\"xyz" ; // 包含7个字符: a, b, c, ", x, y, z |
因为\
是转义字符,所以,两个\\
表示一个\
字符:
1 | String s = "abc\\xyz" ; // 包含7个字符: a, b, c, \, x, y, z |
常见的转义字符包括:
\"
表示字符"
\'
表示字符'
\\
表示字符\
\n
表示换行符\r
表示回车符\t
表示Tab\u####
表示一个Unicode编码的字符
例如
1 | String s = "ABC\n\u4e2d\u6587" ; // 包含6个字符: A, B, C, 换行符, 中, 文 |
字符串连接
Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。例如:
1 2 3 4 5 6 7 8 | public class Main { public static void main(String[] args) { String s1= "Hello" ; String s2= "world" ; String s=s1+ " " +s2+ "!" ; System.out.println(s); } } |
多行字符串
如果我们要表示多行字符串,使用+号连接会非常不方便:
1 2 3 | String s = "first line \n" + "second line \n" + "end" ; |
从Java 13开始,字符串可以用"""..."""
表示多行字符串(Text Blocks)了。举个例子:
不可变特性
Java的字符串处理是一个引用类型外,还有个重要特点,就是字符串不可变
1 2 3 4 5 6 7 8 | public class Main { public static void main(String[] args) { String s = "hello" ; System.out.println(s); // 显示 hello s = "world" ; System.out.println(s); // 显示 world } } |
运行结果
1 2 | hello world |
观察执行结果,难道字符串s
变了吗?其实变的不是字符串,而是变量s
的“指向”。
执行String s = "hello";
时,JVM虚拟机先创建字符串"hello"
,然后,把字符串变量s
指向它:
紧接着,执行s = "world";
时,JVM虚拟机先创建字符串"world"
,然后,把字符串变量s
指向它:
原来的字符串"hello"
还在,只是我们无法通过变量s
访问它而已。因此,字符串的不可变是指字符串内容不可变。
空值null
引用类型的变量可以指向一个空值null
,它表示不存在,即该变量不指向任何对象。例如:
1 2 3 4 | String s1 = null ; // s1是null String s2; // 没有赋初值值,s2也是null String s3 = s1; // s3也是null String s4 = "" ; // s4指向空字符串,不是null |
注意要区分空值null
和空字符串""
,空字符串是一个有效的字符串对象,它不等于null
。
练习
请将一组int值视为字符的Unicode编码,然后将它们拼成一个字符串:
1 2 3 4 5 6 7 8 9 | public class Main { public static void main(String[] args) { int a= 72 ; int b= 105 ; int c= 65281 ; String s= "" +( char )a+( char )b+( char )c; System.out.println(s); } } |
运行结果
1 | Hi! |
说明:为什么第一个是“”,有了第一个空的string,后面的 + 就是字符串的连接了操作符了,而不再是 char/int 的数值相加了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!