Java常用类及接口 (2).ppt

上传人:牧羊曲112 文档编号:6509776 上传时间:2023-11-07 格式:PPT 页数:59 大小:870KB
返回 下载 相关 举报
Java常用类及接口 (2).ppt_第1页
第1页 / 共59页
Java常用类及接口 (2).ppt_第2页
第2页 / 共59页
Java常用类及接口 (2).ppt_第3页
第3页 / 共59页
Java常用类及接口 (2).ppt_第4页
第4页 / 共59页
Java常用类及接口 (2).ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《Java常用类及接口 (2).ppt》由会员分享,可在线阅读,更多相关《Java常用类及接口 (2).ppt(59页珍藏版)》请在三一办公上搜索。

1、,第六章 Java常用类及接口,图形图像研究所计算机科学与技术、软件学院浙江工业大学,高飞 博士,教授,博士生导师,研究所所长 Cell:Email:,前言,本章的目的:Java API提供的包有哪些?常用包java.lang中Object类、Math类、System类、Runtime类主要方法;java.util包中Date类、Calendar类、Random类以及各种集合;for循环简化方法。,回顾关键词:一维数组、二维数组、new、String、StringBuffer、equals、String常用方法、String与其他数据类型的转换、枚举,小节安排,常用类与接口,6.3.1 Dat

2、e类,6.2、java.lang包,6.3、java.util包,6.3.2 Calendar类,6.3.3 Random类,6.2.1 Object类,6.2.2 Math类,6.2.3 System类,6.2.4 Runtime类,6.1、Java API类库,6.3.4 无序:Collection与Collections,6.3.5 有序:List接口,6.3.6 映射:Map接口,6.3.7 for循环简化方法,6.1、Java API类库,java.lang包:定义了Java中的Object、String、Boolean、Byte、Short、Math、System、Runtime等

3、大多数基本类。不需要用import引入。java.io包:主要含有与输入/输出相关的类,这些类提供了对不同的输入和输出设备读写数据的支持,这些输入和输出设备包括键盘、显示器、打印机、磁盘文件等。java.util包:包括许多具有特定功能的类,有日期、向量、哈希表、堆栈等,其中Date类支持与时间有关的操作。javax.swing包和java.awt包:提供了创建图形用户界面元素的类。通过这些元素,编程者可以控制所写的Applet或Application的外观界面。包中包含了窗口、对话框、菜单等类。包:含有与网络操作相关的类,如TCP Sockets、URL等工具。java.applet包:含有

4、控制HTML文档格式、应用程序中的声音等资源的类,其中Applet类是用来创建包含于HTML的Applet必不可少的类。java.beans包:定义了应用程序编程接口(API),Java Beans是Java应用程序环境的中性平台组件结构。,使用这些类库之前,须用import 引入,如:import java.util.*;/引入包中的全部类import;/引入包中的FileReader类,、Object类,Object类是Java程序中所有类的直接或间接父类,处在类的最高层次。一个类在声明时若不包含关键字extends,系统就会默认该类直接继承Object类。例如:class MyObjec

