《数组和字符串》PPT课件.ppt

上传人:鲁** 文档编号:571192828 上传时间:2024-08-09 格式:PPT 页数:51 大小:479.86KB
返回 下载 相关 举报
《数组和字符串》PPT课件.ppt_第1页
第1页 / 共51页
《数组和字符串》PPT课件.ppt_第2页
第2页 / 共51页
《数组和字符串》PPT课件.ppt_第3页
第3页 / 共51页
《数组和字符串》PPT课件.ppt_第4页
第4页 / 共51页
《数组和字符串》PPT课件.ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《《数组和字符串》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数组和字符串》PPT课件.ppt(51页珍藏版)》请在金锄头文库上搜索。

1、第10章 数组和字符串n n本章要点:数组的初始化数组的初始化数组的拷贝数组的拷贝命令行参数命令行参数StringString类类StringBufferStringBuffer类类使用使用StringTokenizerStringTokenizer类分析字符串类分析字符串CharacterCharacter类类字符串与字符、字节数组字符串与字符、字节数组10.1 数组数组n n10.1.1 数组的声明在在JavaJava中声明一个数组是很简单的。要想声明一个数组,中声明一个数组是很简单的。要想声明一个数组,要先声明数组的类型,再声明数组变量的名字。例如:下面的要先声明数组的类型,再声明数组变

2、量的名字。例如:下面的形式声明了一个整数数组形式声明了一个整数数组a a:int a;int a; 或或int a;int a;这两种形式都是可以接受的,请读者根据个人的爱好选择,这两种形式都是可以接受的,请读者根据个人的爱好选择,但习惯上倾向于采用第一种形式。再如:根据我们设计的学生但习惯上倾向于采用第一种形式。再如:根据我们设计的学生类,想声明一个学生类的数组,则可以采用如下格式:类,想声明一个学生类的数组,则可以采用如下格式:Student aStudent;Student aStudent; 或或Student aStudent;Student aStudent;在这里我们强调两件事情

3、:在这里我们强调两件事情:(1 1)我们声明整数数组)我们声明整数数组a a的类型是的类型是intint型,指的是整数数组型,指的是整数数组a a中的每中的每一个元素都是一个元素都是intint型的,不能再出现其他的类型。如果声明为型的,不能再出现其他的类型。如果声明为StringString类型的,则数组内的每一个元素都是类型的,则数组内的每一个元素都是StringString类型的。类型的。(2 2)声明一个数组如同声明其他任何类型的变量一样,也必须指)声明一个数组如同声明其他任何类型的变量一样,也必须指明数组的类型。数组的类型也就是数组内每一个元素的类型。明数组的类型。数组的类型也就是数

4、组内每一个元素的类型。n n10.1.2 数组的初始化要想初始化一个数组,有隐式和显式初始化两种要想初始化一个数组,有隐式和显式初始化两种方式。方式。1. 1. 隐式初始化隐式初始化用户可以像实例化一个对象一样采用关键字用户可以像实例化一个对象一样采用关键字newnew来实现。如初始化整数数组来实现。如初始化整数数组a a:int a = new int100;int a = new int100; 或或int a= new int100;int a= new int100;再如初始化学生类数组再如初始化学生类数组Student aStudent= new Student50;Student

5、aStudent= new Student50; 或或Student aStudent = new Student50;Student aStudent = new Student50;这两种形式分别初始化整数数组这两种形式分别初始化整数数组a a的容量为的容量为100100,学生数组,学生数组aStudentaStudent的容量为的容量为5050,也就是说,在数,也就是说,在数组内最大的元素个数分别是组内最大的元素个数分别是100100和和5050,也只能容纳,也只能容纳100100和和5050个元素。个元素。2. 2. 显式初始化显式初始化所谓显式初始化,也就是在声明一个数组的时候,直接

6、进所谓显式初始化,也就是在声明一个数组的时候,直接进行数组的赋值。如声明一个具有行数组的赋值。如声明一个具有5 5个元素的整数数组个元素的整数数组b b:int b = 1, 2, 3, 4, 5;int b = 1, 2, 3, 4, 5;注意:在这种初始化方式中,我们没有使用关键字注意:在这种初始化方式中,我们没有使用关键字newnew,也没有指定数组元素的个数。但这样做是可行的,系统会也没有指定数组元素的个数。但这样做是可行的,系统会自动计算数组元素的个数,创建一个固定容量的数组。自动计算数组元素的个数,创建一个固定容量的数组。有时我们需要得到数组容量的大小,这时有一个特殊有时我们需要得

7、到数组容量的大小,这时有一个特殊的方法,例如,我们要得到整数数组的方法,例如,我们要得到整数数组b b的容量,可以采用的容量,可以采用如下的格式:如下的格式:b.length;/b.length;/注意这并不是方法的调用,注意这并不是方法的调用,lengthlength的后面没的后面没有括号。有括号。要知道学生类数组的大小,可以采用如下的格式:要知道学生类数组的大小,可以采用如下的格式:aStudent.length;aStudent.length; 通过这种方式得到的数值是一个整型的数值,我们可通过这种方式得到的数值是一个整型的数值,我们可以声明一个整数型变量来接收这个数值,如:以声明一个整

8、数型变量来接收这个数值,如:int studentNumber = aStudent.length;int studentNumber = aStudent.length;n n10.1.3 匿名数组在数组中,有一种称为匿名数组的形式。顾名思义,在数组中,有一种称为匿名数组的形式。顾名思义,也就是没有名字的数组,换句话说,就是声明一个数组但也就是没有名字的数组,换句话说,就是声明一个数组但并没有与一个数组变量关联起来。如:并没有与一个数组变量关联起来。如:new int10, 20,30,40,50;new int10, 20,30,40,50;根据以前我们的讲述,操纵对象都是通过对象句柄来根

9、据以前我们的讲述,操纵对象都是通过对象句柄来操纵的,那么声明一个匿名数组有什么作用呢?声明一个操纵的,那么声明一个匿名数组有什么作用呢?声明一个匿名数组的目的是将一个新的匿名数组赋值与一个已经存匿名数组的目的是将一个新的匿名数组赋值与一个已经存在的数组变量,而不用再重新生成一个新的数组变量,但在的数组变量,而不用再重新生成一个新的数组变量,但已经存在的数组变量的类型一定要与匿名数组的类型一致。已经存在的数组变量的类型一定要与匿名数组的类型一致。如:如:int array = 1, 2, 3;int array = 1, 2, 3;array = new int10, 20,30,40,50;a

