Java学习08:字符和字符串

杀马特。学长 韩版系。学妹 提交于 2020-01-13 22:12:26

在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"zxy"这中间的双引号必定会引起报错,于是有了转义字符反斜杠\

String s = "abc\"xyz"; // 包含7个字符: a, b, c, ", x, y, z

因为\是转义字符,所以两个反斜杠\表示一个字符\

String s = "abc\\xyz"; // 包含7个字符: a, b, c, \, x, y, z

常见的转义字符有:
在这里插入图片描述
例如:

String s = "ABC\n\u4e2d\u6587"; // 包含6个字符: A, B, C, 换行符, 中, 文

字符串连接
Java的编译器对字符串有特殊照顾,可以使用+连接任意字符和其它数据类型,这样极大地方便了字符串的处理。例如:
在FirstDemo中的包com.first.demo中创建Demo05:

package com.first.demo;

public class Demo05{
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "world";
        String s = s1 + " " + s2 + "!";
        System.out.println(s);
    }
}

在这里插入图片描述
如果使用+连接字符串和其他数据类型,会将其它数据类型先自动转化成字符串,再连接:

package com.first.demo;

public class Demo05{
    public static void main(String[] args) {
        int age = 25;
        String s = "age is " + age;
        System.out.println(s);
        System.out.println(s);
    }
}

在这里插入图片描述

多行字符串
如果我们要表示多行字符串,使用+号会不方便:

String s = "first line \n"
         + "second line \n"
         + "end";

从Java13开始,可以使用""" …"""来表示多行字符串。例如:

package com.first.demo;

public class Demo05{
    public static void main(String[] args) {
       String s = """
                   SELECT * FROM
                     users
                   WHERE id > 100
                   ORDER BY name DESC
                   """;
        System.out.println(s);
    }
}

上述字符串实际上是5行,在最后一个DESC后面还有一个\n。如果我们不想在字符串末尾 加一个\n,那么就要换一种写法:

String s = """ 
           SELECT * FROM
             users
           WHERE id > 100
           ORDER BY name DESC""";

还需要注意到,多行字符串前面共同的空格会被去掉,即

String s = """
...........SELECT * FROM
...........  users
...........WHERE id > 100
...........ORDER BY name DESC
...........""";

用.标注的空格都会被去掉。

如果多行字符串的排版不规则,那么,去掉的空格就会变成这样:

String s = """
.........  SELECT * FROM
.........    users
.........WHERE id > 100
.........  ORDER BY name DESC
.........  """;

即总是以最短的行首空格为基准。
不可变特性
Java的字符串除了是一个引用类型外,还有个重要特点,就是字符串不可变。考察以下代码:

public class Demo05{
    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 Demo05{
    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。

练习
请将一组int值视为字符的Unicode编码,然后将它们拼成一个字符串:

public class Main {
    public static void main(String[] args) {
        // 请将下面一组int值视为字符的Unicode码,把它们拼成一个字符串:
        int a = 72;
        int b = 105;
        int c = 65281;
        // FIXME:
        String s = a + b + c;
        System.out.println(s);

    }
}

小结:
Java的字符类型char是基本类型,字符串类型String是引用类型;

基本类型的变量是“持有”某个数值,引用类型的变量是“指向”某个对象;

引用类型的变量可以是空值null;

要区分空值null和空字符串""。

谢谢观看

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!