5、tMyObject类没有使用extends,则其父类为Object类。Object类的equals()方法采用的是=运算比较,也就是只有两个引用变量指向同一对象时才相等,即对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true。Object类的toString()方法是返回对象的描述信息,在Object类中该方法返回对象的类名及对象引用地址。,、Math类,、Math类,程序6-2 TestMath.javaclass TestMath public static void main(String args)System.out.println(Pi=+

6、Math.PI);System.out.println(E=+Math.E);System.out.println(abs(-6.8)=+Math.abs(-6.8);System.out.println(ceil(6.8)=+Math.ceil(6.8);System.out.println(floor(8.6)=+Math.floor(8.6);System.out.println(max(-5,-6)=+Math.max(-5,-6);System.out.println(min(5,6)=+Math.min(5,6);System.out.println(round(8.6)=+Mat

7、h.round(8.6);System.out.println(sqrt(16)=+Math.sqrt(16);System.out.println(exp(1)=+Math.exp(1);System.out.println(log(e)=+Math.log(Math.E);System.out.println(pow(2,3)=+Math.pow(2,3);System.out.println(sin(30 degrees)=+Math.sin(Math.toRadians(30);System.out.println(atan(90 degrees)=+Math.atan(Math.PI

8、/2);,、System类,System类常用方法(均为static且final),/status是状态码,根据Java规则,非0表示异常终止。public static void exit(intstatus),例如:trydouble i,j;i=100;j=0;System.out.println(i/j);/除以0,将引发异常catch(Exception e)System.exit(1);/非中常中止,、System类,System类常用方法(均为static且final),/*将源数组src中从指定位置srcpos开始的length个元素,拷贝到目的数组dest的指/定位置dest

9、pos。type可以是boolean、byte、char、short、int、long、float、double 或object。*/public static void arraycopy(type src,int srcpos,type dest,int destpos,int length),、System类,/将第一个数组的后4个元素拷贝到第二个数组中。class TestArrayCopypublic static void main(String args)int smallPrimes=1,2,3,4,5,6;int lucyNumbers=1001,1002,1003,1004

10、,1005,1006,1007;System.arraycopy(smallPrimes,1,lucyNumbers,2,5);for(int i=0;ilucyNumbers.length;i+)System.out.println(i+:+lucyNumbersi);,输出结果是:0:10011:10022:23:34:45:56:6,、System类,System类常用方法(均为static且final),/*currcntTimeMillis()返回以毫秒为单位的当前时间,具体而言,是当前时间与协调世界时间 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。注意,当返回

11、值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。其定义如下:*/public static long currentTimeMillis(),、System类,程序6-4 TestRunningTime.java/*返回自程序开始运行起至当前时间的以毫秒为单位的时间值。这是一个long型的大数值,/可以用它来检测运行一段程序时所花费的时间。*/public class TestRunningTime public static void main(String args)/记录开始的时间值 long timeTestStart=S

12、ystem.currentTimeMillis();/*/以下为待测试运行时间的代码(欢迎您!);/以上为待测试运行时间的代码/*long timeTestEnd=System.currentTimeMillis();/记录结束的时间值(运行时间是:+(timeTestEnd-timeTestStart);,、System类,System类中的三个变量(均为static且final),/*这些变量是InputStream和PrintStream类的实例,它为与stdin、stdout和stderr的交互提供了read()、print()和println()等成员方法。通常,stdin是指键盘,

13、stdout是指终端,而stderr在缺省时是指屏幕。*/public static final InputStream inpublic static final PrintStream outpublic static final PrintStream err,、System类,/*从键盘输入字符并显示在屏幕上,按回车键结束输入*/import;public class TestIO static void main(String args)System.out.println(Input a line text,carriage to end:);/以下变量ch用于保存每次读入的一个字

14、符,该变量须用int,不能用char类型,/否则编译时会显示会丢失精度而导致编译失败。int ch;try/读入一个字符,read方法是in属于InputStream类拥有的方法 ch=();while(ch!=r)/若输入不等于回车字符,则继续;否则循环退出 System.out.print(char)ch);/输出到屏幕 ch=();/读入下一个字符 catch(IOException e)System.out.println(e.toString();finally System.err.println();,以上程序在输入汉字时不能正常输出(输出变成?),、System类,/*从键盘输

15、入字符并能够正常显示汉字。*/import java.io.*;class TestIOCh public static void main(String args)System.out.println(Input a line text,carriage to end:);int ch;try InputStreamReader in=new InputStreamReader(System.in,GB2312);ch=in.read();while(ch!=r)System.out.print(char)ch);ch=in.read();catch(IOException e)System

16、.out.println(e.toString();finally();,、Runtime类,Runtime类常用方法,/*Runtime类封装了Java命令本身所启动的实例进程,也就是封装了Java虚拟机进程。Runtime的实例对象不能通过new来创建,只能通过Runtime.getRuntime()静态方法来获得。Java虚拟机调用Runtime的exec()方法可以启动其他子进程,其返回值就是代表子进程的Process对象,该方法最常用的定义如下:*/public Process exec(Stringcommand),、Runtime类,/*在java程序中启动一个windows记事

17、本程序,并在该运行实例中打开这个java程序的源文件,启动的记事本程序在8秒钟后被关闭。*/public class TestExec public static void main(String args)Process p=null;try/获得Runtime的实例并调用exec方法Runtime r=Runtime.getRuntime();p=r.exec(notepad.exe c:count.txt);Thread.sleep(8000);/休眠8秒p.destroy();/关闭打开的记事本catch(Exception e)e.printStackTrace();,、Runtim

18、e类,Runtime类常用方法,/*freeMemory()返回 Java 虚拟机中的空闲内存量,以byte为单位;totalMemory()返回 Java 虚拟机中的内存总量,以byte为单位,此方法返回的值可能随时间的推移而变化,这取决于主机环境。*/public long freeMemory()public long totalMemory(),、Runtime类,/*显示当前Java 虚拟机中的内存情况*/public class TestMemory public static void main(String args)Runtime r=null;tryr=Runtime.ge

19、tRuntime();(空闲内存:+r.freeMemory()/1024+KB);(内存总量:+r.totalMemory()/1024+KB);catch(Exception e)e.printStackTrace();,小节安排,常用类与接口,6.3.1 Date类,6.2、java.lang包,6.3、java.util包,6.3.2 Calendar类,6.3.3 Random类,6.2.1 Object类,6.2.2 Math类,6.2.3 System类,6.2.4 Runtime类,6.1、Java API类库,6.3.4 无序:Collection与Collections,6

20、.3.5 有序:List接口,6.3.6 映射:Map接口,6.3.7 for循环简化方法,6.3 java.util包,6.3 java.util包,6.3 java.util包,6.3 java.util包,6.3 java.util包,、Date类,例如:/默认构造方法创建出的对象就代表当前时间Date d=new Date();System.out.println(d);由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示结果类似如下:Sun Jul 01 23:35:58 CST 2012在该格式中,Sun代表Sunday(周日),Jul代表July(七

21、月),01代表1号,CST代表China Standard Time(中国标准时间,也就是北京时间(东八区)。,、Calendar类,例如:Calendar c=Calendar.getInstance();String strStyle=%1$tY-%1$tm-%1$t d%1$tH:%1$tM:%1$tS;String s=String.format(strStyle,c);System.out.println(s);/输出类似于:2012-07-02 11:34:34,获取当前时间,、Calendar类,获得指定时间的Calendar类,/*year表示实际的年份,month则为实际的月

22、份减1,date表示实际的日期*/public final void set(int year,int month,int date)/*也可以只设定某个字段(年、月、日),即field可:Calendar.YEAR年份 Calendar.MONTH月份 Calendar.DATE日期 Calendar.DAY_OF_MONTH日期,和DATE完全相同 Calendar.HOUR12小时制的小时数 Calendar.HOUR_OF_DAY24小时制的小时数 Calendar.MINUTE分钟 Calendar.SECOND秒 Calendar.DAY_OF_WEEK星期几*/public vo

23、id set(int field,int value),、Calendar类,获得指定时间的Calendar类,例如:Calendar c1=Calendar.getInstance();c1.set(2012,7-1,2);/表示2012年7月2日c1.set(Calendar.DATE,10);/改为2012年7月10日,、Calendar类,获得指定时间的Calendar类,/*获取指定字段的信息,其中field与set()方法的含义一样*/public int get(int field),例如:Calendar c2=Calendar.getInstance();int year=c

24、2.get(Calendar.YEAR);/年份int month=c2.get(Calendar.MONTH)+1;/月份int date=c2.get(Calendar.DATE);/日期int hour=c2.get(Calendar.HOUR_OF_DAY);/小时int minute=c2.get(Calendar.MINUTE);/分钟int second=c2.get(Calendar.SECOND);/秒int day=c2.get(Calendar.DAY_OF_WEEK);/星期几,、Calendar类,其他方法,/*amount为正表示增加,amount为负表示减少,fi

25、eld取值与set()方法相同*/public abstract void add(int field,int amount),例如:/计算当前时间100天以后的日期Calendar c3=Calendar.getInstance();c3.add(Calendar.DATE,100);int year1=c3.get(Calendar.YEAR);int month1=c3.get(Calendar.MONTH)+1;/月份int date1=c3.get(Calendar.DATE);/日期,、Calendar类,其他方法,/*after()方法判断当前日期对象是否在when对象的后面,如

26、果在when对象的后面则返回true,否则返回false。*/public boolean after(Object when),例如:Calendar c4=Calendar.getInstance();c4.set(2012,7-1,2);Calendar c5=Calendar.getInstance();c5.set(2012,9-1,10);boolean b=c5.after(c4);System.out.println(b);,、Calendar类,其他方法,/*getTime()方法将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。类似的方法是set

27、Time(),该方法的作用是将Date对象转换为对应的Calendar对象。*/public final Date getTime()public final void setTime(Date date),例如:Date d=new Date();Calendar c6=Calendar.getInstance();Date d1=c6.getTime();/转换为Date对象Calendar c7=Calendar.getInstance();/转换为Calendar c7.setTime(d);,、Calendar类,Calendar与相对时间的相互转换,/返回此 Calendar 的时

28、间值,以毫秒为单位public long getTimeInMillis()/用给定的 long 值设置此 Calendar 的当前时间值public void setTimeInMillis(longmillis),例如:Calendar c8=Calendar.getInstance();/将Calendar对象转换为相对时间long t1=c8.getTimeInMillis();/将相对时间转换为Calendar对象Calendar c9=Calendar.getInstance();c9.setTimeInMillis(t1);,、Random类,Random类的随机算法是伪随机,即

29、有规则的随机。随机算法的起源数字称为种子(seed),在种子数的基础上产生需要的随机数字。应用示例:网站登录中的校验数字、游戏程序中的物品掉落等。相同种子的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。,例如:Randomr=newRandom();Randomr1=newRandom(10);,、Random类,、Random类,例如:Randomr=newRandom();/直接生成0,1.0)区间的小数d1 doubled1=r.nextD

30、ouble();,例如:/*以下语句生成0,5.0)区间的小数,扩大5倍即是要求的区间。同理,生成0,d)区间的随机小数,d为任意正的小数,则只需要将nextDouble方法的返回值乘以d即可。*/doubled2=r.nextDouble()*5;,例如:/以下两句生成-3,15)区间的整数intn5=r.nextInt(18)-3;n5=Math.abs(r.nextInt()%18)-3;,、Random类,例如:/*生成1,2.5)区间的小数,只需要首先生成0,1.5)区间的随机数字,然后将生成的随机数区间加1即可。同理,生成任意非从0开始的小数区间d1,d2)范围的随机数字(其中d1

31、不等于0),则只需要首先生成0,d2-d1)区间的随机数字,然后将生成的随机数字区间加上d1即可。*/doubled3=r.nextDouble()*1.5+1;/直接生成0,232-1之间的任意整数intn1=r.nextInt();intn2=r.nextInt(10);/生成0,10)区间的整数,、Random类,例如:/*同样生成0,10)(不含10)区间的整数。首先调用nextInt()方法生成一个任意的int数字,该数字和10取余以后生成的数字区间为(-10,10),因为按照数学上的规定余数的绝对值小于除数,然后再对该区间求绝对值,则得到的区间就是0,10)了。*/n2=Math.

32、abs(r.nextInt()%10);/生成任意0,n)(不含n)区间的随机整数intn3=r.nextInt(n);n3=Math.abs(r.nextInt()%n);,、Random类,例如:/*以下两句生成0,10(包含10)区间的整数。相对于整数区间,0,10区间和0,11)区间等价,所以即生成0,11)区间的整数。*/intn4=r.nextInt(11);n4=Math.abs(r.nextInt()%11);/以下两句生成-3,15)区间的整数intn5=r.nextInt(18)-3;n5=Math.abs(r.nextInt()%18)-3;,、Random类,例如:/*

33、按照一定的几率实现程序逻辑也是随机处理可以解决的一个问题。随机生成一个整数,该整数以55%的几率生成1,以40%的几率生成2,以5%的几率生成3。*/intn6=r.nextInt(100);intm;/结果数字 if(n655)/55个数字的区间,55%的几率 m=1;elseif(n695)/55,95),40个数,40%的几率 m=2;else m=3;,、Random类,相同种子Random问题,/*相同种子的Random对象,相同次数生成的随机数字是完全相同的,这点在生成多个随机数字时需要特别注意。*/,例如:Randomr1=newRandom(10);Randomr2=newRa

34、ndom(10);for(inti=0;i5;i+)System.out.println(r1.nextInt();System.out.println(r2.nextInt();,、无序集合:Collection接口和Collections类,Collection是一个接口,而Collections是一个类,它们都属于java.util包。Collection是集合接口树的根。Collections是集合操作的实用类,它封装了实现Collection接口的类(如图6-6所示中的HashSet、TreeSet、LinkeHashSet、ArrayList、LinkedList、Vector)中

35、很多算法,如同步、排序、逆序、搜索等。,、有序集合:List接口及其实现类,List表示是一种有序的集合,但其中的元素可以重复。public interface List extends Collection Object get(int index);Object set(int index,Object element);void add(int index,Object element);Object remove(int index);/将集合中索引为index的对象删除掉/将集合c插入到索引为index的对象前面abstract boolean addAll(int index,Co

36、llection c);/返回对象o在集合中第一次出现的位置(索引)int indexOf(Object o);/返回对象o在集合中(从后往前查找)第一次出现的位置(索引)int lastIndexOf(Object o);ListIterator listIterator();/返回集合的迭代器ListIterator listIterator(int index);/返回一个List集合,它包括原集合中从from到to的所有对象List subList(int from,int to)三种实现类:ArrayList类、LinkedList类和Vector类,、有序集合:List接口及其实现

37、类,ArrayList类,/*ArrayList类采用可变大小的数组实现List接口,并提供了访问数组大小的方法。ArrayList对象会随着元素的增加其容器自动扩大。在这三种List实现类中,该类效率最高也最常用。*/,例如:import;ArrayList a=new ArrayList();String s1=hello;String s2=world;a.add(s1);a.add(s2);,、有序集合:List接口及其实现类,/*本实例是实现扑克牌的分发。假设有52张扑克牌(去掉大小王),实现随机洗牌操作,为参加游戏的人每人生成一手牌,每手牌的牌数是指定的,并将每人分到的牌按花色排序

38、后输出。*/import java.util.*;class TestDealCard public static void main(String args)int numHands=4;int cardsPerHand=12;/生成一副牌(含52张牌)String suit=,;/黑桃、梅花、红桃、方片 String rank=A,2,3,4,5,6,7,8,9,10,J,Q,K;List deck=new ArrayList();for(int i=0;isuit.length;i+)for(int j=0;jrank.length;j+)deck.add(suiti+rankj);Co

39、llections.shuffle(deck);/随机改变deck中元素的排列次序,即洗牌。for(int i=0;inumHands;i+)/生成一手牌,并对牌按花色排序后输出。List p=dealCard(deck,cardsPerHand);Collections.sort(p);System.out.println(p);,、有序集合:List接口及其实现类,public static List dealCard(List deck,int n)int deckSize=deck.size();List handView=deck.subList(deckSize-n,deckSiz

40、e);/*从deck中截取一个子链表,利用该子链表创建一个链表,作为本方法返回值。*/List hand=new ArrayList(handView);handView.clear();/将子链表清空。return hand;,、有序集合:List接口及其实现类,LinkedList类,LinkedList采用链表结构实现List接口,并提供了在List的开头和结尾进行get、remove和insert操作,以便实现堆栈、队列或双端队列。LinkedList数据结构是一种双向的链式结构,每一个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素,和数组的顺序存储结构(如:Arra

41、yList)相比,插入和删除比较方便,但速度会慢一些。,、有序集合:List接口及其实现类,/*本实例主要是利用LinkeList来实现堆栈数据结构。栈的定义:栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。(2)当表中没有元素时称为空栈。(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。*/import;public c

42、lass TestStack LinkedList linkList=new LinkedList();public void push(Object obj)linkList.addFirst(obj);public boolean isEmpty()return linkList.isEmpty();public void clear()linkList.clear();,、有序集合:List接口及其实现类,/移除并返回此列表的第一个元素public Object pop()if(!linkList.isEmpty()return linkList.removeFirst();return

43、 栈内无元素;public int getSize()return linkList.size();public static void main(String args)TestStack myStack=new TestStack();myStack.push(2);myStack.push(3);myStack.push(4);System.out.println(myStack.pop();/输出4System.out.println(myStack.pop();/输出3,、有序集合:List接口及其实现类,Vector类,Vector采用可变体积的数组实现List接口,可通过索引序号

44、所包含的元素进行访问。Vector实现了可扩展的对象数组,使用向量没有数组的范围限制,可以不断添加元素。但向量中不能存放基本数据类型的数据,加入的数据均为对象。Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小。,、有序集合:List接口及其实现类,/*演示Vector的使用。包括Vector的创建、向Vector中添加元素、从Vector中删除元素、统计Vector中元素的个数和遍历Vector中的元素。*/import java.util.*;public class TestVector public static void ma

45、in(String args)/使用Vector的构造方法创建Vector v=new Vector(4);/向Vector中添加元素:使用add方法直接添加元素v.add(Test0);v.add(Test1);v.add(Test0);v.add(Test2);v.add(Test2);/从Vector中删除元素v.remove(Test0);/删除指定内容的元素v.remove(0);/按照索引号删除元素int size=v.size();/获得Vector中已有元素的个数System.out.println(size:+size);/输出size:3for(int i=0;i size

46、;i+)/遍历Vector中的元素System.out.println(v.get(i);,、非重复集合:Set接口及其实现类,Set接口表示的集合不能包含重复的元素public interface Set extends Collection/基本的操作int size();/返回元素个数boolean isEmpty();/判断集合是否为空boolean contains(Object element);/是否包含elementboolean add(Object element);/将对象添加到集合尾部boolean remove(Object element);/将对象从集合中移除It

47、erator iterator();/返回一个迭代器 三种实现类:HashSet类、TreeSet类和LinkedHashSet类,、非重复集合:Set接口及其实现类,/*本示例利用Set找出不同的字符串*/import java.util.*;public class FindDuplicates public static void main(String args)/创建一个HashSet对象,缺省的初始容量是16Set s=new HashSet();for(int i=0;iargs.length;i+)/*将命令行中的每个字符串加入到集合s中,其中重复的字符串将不能加入,并被打印输

48、出。*/if(!s.add(argsi)(检测到重复项:+argsi);/输出集合s的元素个数以及集合中的所有元素。System.out.println(s.size()+distinct words detected:+s);,、映射集合:Map接口与实现类TreeMap,Map集合把键值映射到某个值。一个键值最多只能映射一个值。public interface Map extends Collection/基本操作Object put(Object key,Object value);Object get(Object key);Object remove(Object key);bool

49、ean containsKey(Object key);boolean containsValue(Object value);int size();boolean isEmpty();/整体批操作void putAll(Map t);void clear();/集合视图public Set keySet();public Collection values();三种实现类:HashMap、Hashtable、TreeMap、WeekHashMap等类,、映射集合:Map接口与实现类TreeMap,import java.util.*;public class TestTreeMappubli

50、c static void main(String args)Map map=new HashMap();map.put(c,ccc);map.put(a,aaa);map.put(b,bbb);map.put(d,ddd);Iterator iter=map.keySet().iterator();while(iter.hasNext()Object key=iter.next();System.out.println(map key+key.toString()+value=+map.get(key);TreeMap tab=new TreeMap();tab.put(a,aaa);tab

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号