广州番禺Python, Java小班周末班培训
第四期线下Java, Python小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析, Java中高级工程师培训。授课详情请点击:http://chipscoco.com/?cate=6
9.1.1 理解字符串
理解字符串,不仅要知道它是什么,还要知道它底层的数据结构。那么,什么是字符串?在Java中使用英文的双引号括住的都是字符串,比如"你好世界"。字符串是一种线性的序列结构。理解这种数据结构,先观察下图所示的线性表:
你 | 好 | 世 | 界 |
上图表示的是字符串"你好世界",从图中可以看出,字符与字符之间在逻辑上构成直线的关系,字符是按序进行排列的,所有的字符空间对应着一块连续的内存,这种结构就叫做线性的顺序存储结构。图中的每一个格子表示一个内存块,内存块里存储了字符的数字编码。
9.1.2 字符串的类型与定义
Java字符串的类型名为String, 同数组一样,也是采用直接定义法和new操作符来定义字符串。直接定义字符串的基本语法:
String string = "string";
小写的string表示字符串的变量名,双引号括住的就是字符串。
代码实例-直接定义字符串
public class HelloJava{ public static void main(String[] args) { // 定义一个名为name的字符串,值为薯条老师 String name = "薯条老师"; } }
使用new操作符定义字符串的基本语法:
String string = new String("string");
代码实例-new一个字符串对象
public class HelloJava{ public static void main(String[] args) { // 构造一个名为name的字符串对象,值为Lohan String name = new String("Lohan"); }
9.1.3 字符的数字编码
在第三章中已经介绍过,计算机只能处理二进制,为了让计算机也能对字符进行处理,需要对字符进行编码。所谓编码,是指用数字来对字符进行表示。不同的表示方法,即对应不同的字符编码。
一旦用数字来表示特定的字符,那么就可以对字符进行处理。当然计算机并不是直接处理字符,而是处理字符所对应的数字编码(数字编码可以转换为二进制)。
9.1.4 常用的字符编码
最早的字符编码为ASCII编码,这种编码使用一个字节来表示一个字符。一个字节能表示的范围是0-255,也就是说,这种编码最多只能表示256个字符。ASCII编码无法表示汉字等其它字符,为了满足其它地区的需要,又出现了多字节编码。
(1) ASCII
ASCII码,全称为美国信息交换标准码,一种使用7个或8个二进制位进行字符编码的方案,最多可以包含256个字符。基本的 ASCII 字符集一共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。下图为ASCII字符的码表:
(2) UNICODE
在UNICODE编码中,为每种语言中的每个字符设定了统一并且唯一的二进制编码, 这个编号范围从 0x000000 到 0x10FFFF,每个字符对应一个唯一的UNICODE数字码,UNICODE编码的形式为:在数字码(十六进制)前面加上U+。例如:"爱"的UNICODE是U+7231。
(3) UTF-8
UTF-8,是一种针对UNICODE的可变长度字符编码, 不同于UNICODE编码采用固定长度的字节数来表示字符, UTF-8使用的字节数是可变的,比如ASCII字符,在UTF-8编码中仍使用一个字节来进行编码,对于汉字等字符使用的是3个字节来进行编码。
(4) GBK
GBK编码是汉字编码字符集,采用的是单双字节变长编码,英文字符使用单字节编码,完全兼容ASCII码,中文部分采用双字节编码。
9.1.5 字符串的编码与解码
通过字符串对象的getBytes方法,可以获取字符串以特定编码方式编码后的字节码。
下表为getBytes方法的使用说明:
方法名 | 描述 |
String.getBytes(String charsetName) | 参数charsetName用来传递编码类型,方法的返回值为一个byte数组。 |
代码实例-获取字符串的UTF-8编码
public class HelloJava{ public static void main(String[] args) { // 构造一个名为name的字符串对象,值为Lohan String name = new String("Lohan"); // 获取name字符串的UTF-8编码,StandarCharsets是Java内置的标准字符集类 byte [] bytes = name.getBytes(StandardCharsets.UTF_8); System.out.println(bytes); } }
有编码自然就有解码,解码是将字节码再转换成Java字符串。在使用new操作符来构造字符串对象时,可传递一个字节码,并指定编码类型来解码:
String string = new String(byte bytes[], String charsetName);
代码实例-将字节码转换为字符串
public class HelloJava{ public static void main(String[] args) { // 构造一个名为name的字符串对象,值为Lohan String name = new String("Lohan"); // 获取name字符串的UTF-8编码,StandarCharsets是Java内置的标准字符集类 byte [] bytes = name.getBytes(StandardCharsets.UTF_8); // 将bytes转换为字符串,指定的字符编码类型为UTF-8 name = new String(bytes, StandardCharsets.UTF_8); System.out.println(name); } }
读者需注意的是,在对bytes类型进行解码时,编码方式必须兼容,否则会出现乱码。在工作中使用较多的字符编码主要是ascii, utf-8,gbk等编码。utf-8,gbk均向下兼容ascii,但ascii却不能向上兼容utf-8,gbk。此外,utf-8与gbk也互不兼容。
9.1.6 转义字符
编程语言中的转义字符是反斜杠符号'\'+字符构成的特殊字符,通常使用转义字符来表示字符集中定义的字符,如ASCll字符集里面的换行符。下表是常用的转义字符:
转义字符 | 意义 | ASCII码值(十进制) |
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符''\' | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\? | 代表一个问号 | 063 |
\0 | 空字符 | 000 |
使用转义字符可以避免产生歧义,比如通过转义字符\"来表示一个包含引号的字符串:
"\""
如果没有转义字符,那么系统无法识别用户究竟定义的是一个包含引号的字符串,还是一个三引号。使用转义字符还可以定义字符串的输出格式,比如定义多行字符串。
代码实例-定义多行字符串
public class HelloJava{ public static void main(String[] args) { // 在字符串中加上换行符,输出时会自动换行 String content = "书山有路勤为径\n学海无涯苦作舟"; System.out.println(content); } }
执行以上程序时,在IDEA中会按以下格式进行输出:
书山有路勤为径
学海无涯苦作舟
读者在练习时,还可以加上其它的转义字符来进行测试。