10、rray = new int10, 20,30,40,50;这是完全可以的,我们可以不必考虑原来数组的大小,这是完全可以的,我们可以不必考虑原来数组的大小,而重新生成一个新的数组,让已经存在的数组变量重新指而重新生成一个新的数组,让已经存在的数组变量重新指向一个新的数组对象,系统会自动计算新的数组对象的长向一个新的数组对象,系统会自动计算新的数组对象的长度(容量)。下面我们用一个很简单的程序来测试一下。度(容量)。下面我们用一个很简单的程序来测试一下。例例10-210-2程序清单程序清单 ArrayTest.javaArrayTest.java/*/* * *通过这个程序,我们要测试两个方面:

11、通过这个程序,我们要测试两个方面: * * 1. 1. 匿名数组可以赋值与一个已经存在的数组变量,不关心原来数组变量的容量匿名数组可以赋值与一个已经存在的数组变量,不关心原来数组变量的容量 * * 2. 2. 数组变量的类型必须要与匿名数组的类型一致数组变量的类型必须要与匿名数组的类型一致 * */ /public class ArrayTestpublic class ArrayTest public static void main(String args) public static void main(String args) ArrayTest aTest = new ArrayTe

12、st();ArrayTest aTest = new ArrayTest();int a = 1, 2, 3;/int a = 1, 2, 3;/声明一个新的数组,并赋值与一个新的数组变量声明一个新的数组,并赋值与一个新的数组变量aTest.print(a);aTest.print(a);a = new int 10, 20, 30, 40, 50;/a = new int 10, 20, 30, 40, 50;/将整型匿名数组赋值与存在的数组变量将整型匿名数组赋值与存在的数组变量a a/a = new String a, b;/a = new String a, b;/将字符型匿名数组赋值与

13、存在的数组变量将字符型匿名数组赋值与存在的数组变量a aaTest.print(a);aTest.print(a); public void print(int array) public void print(int array) System.out.println( System.out.println( 数组变量的长度是数组变量的长度是 + array.length); + array.length);System.out.println( System.out.println( 数组中的每个元素是:数组中的每个元素是: ););for (int i = 0; i array.leng

14、th; i+)for (int i = 0; i array.length; i+) System.out.print( + arrayi);/System.out.print( + arrayi);/打印出数组中的每一个元素打印出数组中的每一个元素 System.out.println(n*);System.out.println(n*); n n10.1.4 数组的拷贝由于数组本身属于对象类型,它在Java公开库中有一个类与之相对应Arrays类。当数组变量传递给另外一个数组变量时,它们传递的是对象句柄,也就是按址传递。例如:int a = 1, 2, 3, 4, 5;int b = a;

15、如果我们访问a4,它是指向5的,如果访问b4,它同样也是指向5的。例例10-310-3程序清单程序清单 ArrayPointer.javaArrayPointer.java/*/* * * 测试数组元素传递方式测试数组元素传递方式 * */ /public class ArrayPointerpublic class ArrayPointer public static void main(String args)public static void main(String args) ArrayPointer aPointer = new ArrayPointer();ArrayPointe

16、r aPointer = new ArrayPointer();int a = 1, 2, 3, 4, 5;int a = 1, 2, 3, 4, 5;System.out.println(System.out.println(打印数组打印数组a a中的元素。中的元素。););aPointer.print(a);aPointer.print(a);int b = a;int b = a;System.out.println(nSystem.out.println(n改变数组改变数组b b中的第三个元素的值。中的第三个元素的值。n );n );System.out.println(System.

17、out.println(打印数组打印数组b b中的元素。中的元素。););b2 = a2 + 10;b2 = a2 + 10;aPointer.print(b);aPointer.print(b);System.out.println(System.out.println(再打印数组再打印数组a a中的元素。中的元素。););aPointer.print(a);aPointer.print(a); public void print(int array)public void print(int array) for (int i = 0; i array.length; i+)for (in

18、t i = 0; i array.length; i+) System.out.print( + arrayi);/System.out.print( + arrayi);/打印出数组中的每一个元素打印出数组中的每一个元素 System.out.println(n*);System.out.println(n*); 例例10-410-4程序清单程序清单 ArrayCopy.javaArrayCopy.java/*/* * * 测试数组元素拷贝测试数组元素拷贝* */ /public class ArrayCopypublic class ArrayCopy public static void

19、 main(String args)public static void main(String args) ArrayCopy aCopy = new ArrayCopy();ArrayCopy aCopy = new ArrayCopy();int a = 1, 2, 3, 4, 5;int a = 1, 2, 3, 4, 5;int b = 10,20,30,40,50;int b = 10,20,30,40,50;aCopy.copy(a, b);aCopy.copy(a, b); public void copy(int from, int to)public void copy(i

20、nt from, int to) System.out.println(System.out.println(第一个数组中的元素第一个数组中的元素););for (int i = 0; i from.length; i+)for (int i = 0; i from.length; i+) System.out.print( + fromi);/System.out.print( + fromi);/打印出数组中的打印出数组中的每一个元素每一个元素 System.out.println(n);System.out.println(n);System.out.println(System.out

21、.println(第二个数组中的元素第二个数组中的元素););for (int i = 0; i to.length; i+)for (int i = 0; i to.length; i+) System.out.print( + toi);/System.out.print( + toi);/打印出数组打印出数组中的每一个元素中的每一个元素 System.out.println(nnSystem.out.println(nn将第一个数组拷贝到第二将第一个数组拷贝到第二个数组个数组n);n);System.arraycopy(from, 0, to, 0, 5);System.arraycop

22、y(from, 0, to, 0, 5);System.out.println(System.out.println(拷贝完成后第二个数组中的元拷贝完成后第二个数组中的元素素););for (int i = 0; i to.length; i+)for (int i = 0; i to.length; i+) System.out.print( + toi);/System.out.print( + toi);/打印出数组打印出数组中的每一个元素中的每一个元素 10.1.5 10.1.5 命令行参数命令行参数例例10-510-5程序清单程序清单 CommandInput.javaCommand

