Java的字符和字符串

字符类型

字符类型 char 是基本数据类型,它是 character 的缩写。一个 char 保存一个 Unicode 字符:

char c1 = 'A';
char c2 = '中';

Java在内存中总是使用 Unicode 表示字符,所以,一个英文字符和一个中文字符都用一个 char 类型表示,它们都占用两个字节。要显示一个字符的 Unicode 编码,只需将 char 类型直接赋值给 int 类型即可:

int n1 = 'A'; 		// 字母“A”的 Unicodde 编码是65
int n2 = '中'; 		// 汉字“中”的 Unicode 编码是20013

还可以直接用转义字符 \u+Unicode 编码来表示一个字符:

// 注意是十六进制:
char c3 = '\u0041'; 	// 'A',为十六进制0041 = 十进制65
char c4 = '\u4e2d'; 	// '中',为十六进制4e2d = 十进制20013

字符串类型

和char类型不同,字符串类型 String引用类型,我们用双引号 “…” 表示字符串。一个字符串可以存储0个到任意个字符:

String s = ""; 			// 空字符串,包含0个字符
String s1 = "A"; 		// 包含一个字符
String s2 = "ABC"; 		// 包含3个字符
String s3 = "中文 ABC"; // 包含6个字符,其中有一个空格

因为字符串使用双引号 “…” 表示开始和结束,那如果字符串本身恰好包含一个 " 字符怎么表示?例如,“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的编译器对字符串做了特殊照顾,可以使用 + 连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。例如:

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);
    }
}

Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。考察以下代码:

public class Main {
    public static void main(String[] args) {
        String s = "hello";
        System.out.println(s); // 显示 hello
        s = "world";
        System.out.println(s); // 显示 world
    }
}

观察执行结果,难道字符串 s 变了吗?其实变的不是字符串,而是变量 s“指向”

执行 String s = “hello”; 时,JVM虚拟机先创建字符串 “hello” ,然后,把字符串变量 s 指向它:
在这里插入图片描述
紧接着,执行 s = “world”; 时,JVM虚拟机先创建字符串 “world” ,然后,把字符串变量 s 指向它:
在这里插入图片描述
原来的字符串 “hello” 还在,只是我们无法通过变量 s 访问它而已。因此,字符串的不可变是指字符串内容不可变。

理解了引用类型的 “指向” 后,试解释下面的代码输出:

public class Main {
    public static void main(String[] args) {
        String s = "hello";
        String t = s;
        s = "world";
        System.out.println(t); 	// t是"hello"还是"world"?
    }
}

空值null

引用类型的变量可以指向一个空值 null,它表示不存在,即该变量不指向任何对象。例如:

String s1 = null; 		// s1是null
String s2; 				// 没有赋初值值,s2也是null
String s3 = s1; 		// s3也是null
String s4 = ""; 		// s4指向空字符串,不是null

注意要区分空值 null 和空字符串 “”,空字符串是一个有效的字符串对象,它不等于 null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值