23、Input.java/*/* * *命令行参数的输入,从命令行输入的任何参数,对于命令行参数的输入,从命令行输入的任何参数,对于JavaJava来讲都是用字符串处理的。来讲都是用字符串处理的。 * */ /public class CommandInputpublic class CommandInput public static void main(String args)public static void main(String args) if(args.length = 0)if(args.length = 0) System.out.println(System.out.prin

24、tln(用户没有输出参数,程序退出!用户没有输出参数,程序退出!);); elseelse System.out.println(System.out.println(用户一共输入了用户一共输入了 + args.length + + args.length +个参数个参数););if(args0.equals(h)if(args0.equals(h)System.out.print(System.out.print(用户好用户好););if(args0.equals(g)if(args0.equals(g)System.out.print(System.out.print(再见再见););fo

25、r(int i = 1; i args.length; i+)for(int i = 1; i args.length; i+) System.out.print( + argsi);System.out.print( + argsi); n n10.1.6 10.1.6 数组排序数组排序例例10-610-6程序清单程序清单 ArraySort.javaArraySort.java/*/* * *数组排序及随机数的产生数组排序及随机数的产生 * */ /import java.util.Arrays;import java.util.Arrays;import javax.swing.*;im

26、port javax.swing.*;public class ArraySortpublic class ArraySort public static void main(String args) public static void main(String args) String strIn = JOptionPane.showInputDialog(String strIn = JOptionPane.showInputDialog(请输入一共多少个彩球:请输入一共多少个彩球:););String strOut = JOptionPane.showInputDialog(String

27、 strOut = JOptionPane.showInputDialog(请输入需抽取多少个彩球:请输入需抽取多少个彩球:););int in = Integer.parseInt(strIn);int in = Integer.parseInt(strIn);int total = new intin;/int total = new intin;/生成彩球总数数组生成彩球总数数组for(int i = 0; i in; i+)for(int i = 0; i in; i+) totali = i + 1;totali = i + 1; int out = new intInteger.p

28、arseInt(strOut);int out = new intInteger.parseInt(strOut);for(int i = 0; i out.length; i+)for(int i = 0; i out.length; i+) int r = (int)(Math.random() * in);/int r = (int)(Math.random() * in);/产生随机元素序列号产生随机元素序列号outi = totalr;outi = totalr;totalr = totalin - 1;/totalr = totalin - 1;/将最后一个元素移到当前位置,把将最

29、后一个元素移到当前位置,把取出的删除取出的删除in-;in-; Arrays.sort(out);Arrays.sort(out);System.out.println(System.out.println(抽取的数字排序后是:抽取的数字排序后是:););for(int i = 0; i out.length; i+)for(int i = 0; i out.length; i+) System.out.print( + outi);System.out.print( + outi); System.exit(0);System.exit(0); 10.2 文本处理类文本处理类文本的处理在程序

30、中是不可缺少的一部分,如何有效地在程序中进行文本的处理,对于程序的效能起到很大的影响作用。在Java中处理文本主要应用的类是String类与StringBuffer类。如果处理小型的文本,使用String类确实很方便,也足够用了,但对于大型的文本来说,如果使用String类却是非常消耗系统资源的,这时就可以用StringBuffer来实现了。n n10.2.1 String类提到字符串,我们并不陌生,在前面的示例中已经多次用到,用户可以再返回去看一下,那么什么是字符串呢?字符串就是一系列字符的序列,例如“用户好”、“this is”等。在Java中字符串是用一对双引号()括起来的字符序列。在其

31、他的语言中,字符串可能是作为一个基本类型来处理的,但在Java中,字符串是一个对象,在Java公开库中有一个专门用来处理字符串的类,叫做String类。1. String1. String类分析类分析打开打开StringString类的类的APIAPI,在关于类的说明部分我们就看,在关于类的说明部分我们就看到第一句话:到第一句话:public final class Stringpublic final class String在前面我们对关键字在前面我们对关键字finalfinal已经做过了说明,它是将已经做过了说明,它是将一个部件声明为不变的。在这里是将一个部件声明为不变的。在这里是将St

32、ringString类声明为不类声明为不变的。也就是说,变的。也就是说,StringString对象是常量字符串,一旦被初对象是常量字符串,一旦被初始化或赋值,它的值和所分配的内存内容就不可再改变。始化或赋值,它的值和所分配的内存内容就不可再改变。如果硬要改变它的值,它会产生一个新值的字符串。例如果硬要改变它的值,它会产生一个新值的字符串。例如:如:String str1 = Java;String str1 = Java;str1 = str1 + good;str1 = str1 + good;看起来像是一个简单的字符串重新赋值,实际上在看起来像是一个简单的字符串重新赋值,实际上在程序的解

33、释的过程中却不是这样的。程序的解释的过程中却不是这样的。程序会首先产生程序会首先产生str1str1的一个字符串对象在内存中申的一个字符串对象在内存中申请了一段空间,由于发现又需要重新赋值,在原来的空请了一段空间,由于发现又需要重新赋值,在原来的空间已经不可能再追加新的内容,系统不得不将这个对象间已经不可能再追加新的内容,系统不得不将这个对象放弃,再重新生成第二个新的对象放弃,再重新生成第二个新的对象str1str1并重新申请一个并重新申请一个新的内存空间。虽然句柄是同一个,但对象已经不再是新的内存空间。虽然句柄是同一个,但对象已经不再是同一个了。同一个了。2. 2. 字符串的声明及实例化字符

34、串的声明及实例化如果想声明一个字符串,是一件很简单的事情,如果想声明一个字符串,是一件很简单的事情,只要声明类型再加上一个变量名(对象句柄)就只要声明类型再加上一个变量名(对象句柄)就可以了,如:可以了,如:String str String str 若想得到字符串的实例,有很多途径。查看在若想得到字符串的实例,有很多途径。查看在StringString类类APIAPI中,包括中,包括9 9个可用的个可用的StringString构造器,这构造器,这种现象称为重载,也就是说字符串的实例可以通种现象称为重载,也就是说字符串的实例可以通过这过这9 9种构造器得到。例如:种构造器得到。例如:Stri

35、ng str = new String(String str = new String(欢迎用户,欢迎用户,good);good);对于对于StringString类来讲,它还有一个更简单的方法,类来讲,它还有一个更简单的方法,不需要通过构造方法而得到字符串实例,那就是不需要通过构造方法而得到字符串实例,那就是通过赋值运算符(通过赋值运算符(“ “=”=”)来得到。如:)来得到。如:String str = String str = 欢迎用户,欢迎用户,good;good;(1 1)String( )String( )这是字符串类的默认构造器,它将构造出一个新的字符串这是字符串类的默认构造器,

36、它将构造出一个新的字符串对象,对象是空的。例如:对象,对象是空的。例如:String str = new String();String str = new String();这与这与String str = new String();String str = new String();两种形式是不同的,第二种形式构造的是一个字符串两种形式是不同的,第二种形式构造的是一个字符串对象,它并不是空的,对象的内容是空的,这与第一种形对象,它并不是空的,对象的内容是空的,这与第一种形式有着本质的区别,如果我们用输出语句输出到控制台,式有着本质的区别,如果我们用输出语句输出到控制台,第一种形式输出的是第

37、一种形式输出的是nullnull,而第二种形式却什么都没有输,而第二种形式却什么都没有输出,也就是一个空的内容。这一点请读者务必注意。出,也就是一个空的内容。这一点请读者务必注意。(2 2)String(byte bytes)String(byte bytes)这是根据一个字节数组,生成一个字符串对象。由于这是根据一个字节数组,生成一个字符串对象。由于字节型整数代表不同字符集中特定的编码,所以在不同的字节型整数代表不同字符集中特定的编码,所以在不同的操作系统或不同的字符集中,输出的结果也会不同。例如:操作系统或不同的字符集中,输出的结果也会不同。例如:byte b = 1, 2, 3;byte

38、 b = 1, 2, 3;String str = new String(b);String str = new String(b);(3 3)String(byte bytes, int offset, int length)String(byte bytes, int offset, int length)这是从一个字节数组生成指定长度字符串对象的构造这是从一个字节数组生成指定长度字符串对象的构造器。器。参数:参数:byte bytesbyte bytes,指定的字节数组。,指定的字节数组。 int offsetint offset,开始转码的第一个字节。,开始转码的第一个字节。 int

39、lengthint length,需要转码的总长度。,需要转码的总长度。(4 4)String(byte bytes, int offset, int length, String String(byte bytes, int offset, int length, String charsetName)charsetName)在第二种构造器中,根据不同的字符集,字节数在第二种构造器中,根据不同的字符集,字节数组转码的结果可能会不同,字符串类提供了一个指定组转码的结果可能会不同,字符串类提供了一个指定字符集的构造器,这样,就可以避免因为字符集的不字符集的构造器,这样,就可以避免因为字符集的不同

40、而导致程序运行结果的不同。同而导致程序运行结果的不同。参数:参数:byte bytesbyte bytes,指定的字节数组。,指定的字节数组。 int offsetint offset,开始转码的第一个字节。,开始转码的第一个字节。 int lengthint length,需要转码的总长度。,需要转码的总长度。 String charsetNameString charsetName,指定的字符集名字。,指定的字符集名字。(5 5)String(byte bytes, String charsetName)String(byte bytes, String charsetName)将字节数组

41、按照指定的字符集进行转码。将字节数组按照指定的字符集进行转码。(6 6)String(char value)String(char value)将字符数组按照数组序列连接构建字符串对象。这将字符数组按照数组序列连接构建字符串对象。这个构造器理解起来应该很简单,就是将字符数组中的每个构造器理解起来应该很简单,就是将字符数组中的每一个字符,按照数组序列连接在一起,生成一个新的字一个字符,按照数组序列连接在一起,生成一个新的字符串。例如:符串。例如:char c = a, b, c, d, e;char c = a, b, c, d, e;String str = new String(c);Str

42、ing str = new String(c);(7 7)String(char value, int offset, int count)String(char value, int offset, int count)将指定字符数组中的字符,指定序列开始及指定个将指定字符数组中的字符,指定序列开始及指定个数的字符转变为字符串对象。例如:数的字符转变为字符串对象。例如:char c = a, b, c, d, e;char c = a, b, c, d, e;String str = new String(c, 2, 3);String str = new String(c, 2, 3);参

43、数:参数:char valuechar value,指定的字符数组。,指定的字符数组。 int offsetint offset,开始的第一个字符。,开始的第一个字符。 int countint count,转换的字符数。,转换的字符数。(8 8)String(String original)String(String original)将一个已经存在的字符串对象重新构建,生成一个新将一个已经存在的字符串对象重新构建,生成一个新的字符串,也就是说生成一个原字符串的拷贝。例如:的字符串,也就是说生成一个原字符串的拷贝。例如:String str1 = new String(hello);Stri

44、ng str1 = new String(hello);String str2 = new String(str1);String str2 = new String(str1);请读者考虑上面的这种形式与下面的这种形式有什么请读者考虑上面的这种形式与下面的这种形式有什么区别:区别:String str1 = new String(hello);String str1 = new String(hello);String str2 = str1;String str2 = str1;我们在此稍做提示:对象的赋值按照以前的讲述是传我们在此稍做提示:对象的赋值按照以前的讲述是传递的对象句柄,也就是

45、按址传递的,但对于递的对象句柄,也就是按址传递的,但对于StringString类来讲,类来讲,它是它是finalfinal型的,更改型的,更改StringString类对象的内容,等同于重新生成类对象的内容,等同于重新生成一个新的对象,所以每一个一个新的对象,所以每一个StringString类的对象句柄都是指向类的对象句柄都是指向惟一的一个对象实例。这与平常所说的对象句柄的传递是惟一的一个对象实例。这与平常所说的对象句柄的传递是不同的。所以在上面的第二种形式中,修改不同的。所以在上面的第二种形式中,修改str2str2并不会引并不会引起起str1str1的改变。的改变。(9 9)Strin

46、g(StringBuffer buffer)String(StringBuffer buffer)根据一个根据一个StringBufferStringBuffer对象实例,构建一个对象实例,构建一个StringString类类的对象。这个构造器的作用相当于:的对象。这个构造器的作用相当于:StringBuffer str1 = new StringBuffer(hello);StringBuffer str1 = new StringBuffer(hello);String str2 = str1.toString();String str2 = str1.toString();3. 3. 主

47、要方法主要方法(1 1)串连接)串连接在前面的示例中,我们经常可以看到类似于:在前面的示例中,我们经常可以看到类似于:System.out.print( + outi);System.out.print( + outi);的语句。的语句。JavaJava中允许使用符号中允许使用符号“ “+”+”把两个字符串连接把两个字符串连接起来。例如:起来。例如:String hello = hello;String hello = hello;String world = world;String world = world;String greet = hello + world;String gree

48、t = hello + world;输出后字符串内容变成输出后字符串内容变成helloworldhelloworld通过加号将两个字符串连接生成一个新的字符串。加通过加号将两个字符串连接生成一个新的字符串。加号的连接是无缝的,也就是说新的字符串会原封不动的将号的连接是无缝的,也就是说新的字符串会原封不动的将原来两个字符串连接在一起,如果原来的字符串有空格,原来两个字符串连接在一起,如果原来的字符串有空格,新的字符串会保留原来的空格。新的字符串会保留原来的空格。在在JavaJava类中还有一个用于连接字符串的方法:类中还有一个用于连接字符串的方法:public String concat(Str

49、ing str)public String concat(String str)这个方法是将参数这个方法是将参数strstr指定的字符串连接到当前字符串指定的字符串连接到当前字符串后面。如:后面。如:String str1 = car;String str1 = car;str1.concat(ess);str1.concat(ess);返回新的字符串是:返回新的字符串是:caress;caress;(2 2)提取子串)提取子串假如现在给用户一个字符串,想得到其中的一部分做假如现在给用户一个字符串,想得到其中的一部分做为新的字符串,那如何来实现呢?这也很简单,在为新的字符串,那如何来实现呢?这

50、也很简单,在JavaJava的的字符串类中已经提供了相应的方法:字符串类中已经提供了相应的方法:substring(int substring(int beginIndex, int endIndex) beginIndex, int endIndex) 或或substring(int index)substring(int index)。例例10-710-7程序清单程序清单 SubStringTest.javaSubStringTest.java/*/* * *通过这个程序,展示字符串求取子串的方法通过这个程序,展示字符串求取子串的方法 * */ /public class SubStrin

51、gTestpublic class SubStringTest public static void main(String args)public static void main(String args) String str = I am a programmer.;/String str = I am a programmer.;/定义字符串定义字符串for(int i = 0; i str.length(); i+)for(int i = 0; i str.length(); i+) System.out.println(System.out.println(这是第这是第 + i +

52、 + i + 个子串:个子串: + + str.substring(i);str.substring(i); (3 3)从字符串中分解字符)从字符串中分解字符在上面讲类的分析时,我们可以从一个字符数在上面讲类的分析时,我们可以从一个字符数组构建一个字符串对象,那么从一个字符串对象组构建一个字符串对象,那么从一个字符串对象中求取指定的字符,就要用到求取字符的方法:中求取指定的字符,就要用到求取字符的方法:charAt(int index)charAt(int index)。这个方法能也只能返回一个单一的字符,这与这个方法能也只能返回一个单一的字符,这与上面的求取子串是不一样的。其中,参数上面的求

53、取子串是不一样的。其中,参数indexindex是是一个整数,它是指字符串序列中字符的位置。注一个整数,它是指字符串序列中字符的位置。注意,这个整数是从意,这个整数是从0 0开始的。读者可以根据下面的开始的。读者可以根据下面的代码自己试着写一个测试小程序。代码自己试着写一个测试小程序。String str = welcome to java;String str = welcome to java;for(int i = 0 ; i str.length(); i+)for(int i = 0 ; i str.length(); i+) char c = str.charAt(i);char

54、c = str.charAt(i); (4)获取字符串的长度使用String类中的length()方法可以获取一个字符串的长度,例如:String s=”we are friends”,tom=”我们是朋友”;int n1,n2;n1=s.length();n2=tom.length();那么n1的值是14,n2的值是5。字符串常量也可以使用length()获得长度,如“洪恩软件”,length()的值是4。(5 5)测试字符串是否相等)测试字符串是否相等在我们登录一个网站的时候,经常会需要注册,在我们登录一个网站的时候,经常会需要注册,当再次登录时,输入用户的有关信息,通过验证当再次登录时,

55、输入用户的有关信息,通过验证就可以使用这个网站的服务了。在这个过程中,就可以使用这个网站的服务了。在这个过程中,就会用到测试两个字符串是否相等的问题。当我就会用到测试两个字符串是否相等的问题。当我们输入有关的登录信息时,系统会将有关的信息们输入有关的登录信息时,系统会将有关的信息从数据库中取出来,做一比较,如果相等,就会从数据库中取出来,做一比较,如果相等,就会通过验证。通过验证。使用字符串类中的使用字符串类中的equals(String str)equals(String str)会测试两个会测试两个字符串是否相等,这个方法是返回一个布尔型的字符串是否相等,这个方法是返回一个布尔型的值,如果

56、为值,如果为truetrue则说明两个字符串相等,如果为则说明两个字符串相等,如果为falsefalse说明两个字符串不等。例如:说明两个字符串不等。例如:String str1 = hello;String str1 = hello;String str2 = hello;String str2 = hello;boolean t = str1.equals(str2);/boolean t = str1.equals(str2);/返回值是返回值是truetrue例例10-810-8程序清单程序清单 FindSubstring.javaFindSubstring.java/*/* * *查

57、找特定的子串查找特定的子串 * */ /public class FindSubstringpublic class FindSubstring public static void main(String args)public static void main(String args) String str = welcome the boy.;String str = welcome the boy.;System.out.println(Find the substring boy occurrence: + System.out.println(Find the substring

58、boy occurrence: + str.indexOf(boy);/str.indexOf(boy);/查找子串查找子串System.out.println(Find the substring by occurrence: + System.out.println(Find the substring by occurrence: + str.indexOf(by);/str.indexOf(by);/查找子串查找子串System.out.println(Find the char t occurrence: + System.out.println(Find the char t oc

59、currence: + str.indexOf(t);/str.indexOf(t);/查找特定的字符查找特定的字符System.out.println(Test the string begin with wel.: + System.out.println(Test the string begin with wel.: + str.startsWith(wel);/ str.startsWith(wel);/ 是否以是否以welwel开始开始System.out.println(Test the string end with boy.: + System.out.println(Tes

60、t the string end with boy.: + str.endsWith(boy);/ str.endsWith(boy);/ 是否以是否以boyboy结束结束 (7)大小写转换有时可能需要进行字符串的大小写的转换,Java类提供了关于大小写的转换的两个方法:toLowerCase()与toUpperCase()。toLowerCase()是将当前的字符串转换成小写的,相反toUpperCase()是将当前字符串转换成大写的。例如:String str = HeLlo;str.toLowerCase();/返回hellostr.toUpperCase();/返回HELLO(8)字符

61、串与数值之间的转换Java中的数值变量与字符串变量的转换分为显式转换和隐式转换,隐式转换就是系统在认为需要进行转换的地方自动转换,如:int i = 65;System.out.println(value of i is: + i);屏幕会输出:value of i is 65,此时系统将int类型的i隐式转换为String类型后再与前面的字符串相连。 字符串转换为数值字符串转换为数值 字符串转换为整数字符串转换为整数public static int parseInt(String s, int radix) public static int parseInt(String s, int

62、radix) 其中其中s s是需要转换的字符串,是需要转换的字符串,radixradix是转换后用什么是转换后用什么进制表示,如进制表示,如1010就是十进制,就是十进制,1616就是十六进制。就是十六进制。 字符串转换为浮点数字符串转换为浮点数public static float parseFloat(String s)public static float parseFloat(String s)其中其中s s是需要转换的字符串。是需要转换的字符串。 数值转换为字符串数值转换为字符串public static String valueOf(Object obj)public static

63、 String valueOf(Object obj)其中其中objobj可以是任何类型的数值型变量。可以是任何类型的数值型变量。4. toString4. toString方法方法在读者查阅相关类的文档时,几乎每一个类中都在读者查阅相关类的文档时,几乎每一个类中都有一个有一个toStringtoString方法,这个方法的作用就是将一个类的方法,这个方法的作用就是将一个类的实例,按照指定的方式转变为相应的字符描述。例如:实例,按照指定的方式转变为相应的字符描述。例如:Date date = new Date();Date date = new Date();date.toString();d

64、ate.toString();可以将当前的日期按照系统默认的格式转变成相可以将当前的日期按照系统默认的格式转变成相应的字符描述。应的字符描述。但是当我们进行输出的时候,完全可以直接将对但是当我们进行输出的时候,完全可以直接将对象输出到相应的输出设备,例如:象输出到相应的输出设备,例如:System.out.println(new aDate();System.out.println(new aDate();我们生成的是一个对象的实例,为什么可以直接我们生成的是一个对象的实例,为什么可以直接输出到控制台呢?这是输出到控制台呢?这是JavaJava内含的一种机制,当输出内含的一种机制,当输出一个对

65、象时,解释器会自动调用该类的一个对象时,解释器会自动调用该类的toStirngtoStirng方法,方法,按照指定的格式将对象转变成相应的描述输出到相应按照指定的格式将对象转变成相应的描述输出到相应的位置。的位置。例例10-910-9程序清单程序清单 ToString_Test.javaToString_Test.javaimport java.util.Date;import java.util.Date;import java.awt.*;import java.awt.*;public class ToString_Testpublic class ToString_Test publi

66、c static void main(String args) public static void main(String args) Date date=new Date(); Date date=new Date(); Button button=new Button( Button button=new Button(确定确定);); System.out.println(date.toString(); System.out.println(date.toString(); System.out.println(button.toString(); System.out.printl

67、n(button.toString(); n n10.2.2 StringBuffer类StringString类是一个类是一个finalfinal类,它一旦生成一个对象,类,它一旦生成一个对象,就不可再改变。但对于就不可再改变。但对于StringBufferStringBuffer类却完全不一类却完全不一样。样。StringBufferStringBuffer类同类同StringString类一样位于类一样位于java.langjava.lang基基本包中,因此在使用的时候也不需要导入语句。本包中,因此在使用的时候也不需要导入语句。JavaJava设计它用于创建和操作动态字符串。当创建设计它

68、用于创建和操作动态字符串。当创建一个一个StringBufferStringBuffer对象时,系统为该对象分配的内对象时,系统为该对象分配的内存会自动扩展以容纳新增的文本。存会自动扩展以容纳新增的文本。1. 1. 创建创建StringBufferStringBuffer对象对象有有3 3种方法创建一个新的种方法创建一个新的StringBufferStringBuffer对象。对象。(1 1)默认构造器)默认构造器StringBuffer sb = new StringBuffer();StringBuffer sb = new StringBuffer();使用默认构造器创建了一个不包含任何

69、文本的使用默认构造器创建了一个不包含任何文本的对象。它是由系统自动分配的容量,系统默认的对象。它是由系统自动分配的容量,系统默认的容量是容量是1616个字符。个字符。(2 2)设定容量大小)设定容量大小StringBuffer sb = new StringBuffer(40);StringBuffer sb = new StringBuffer(40);使用这种形式的构造器,可以构建指定容量的字符串对象,如上使用这种形式的构造器,可以构建指定容量的字符串对象,如上的形式构建了一个的形式构建了一个4040个字符容量的字符串对象。个字符容量的字符串对象。(3 3)初始化字符串)初始化字符串Str

70、ingBuffer sb = new StringBuffer();StringBuffer sb = new StringBuffer();使用这种形式的构造器,可以构建一个具有初始化文本的对象,使用这种形式的构造器,可以构建一个具有初始化文本的对象,容量的大小就是字符串的长度。容量的大小就是字符串的长度。一旦创建了一旦创建了StringBufferStringBuffer类的对象,就可以使用类的对象,就可以使用StringBufferStringBuffer类的大类的大量方法和属性。最常用的是量方法和属性。最常用的是appendappend方法,它将文本添加到当前方法,它将文本添加到当前S

71、tringBufferStringBuffer对象内容的结尾。例如:对象内容的结尾。例如:StringBuffer sb=new StringBuffer();StringBuffer sb=new StringBuffer();sb.append(s);sb.append(s);sb.append(u);sb.append(u);sb.append(n);sb.append(n);sb.append(.);sb.append(.);sb.append(c);sb.append(c);sb.append(o);sb.append(o);sb.append(m);sb.append(m);Sys

72、tem.out.println(sb.toString();System.out.println(sb.toString();2. StringBuffer的容量capacity方法返回为对象分配的字符数(内存)。如果超过了构建初期的容量,StringBuffer对象会自动扩展以符合需求。length方法返回对象目前存储的字符数,可以通过setLength方法来增加其长度。另外,对象的容量可以通过ensureCapacity方法来扩展。它建立了对象的最小容量,因此如果超出则不会有任何问题,系统会自动扩充,以满足新增长字符串的需要。例例10-1010-10程序清单程序清单 StringBuffe

73、r_Test.javaStringBuffer_Test.javapublic class StringBuffer_Test public class StringBuffer_Test public static void main(String args) public static void main(String args) StringBuffer sb=new StringBuffer();StringBuffer sb=new StringBuffer();sb.ensureCapacity(40);/sb.ensureCapacity(40);/构建了具有构建了具有4040个

74、字符的初始化个字符的初始化容量容量sb.append( is awesome!);sb.append( is awesome!);System.out.println(sb.toString();System.out.println(sb.toString();sb.setLength(7);/sb.setLength(7);/截取截取7 7个字符个字符System.out.println(sb.toString();System.out.println(sb.toString(); 上面的代码设置了字符串的初始化容量并为其赋值。上面的代码设置了字符串的初始化容量并为其赋值。但接下来的时候,通

75、过但接下来的时候,通过setLengthsetLength方法重新设置了字符串的方法重新设置了字符串的长度,因此文本被截断了。长度,因此文本被截断了。3. 3. 操作字符串操作字符串JavaJava还提供了更多的方法来处理存储在还提供了更多的方法来处理存储在StringBufferStringBuffer对对象内的字符串。以下列举了几个例子:象内的字符串。以下列举了几个例子:charAt()charAt():返回字符串中的单个字符。:返回字符串中的单个字符。setCharAt()setCharAt():为字符串中的单个字符赋值或进行替换。:为字符串中的单个字符赋值或进行替换。insert()i

76、nsert():在字符串指定位置插入值。它有多个重载版本以:在字符串指定位置插入值。它有多个重载版本以容纳各种数据类型。容纳各种数据类型。substring()substring():返回字符串的一个子串。:返回字符串的一个子串。reverse()reverse():倒置:倒置StringBufferStringBuffer的内容。的内容。以上所有的方法对于操作字符来说都是很有用的,其实以上所有的方法对于操作字符来说都是很有用的,其实reversereverse方法最实用,它能轻松地倒置一个字符串。例如:方法最实用,它能轻松地倒置一个字符串。例如:StringBuffer sb=new Str

77、ingBuffer();StringBuffer sb=new StringBuffer();sb.ensureCapacity(100);sb.ensureCapacity(100);sb.append(!);sb.append(!);System.out.println(sb.toString();System.out.println(sb.toString();sb.reverse();sb.reverse();System.out.println(sb.toString();System.out.println(sb.toString();4. StringBuffer的优势字符串的使

78、用贯穿于绝大多数应用程序,不管是作为用户界面的标识或在后台处理从数据库取回的值。通常,这些值并不符合要求,需要做进一步的处理。用户可以使用String类,但是它并不是设计成用来处理动态值的。而StringBuffer类正好填补了这个需求并使得系统资源的利用更加有效。10.3 使用使用StringTokenizer类分析字类分析字符串符串当我们分析一个字符串并将字符串分解成可被独当我们分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用立使用的单词时,可以使用java.utiljava.util包中的包中的StringTokenizerStringTokenizer类,该类有以下两个常用

79、的构造方法。类,该类有以下两个常用的构造方法。 StringTokenizer(String s)StringTokenizer(String s)为字符串为字符串s s构造一个分析器。构造一个分析器。使用默认的分隔符集合,即空格符(若干个空格被看使用默认的分隔符集合,即空格符(若干个空格被看做一个空格)、换行符、回车符、做一个空格)、换行符、回车符、Tab Tab 符、进纸符。符、进纸符。. . StringTokenizer(String strStringTokenizer(String str,String delim)String delim)为字符串为字符串s s构造一个分析器。参

80、数构造一个分析器。参数delimdelim中的字符被作为分隔符。中的字符被作为分隔符。例如:例如:StringTokenizer fenxi = new StringTokenizer(How are StringTokenizer fenxi = new StringTokenizer(How are you); you); StringTokenizer fenxi = new StringTokenizer(How ; are , StringTokenizer fenxi = new StringTokenizer(How ; are , you, ; ,); you, ; ,); 例

81、例10-1110-11程序清单程序清单 StringTokenizer_Test.javaStringTokenizer_Test.javaimport java.util.StringTokenizer;import java.util.StringTokenizer;public class StringTokenizer_Test public class StringTokenizer_Test public static void main(String args) public static void main(String args) String s=You are good?

82、Thanks,I am very good;String s=You are good?Thanks,I am very good; StringTokenizer fenxi=new StringTokenizer(s,? ,);/ StringTokenizer fenxi=new StringTokenizer(s,? ,);/空格空格和逗号做分隔和逗号做分隔 int number=fenxi.countTokens();int number=fenxi.countTokens(); while(fenxi.hasMoreTokens() while(fenxi.hasMoreToken

83、s() String str=fenxi.nextToken(); String str=fenxi.nextToken(); System.out.println(str); System.out.println(str); System.out.println( System.out.println(还剩还剩+fenxi.countTokens()+fenxi.countTokens()+个个单词单词);); System.out.println(s System.out.println(s共有单词:共有单词:+number+number+个个);); 10.4 Character类类Ch

84、aracterCharacter类有以下主要方法:类有以下主要方法:n npublic static boolean isDigit(char ch) public static boolean isDigit(char ch) 如果如果chch是数字字符,是数字字符,方法返回方法返回truetrue,否则返回,否则返回falsefalse;n npublic static boolean isLetter(char ch) public static boolean isLetter(char ch) 如果如果chch是字母,方是字母,方法返回法返回truetrue,否则返回,否则返回fal

85、sefalse;n npublic static boolean isLetterOrDigit(char ch) public static boolean isLetterOrDigit(char ch) 如果如果chch是数是数字字符或字母方法,返回字字符或字母方法,返回true true ,否则返回,否则返回falsefalse;n npublic static char toLowerCase(char ch) public static char toLowerCase(char ch) 返回返回chch的小写形式;的小写形式;n npublic static char toUpp

86、erCase(char ch) public static char toUpperCase(char ch) 返回返回chch的大写形式;的大写形式;n npublic static boolean isSpaceChar(char ch) public static boolean isSpaceChar(char ch) 如果如果chch是空格,是空格,返回返回true true ;n npublic static boolean isLowerCase(char ch) public static boolean isLowerCase(char ch) 如果如果chch是小写是小写字

87、母,方法返回字母,方法返回truetrue,否则返回,否则返回falsefalse;n npublic static boolean isUpperCase(char ch) public static boolean isUpperCase(char ch) 如果如果chch是大写是大写字母,方法返回字母,方法返回truetrue,否则返回,否则返回falsefalse。例例10-1210-12程序清单程序清单 Character_Test.javaCharacter_Test.javapublic class Character_Test public class Character_Te

88、st public static void main(String args) public static void main(String args) String s=new String(xyzXYZ678);String s=new String(xyzXYZ678);System.out.println(s); System.out.println(s); char a=s.toCharArray();char a=s.toCharArray();for(int i=0;ia.length;i+) for(int i=0;ia.length;i+) if(Character.isLo

89、werCase(ai)if(Character.isLowerCase(ai)ai=Character.toUpperCase(ai);ai=Character.toUpperCase(ai); else if(Character.isUpperCase(ai) else if(Character.isUpperCase(ai) ai=Character.toLowerCase(ai);ai=Character.toLowerCase(ai); s=new String(a); s=new String(a); System.out.println(s); System.out.println

90、(s); 10.5 字符串与字符、字节数组字符串与字符、字节数组n n10.5.1 字符串与字符数组1. 用字符数组创建字符串对象String类中有两个用字符数组创建字符串对象的构造方法:String(char )该构造方法用指定的字符数组构造一个字符串对象。String(char ,int offset,int length)用指定的字符数组的一部分,即从数组起始位置offset开始取length个字符构造一个字符串对象。2. 将字符串中的字符复制到字符数组 public void getChars (int start,int end,char c ,int offset)字符串调用get

91、Chars方法将当前字符串中的一部分字符复制到参数c指定的数组中,将字符串中从位置start到end-1位置上的字符复制的数组c中,并从数组c的offset处开始存放这些字符。需要注意的是,必须保证数组c能容纳下要被复制的字符。下面的例子具体说明了该方法的使用。例例10-1310-13程序清单程序清单 GetChars_Test.javaGetChars_Test.javapublic class GetChars_Test public class GetChars_Test public static void main(String args) public static void ma

92、in(String args) char b, a;char b, a;String str = String str = 学习编程是一个长期而艰苦的过程学习编程是一个长期而艰苦的过程; ;b = new char2;b = new char2;str.getChars(4, 6, b, 0);str.getChars(4, 6, b, 0);System.out.println(b);System.out.println(b);a = new charstr.length();a = new charstr.length();str.getChars(6, 11, a, 0);str.get

93、Chars(6, 11, a, 0);str.getChars(5, 7, a, 5);str.getChars(5, 7, a, 5);str.getChars(0, 5, a, 7);str.getChars(0, 5, a, 7);System.out.println(a);System.out.println(a); 例例10-1410-14程序清单程序清单ToCharArray_Test.javaToCharArray_Test.javapublic class ToCharArray_Test public class ToCharArray_Test public static

94、void main(String args) public static void main(String args) String str = String str = 北京金洪恩电脑公司北京金洪恩电脑公司; ;char b = str.toCharArray();char b = str.toCharArray();for (int i = 0; i b.length; i+) for (int i = 0; i b.length; i+) bi = (char) (bi);bi = (char) (bi); String original = new String(b);String o

95、riginal = new String(b);System.out.println(System.out.println(加密前的文字为加密前的文字为: + original);: + original);for (int i = 0; i b.length; i+) for (int i = 0; i b.length; i+) bi = (char) (bi t);bi = (char) (bi t); String cipher = new String(b);String cipher = new String(b);System.out.println(System.out.pri

96、ntln(加密后的文字为加密后的文字为: + cipher);: + cipher); n n10.5.2 字符串与字节数组1. 1. 用字节数组创建字符串对象用字节数组创建字符串对象 String(byte )String(byte )该构造方法使用平台默认的字符编该构造方法使用平台默认的字符编码,用指定的字节数组构造一个字符串对象。码,用指定的字节数组构造一个字符串对象。 String ( byte String ( byte ,int offsetint offset,int length)int length)该构造方法该构造方法使用平台默认的字符编码,用指定的字节数组的使用平台默认的

97、字符编码,用指定的字节数组的一部分,即从数组起始位置一部分,即从数组起始位置offsetoffset开始取开始取lengthlength个个字节构造一个字符串对象。字节构造一个字符串对象。2. 2. 将字符串转化为字节数组将字符串转化为字节数组public byte getBytes()public byte getBytes()使用平台默认的字符编使用平台默认的字符编码,将当前字符串转化为一个字节数组。码,将当前字符串转化为一个字节数组。例例10-1510-15程序清单程序清单GetBytes_Test.javaGetBytes_Test.javapublic class GetBytes_

98、Test public class GetBytes_Test public static void main(String args) public static void main(String args) byte a = byte a = 洪恩软件洪恩软件.getBytes();.getBytes();System.out.println(System.out.println(数组数组a a的长度是的长度是: + : + a.length); /a.length); /一个汉字占两个字节一个汉字占两个字节String str = new String(a, 0, 4);String s

99、tr = new String(a, 0, 4);System.out.println(str);System.out.println(str); 10.6 小结小结在这一章中我们主要学习了数组的概念、拷贝在这一章中我们主要学习了数组的概念、拷贝与排序,字符串的相关的操作,并重要说明了与排序,字符串的相关的操作,并重要说明了StringString类与类与StringBufferStringBuffer类的不同点与各自的优势,类的不同点与各自的优势,我们还学习了如何从控制台输入参数与如何读取我们还学习了如何从控制台输入参数与如何读取键盘的输入,并学习了三种格式数值的格式器。键盘的输入,并学习了三种格式数值的格式器。到现在为止,到现在为止,JavaJava的基础就基本已经结束。从的基础就基本已经结束。从下一章开始,我们将学习下一章开始,我们将学习JavaJava语言的三大核心概语言的三大核心概念。这三大核心概念就是继承、接口、抽象。这念。这三大核心概念就是继承、接口、抽象。这三个概念学习的好坏可以直接影响到对三个概念学习的好坏可以直接影响到对JavaJava语言语言学习的好坏,请读者一定要深入理解这三个概念学习的好坏,请读者一定要深入理解这三个概念并在实践中运用。并在实践中运用。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号