




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组、字符串1教学目标(1) 理解数组引入的必要性及其概念。(2) 掌握一维数组的声明、创建、初始化及访问。(3) 理解何时使用foreach访问数组,能使用foreach访问一维数组。(4) 能熟练应用一维数组的常用处理操作:使用输入值初始化数组、使用随机值初始化数组、对所有元素求和、找出最大(小)值及对应下标、随机打乱、向左(或右)移动元素、输出数组元素等。(5) 理解一维数组作为方法参数、方法返回值,能编写数组作为参数、作为返回值的方法。(6) 基于一维数组,掌握线性查找算法与折半查找算法。(7) 基于一维数组,理解并掌握冒泡排序算法。(8) 掌握Arrays的常用方法,能应用这些常用方法,简化编程。(9) 掌握一维数组复制的几种方式,根据需要选择合适的数组复制方式。(10)理解二维数组与一维数组的关系,掌握二维数组声明、创建、初始化及访问。(11) 理解锯齿二维数组。2教学目标(12) 能熟练应用二维数组的常用处理操作:初始化数组、输出所有数组元素、按列求和、按行求和、求所有元素的和、随机打乱等。(13) 理解多维数组的概念,能声明、创建、初始化、访问多维数组。(14) 理解数组应用示例:扑克牌混洗和发放、单选题测试评分、矩阵相加。(15) 能使用String类创建字符串对象,理解字符串常量池。(16) 能熟练应用字符串的常用处理操作:字符串比较、获取字符串长度、获取指定位置字符、字符数组与字符串相互转换、查找字符串、字符串拼接、获取子字符串、字符串转换等。(17) 理解文本块的引入,能使用文本块。(18) 理解正则表达式的概念,并掌握常用正则表达式的使用。(19) 能结合正则表达式与String类的相关方法,完成字符串匹配、字符串拆分、字符串替换。(20) 掌握字符串应用示例:回文判断、词频统计、最长公共子串(21) 理解可变长参数列表,能定义和应用含有可变长参数的方法。(22) 理解命令行参数,能给Java应用程序传递命令行参数。3内容45.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例内容55.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.1一维数组引例:高校一门课有100人参加考试,计算有多少人的成绩超过平均成绩。6解决方案:首先读入这些成绩,计算平均成绩,然后每个数与平均成绩进行比较。为了完成任务,需存储100个数,于是需要定义100个变量。这有什么问题呢?问题:
(1)声明100个变量;(令人烦躁…,代码难以阅读)
(2)重复书写100次几乎完全相同的代码。解决之道:100个数用一个数组存储,通过循环完成比较任务。单个数组变量可引用一个大的数据集合数组是一个高效组织数据的方法,其特征:元素个数固定、数据类型相同、有序集5.1一维数组7数组是一个表示相同数据类型集合的数据结构。5.1一维数组85.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1一维数组95.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序数组表示数据类型相同、元素个数固定的有序数据集合,是一个引用数据类型。为了在程序中使用数组,需要声明一个引用数组的引用变量,并指定数组元素的数据类型。一维数组声明形式:数据类型[]数组变量名;//推荐形式例:int[]firstArray;//推荐形式数据类型数组变量名[];
例:int
firstArray[];105.1.1数组声明与创建2.数组基础知识5.1.1数组声明与创建在声明一个数组后,仅仅是创建了一个对数组引用的变量,其值为null,还没有为数组分配内存空间,无法存储数组元素。在数组变量声明后,可以使用new操作符创建一个数组,并把数组的引用赋给数组变量,创建一维数组的一般形式如下:数组变量名=new数据类型[数组长度];115.1.1数组声明与创建声明数组变量、创建数组、数组引用赋给数组变量可以在一条语句中同时完成,一般形式如下:数据类型[]数组变量名=new数据类型[数组长度];//形式1数据类型数组变量名[]=new数据类型[数组长度];//形式2例如,下面两条语句都是创建具有5个元素的int类型数组:int[]firstArray=newint[5];//或intfirstArray[]=newint[5];125.1一维数组135.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.2数组初始化与访问数组在创建之后,通常要进行初始化操作,给每个数组元素赋初值。对于一维数组,使用如下语法给数组元素赋值:
数组变量名[下标值]=值例,初始化数组firstArray:firstArray[0]=10;firstArray[1]=20;firstArray[2]=30;firstArray[3]=40;firstArray[4]=50;145.1.2数组初始化与访问数组被创建后,其长度是固定的,且不能被修改,可以使用“数组变量名.length”得到数组长度。例如,firstArray.length的值是5。数组在使用new关键字分配内存空间之后,数组元素被赋予默认值:1)数组元素类型是整数类型(byte、short、int和long)时,默认值是0。2)数组元素类型是基本类型中的浮点类型(float、double)时,默认值是0.0。3)数组元素类型是基本类型中的字符类型(char)时,默认值是'\u0000'。4)数组元素类型是基本类型中的布尔类型(boolean)时,默认值是false。5)数组元素类型是引用类型(类、接口和数组)时,默认值是null。155.1.2数组初始化与访问数组声明、创建、初始化还可以一步完成,其语法形式如下:数据类型[]数组变量名={值1,值2,值3,…,值n};//或数据类型数组变量名[]={值1,值2,值3,…,值n};初始化列表:由一对花括号括起来的、多个逗号分隔的值的列表示例:int[]firstArray={10,20,30,40,50}初始化列表允许在最后一个值之后多加一个逗号,不影响数组长度,但不能连续加多个逗号,例如:int[]array1={};//合法,长度为零的数组int[]array2={,};//合法,长度为零的数组int[]array3={2,3};//合法,长度为2的数组int[]array4={2,3,};//合法,长度为2的数组int[]array5={2,3,,};//不合法,Java编译器报错165.1.2数组初始化与访问数组示例1:程序清单5-1FirstArrayDemo.java当声明一个数组之后,创建和初始化可合并在一起完成,其一般形式如下:数据类型[]数组变量;数组变量=new数据类型[]{值1,值2,…,值n};数组示例2:程序清单5-2:TestArrayRef.java17警告使用数组初始化语法时,必须将声明、创建、初始化数组都放在一条语句中,将它们分开将产生语法错误。例,18double[]myList;myList={1.9,2.9,3.4,3.5};
195-1指出下列错误的语句()数组中的每个元素都有相同的类型一旦数组被声明,大小就不能改变一旦数组被创建,大小就不能改变数组中的元素必须是基本数据类型ABCD提交多选题2分205-2以下哪些语句是合法的()?inti=newint(30);doubled[]=newdouble[30];floatf[]={2,3,4,5,6.6};char[]c=newchar();ABCD提交inti[]=(3,4,3,2);E多选题1分5.1一维数组215.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.3foreach循环foreach循环:按顺序遍历数组中的每个元素,而不必考虑数组下标值语法形式:for(数据类型变量名:数组变量名){ //循环体处理语句}举例:下面的代码可以按顺序输出myArray数组的数组元素for(inte:myArray)//可以读作:对数组myArray中的每个元素eSystem.out.printf("%4d",e);22235-3下面代码的执行结果:2.5,3,42.5342.53.04.02.5,3.0,4.0ABCD提交publicclassTest{publicstaticvoidmain(String[]args){double[]x={2.5,3,4};for(doublevalue:x)System.out.print(value+"");}}单选题1分5.1一维数组245.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.4数组常用操作一维数组的常用操作有:使用输入值初始化数组、使用随机值初始化数组、对所有元素求和、找出最大(小)值及对应下标、随机打乱、向左(或右)移动元素、输出数组元素等。示例:程序清单5-3HandleArrayDemo.java255.1一维数组265.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.5数组与方法1、数组作为方法形参 当数组作为方法形参时,形参的数据类型是数组类型。例如,方法main的参数String[]args,就是一个以字符串数组作为形参的例子。27publicstaticvoiddisplayArray(int[]list){for(inte:list)
System.out.printf("%d,",e);}调用方法时,只需要使用数组名:int[]list1={3,5,7};displayArray(list1);//输出3,5,7,还有一种较为特殊的调用方式,匿名数组:displayArray(newint[]{3,5,7});//输出3,5,7,5.1.5数组与方法28示例1:程序清单5-4TestArrayMethod1.java示例2:程序清单5-5TestSwapTwoNums.java5.1.5数组与方法2、数组作为方法返回值类型当方法的返回值类型是一个数组类型时,方法可以返回一个数组。方法返回一个数组,实际上返回的是一个数组的引用。示例:程序清单5-6TestReturnArray.java29305-4判断对错:当传递一个数组给方法时,一个新的数组被创建并且传递给方法()正确错误AB提交单选题1分315-5假定一个方法p有如下方法头:publicstaticint[]p()哪个return语句可以用在p()中?()return1;return{1,2,3};returnint[]{1,2,3};returnnewint[]{1,2,3};ABCD提交单选题1分5.1一维数组325.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.6数组查找查找是计算机程序设计中经常要完成的任务。本节讨论:线性查找折半查找线性查找又称为顺序查找,是一种最简单的查找方法。以处理int类型一维数组为例,线性查找算法的基本思想是:将要查找的关键字key值与数组中的元素依次逐个比较,直到找到与key值相等的元素,或者查找完数组没有找到与之相等的元素。如果找到与key值相等的元素,则返回该数组元素对应的下标值。否则,返回-1。335.1.6数组查找34641973286419732864197328641973286419732864197328333333KeyList示例:程序清单5-7LinearSearch.java线性查找动画5.1.6数组查找折半查找又称为二分查找(binarysearch),是一种在有序数组中查找某一特定元素的搜索算法。使用折半查找的前提是数组中的元素必须是已经排好序的。假设一个int类型一维数组已经按升序排列,折半查找法首先让关键字key与数组的中间元素比较。此时,可能出现三种不同的情况:①如果关键字key等于中间元素值,则查找成功,返回中间元素对应的下标值。②如果关键字key小于中间元素值,则需要在数组的前一半元素中继续查找key。③如果关键字key大于中间元素值,则需要在数组的后一半元素中继续查找key。在继续查找key时,从前一半或后一半元素中,再次取出其中间元素,与key进行比较。当把整个数组查找完时,还没有找到与key相等的元素,返回-1。355.1.6数组查找36123467891234678912346789888KeyList7.数组的查找二分查找:简单示例动画5.1.6数组查找为了便于描述折半查找过程,需设计三个下标变量:high、low、mid,它们分别表示当前待查找数组的最后一个元素下标、第一个元素的下标、中间元素的下标。mid的值为:(high+low)/2。起始时,high=数组.length–1,low=0当key小于中间元素值时,查找数组的前半部分,此时数组前半部分的第一个元素下标low不变,high变为mid–1,mid继续基于公式:(high+low)/2进行更新。当key大于中间元素值时,查找数组的后半部分,此时数组后半部分的第一个元素下标low变为mid+1,high不变,mid的值更新重复上述步骤,直到找到与key相等的元素或者数组查找完,即high小于等于low。375.1.6数组查找38查找成功示例5.1.6数组查找39查找失败示例5.1.6数组查找折半查找算法实现与测试:程序清单5-8HalfIntervalSearch.java405.1一维数组415.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.7数组排序冒泡排序:交换排序基本思想:从下标为0的元素开始,依次比较两个相邻的元素;如果前者大于后者,就交换这两个相邻元素的值。上述这个两两比较的工作重复进行,直到没有相邻元素需要交换为止,就说明排序完成。举例说明:见右图算法实现与测试:程序清单5-9BubbleSort.java425.1一维数组435.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.8Arraysjava.utils.Arrays类提供了对数组操作的一系列方法,使用这些方法可以简化开发过程,提高开发效率。示例:程序清单5-10ArraysDemo1.java445.1.8Arraysjava.utils.Arrays类提供了对数组操作的一系列方法,使用这些方法可以简化开发过程,提高开发效率。示例:程序清单5-10ArraysDemo1.java455.1.8Arrays46Java提供了几个重载版本的java.util.Arrays.binarySearch方法(在int,double,char,short,long,float数组中查找给定的关键字)int[]list={2,4,7,10,11,45,50,59,60,66,69,70,79};System.out.println("Indexis"+java.util.Arrays.binarySearch(list,11));
char[]chars={'a','c','g','x','y','z'};System.out.println("Indexis"+java.util.Arrays.binarySearch(chars,'t'));
Returnis4Returnis–4(insertionpointis3,soreturnis-3-1)475-6假定:int[]scores={1,20,30,40,50},那么java.util.Arrays.binarySearch(scores,3)返回的值是()0-12-2ABCD提交单选题1分485-7下面哪个方法是对double型数组scores的排序()java.util.Arrays(scores)java.util.Arrays.sorts(scores)java.util.Arrays.sort(scores)java.util.Arrays.sortArray(scores)ABCD提交单选题1分5.1一维数组495.1.1数组声明与创建5.1.2数组初始化与访问5.1.3foreach循环5.1.4数组常用操作5.1.8Arrays5.1.9数组复制5.1.5数组与方法5.1.6数组查找5.1.7数组排序5.1.9数组复制数组复制:深度复制、浅度复制深度复制:复制数组的内容浅度复制:复制数组的引用505.1.9数组复制Java类库提供了数组深度复制的方法:Arrays类的copyOf()方法:publicstaticint[]copyOf(int[]original,intnewLength)Arrays类的copyOfRange()方法:publicstaticint[]copyOfRange(int[]original,intfrom,intto)System类的arraycopy()方法:publicstaticvoidarraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)示例:程序清单5-11TestArrayCopy.java51内容525.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.2二维数组二维数组是具有行下标和列下标的数组,可以用来存储表或矩阵53表的示例矩阵的示例Java语言把二维数组看作是由多个一维数组构成的数组。5.2二维数组545.2.3锯齿二维数组5.2.4二维数组处理5.2.1二维数组的声明与创建5.2.2二维数组初始化与访问5.2二维数组555.2.3锯齿二维数组5.2.4二维数组处理5.2.1二维数组的声明与创建5.2.2二维数组初始化与访问5.2.1二维数组的声明与创建声明二维数组的语法如下:数据类型[][]变量名;//推荐形式数据类型变量名[][];//另一种合法形式例如:int[][]matrixs;或intmatrixs[][];创建二维数组的语法格式如下:变量名=new数据类型[m][n];//m,n通常是正整数值例如,matrixs=newint[3][3];565.2.1二维数组的声明与创建与一维数组一样,二维数组声明和创建,也可以一步完成:数据类型[][]变量名=new数据类型[m][n];//m,n通常是正整数值或者数据类型变量名[][]=new数据类型[m][n];//m,n通常是正整数值例如,int[][]matrixs=newint[3][3];或者,intmatrixs[][]=newint[3][3];575.2二维数组585.2.3锯齿二维数组5.2.4二维数组处理5.2.1二维数组的声明与创建5.2.2二维数组初始化与访问5.2.2二维数组初始化与访问与一维数组一样,二维数组在创建之后,也具有默认值,默认值规则与一维数组一样。二维数组也可以采用初始化列表初始化,其一般形式如下:数据类型[][]变量名=二维数组初始化列表;二维数组的初始化列表形式如下:二维数组初始化列表={一维数组初始化列表1,一维数组初始化列表2,…,一维数组初始化列表n};例如,int[][]scores={{78,89,95},{87,98,89},{82,95,92}};595.2.2二维数组初始化与访问与一维数组一样,二维数组在创建之后,也具有默认值,默认值规则与一维数组一样。二维数组也可以采用初始化列表初始化,其一般形式如下:数据类型[][]变量名=二维数组初始化列表;二维数组的初始化列表形式如下:二维数组初始化列表={一维数组初始化列表1,一维数组初始化列表2,…,一维数组初始化列表n};例如,int[][]scores={{78,89,95},{87,98,89},{82,95,92}};60int[][]scores=newint[3][3];scores[0][0]=78;scores[0][1]=89;scores[0][2]=95;scores[1][0]=87;scores[1][1]=98;scores[1][2]=89;scores[2][0]=82;scores[2][1]=95;scores[2][2]=92;等价于5.2.2二维数组初始化与访问与一维数组一样,二维数组的声明,与创建和初始化分开成两步,例如:int[][]scores;scores=newint[][]{{78,89,95},{87,98,89},{82,95,92}};61二维数组的每一个元素是一个一维数组。二维数组的长度表示其包含多少个一维数组可通过行下标、列下标访问具体的数组元素625-8创建数组:double[][]x=newdouble[4][5],x.length和x[2].length的值分别是()4和44和55和55和4ABCD提交单选题1分5.2二维数组635.2.3锯齿二维数组5.2.4二维数组处理5.2.1二维数组的声明与创建5.2.2二维数组初始化与访问5.2.3锯齿二维数组Java语言的二维数组是由多个一维数组构成,各个一维数组的长度可以不相同。这种数组可以称为锯齿二维数组,还可以称为不规则二维数组64访问锯齿二维数组,也是需要指定行下标和列下标。例如,xList[0][0]访问数组元素的值1,xList[0][1]访问数组元素的值35.2.3锯齿二维数组如果锯齿数组的初始值不知道,且知道各个一维数组的长度,那么可以结合new操作符使用如下语法创建锯齿数组:int[][]xList=newint[4][];xList[0]=newint[5];xList[1]=newint[2];xList[2]=newint[4];xList[3]=newint[1];65665-9以下哪些语句是合法的int[][]r=newint[2];int[]x=newint[];int[][]y=newint[3][];int[][]z={{1,2}};ABCD提交int[][]m={{1,2},{2,3}};Eint[][]n={{1,2},{2,3},};F多选题1分5.2二维数组675.2.3锯齿二维数组5.2.4二维数组处理5.2.1二维数组的声明与创建5.2.2二维数组初始化与访问5.2.4二维数组处理由于二维数组的长度是固定的,所以常常使用嵌套for循环处理二维数组。与一维数组类似,二维数组也有一些常见处理操作:初始化数组、输出所有数组元素、按列求和、按行求和、求所有元素的和、随机打乱等程序清单5-12TestTwoDArray.java68695-10下列代码的输出是:()123445671381225913ABCD提交publicclassTest{publicstaticvoidmain(String[]args){int[][]matrix={{1,2,3,4},{4,5,6,7},{8,9,10,11},{12,13,14,15}};for(inti=0;i<4;i++)System.out.print(matrix[i][1]+"");}}单选题1分内容705.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.3多维数组Java语言把一个二维数组看作是由多个一维数组构成的数组,而一个三维数组是由多个二维数组构成的数组,每个二维数组又是由多个一维数组构成的数组。一个四维数组是由多个三维数组构成数组。因此,可以总结为:一个n(n≥2)维数组可以看作是由多个n-1维数组构成的数组。在声明和创建多维数组时,可以借鉴二维数组的声明与创建,示例:int[][][]grades=newint[5][3][2];//5个考生、3门课、两种考试(笔试、机试)715.3多维数组初始化列表初始化:示例:程序清单5-13TestThreeDArray.java72735-11下列代码的输出结果是()1245ABCD提交publicclassTest{publicstaticvoidmain(String[]args){int[][][]data={{{1,2},{3,4}},{{5,6},{7,8}}};System.out.print(data[1][0][0]);}}单选题1分内容745.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.4数组应用示例755.4.3矩阵相加5.4.1扑克牌混洗和发放5.4.2单选题测试评分5.4数组应用示例765.4.3矩阵相加5.4.1扑克牌混洗和发放5.4.2单选题测试评分5.4.1扑克牌混洗和发放假设3个玩家在玩扑克牌,如何混洗扑克牌,并给3个玩家发放扑克呢?该玩法不需要大王、小王两张牌,初始时只需要给每个玩家随机发放5张牌。一副扑克牌在去掉大王、小王两张扑克牌后,剩下52张,由黑桃、红桃、梅花、方块4种花色构成,每种花色的牌有13张int[]cards=newint[52];//初始化数组for(inti=0;i<cards.length;i++)cards[i]=i;//具有值0-51775.4.1扑克牌混洗和发放示例:程序清单5-14TestPlayingCards785.4数组应用示例795.4.3矩阵相加5.4.1扑克牌混洗和发放5.4.2单选题测试评分5.4.2单选题测试评分假设在某门课教学过程中,进行一个阶段小测验,布置了10单选题进行测试,每道单选题2分,本次测试满分20分。学生提交的答题表,按学号顺序排列。最后,通过自动阅卷,记录并显示学生的成绩。10道选择题的正确答案为,1-5题:ABACC,6-10题:DBCBA。80学生答题表:一个二维数组正确答案:一个一维数组学生学号:一个一维数组学生成绩:一个一维数组程序清单5-15PhaseExam.java5.4数组应用示例815.4.3矩阵相加5.4.1扑克牌混洗和发放5.4.2单选题测试评分5.4.3矩阵相加矩阵相加运算要求两个矩阵必须具备相同的维数。假设两个矩阵A、B具有相同的维数,矩阵元素都是double类型的值,矩阵C=A+B,那么矩阵C的每个元素Cij=Aij+Bij。82程序清单5-16MatrixAddDemo内容835.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.5字符串845.5.3文本块5.5.1String类基础5.5.2字符串处理5.5字符串855.5.3文本块5.5.1String类基础5.5.2字符串处理5.5.1
String类基础Java语言提供了String类来创建和操作字符串Strings1=newString("Helloworld!");//采用构造方法形式Strings2=newString(newchar[]{'H','e','l','l','o','!’});//通过字符数组创建一个字符串对象byte[]bytes={97,98,99,100};Strings3=newString(bytes);//通过字节数组创建一个字符串对象字符串常量池(Stringconstantpool):JVM为了提高效率并节约内存,对具有相同Unicode字符序列的字面量使用同一个实例865.5.1
String类基础程序清单5-17展示了字符串常量池与不使用字符串常量池的区别。875.5字符串885.5.3文本块5.5.1String类基础5.5.2字符串处理5.5.2字符串处理常见处理:字符串比较、获取字符串长度、获取指定位置字符、字符数组与字符串相互转换、查找字符串、字符串拼接、获取子字符串、字符串转换1、字符串比较如果想比较两个字符串内容是否相等,那么需要使用equals()方法。如果想比较两个字符串是否同一个对象,可以使用==运算符89Strings1="hello";Strings2="hello";Strings3=newString("hello");System.out.println("s1==s2:"+(s1==s2));//trueSystem.out.println("s1与s2内容是否相等:"+s1.equals(s2));//trueSystem.out.println("s1与s3内容是否相等:"+s1.equals(s3));//true5.5.2字符串处理1、字符串比较Java语言是大小写敏感的语言,当需要忽略字母大小写进行比较时,可以使用equalsIgnoreCase()方法Java语言提供了compareTo()方法按字典序比较两个字符串,compareTo()方法的使用形式如下:pareTo(cmpStr);//返回值是一个整数90Stringstr1="abc";Stringstr2="ABC";System.out.println(str1.equalsIgnoreCase(str2));//输出trueStringstr1="Ad";Stringstr2="ab";System.out.println(pareTo(str2));//输出:-32System.out.println(pareTo(str1));//输出:32System.out.println(pareTo("ab"));//输出:0 915-12"abc".compareTo("aba")的值是()12-1-2ABCD提交单选题1分5.5.2字符串处理2、获取字符串长度String类获取字符串长度的方法是length(),返回字符串对象包含的字符数。92Stringstrl="Hello";System.out.println(strl.length());//输出55.5.2字符串处理3、获取指定位置字符String类的方法publiccharcharAt(intindex),返回字符串指定位置index的字符(index从0开始,最大值为:字符串长度-1)93Stringstr="mystr";System.out.println(str.charAt(0));//输出m5.5.2字符串处理4、字符数组与字符串相互转换String类的方法publicchar[]toCharArray()可以基于字符串的内容生成一个字符数组并返回字符数组转换为字符串,可以使用String类的构造方法94Stringstrchar="String2022";char[]chars=strchar.toCharArray();for(inti=0;i<chars.length;i++){//输出:String2022System.out.print(chars[i]+"");}Stringstr=newString(newchar[]{'A','B','C','D'});5.5.2字符串处理5、查找字符串95
方法描述publicbooleancontains(Strings)判断此字符串是否包含子字符串s,若包含返回true,否则返回falsepublicintindexOf(Stringstr)在此字符串中,从左向右查找指定字符串的位置,若找不到返回-1publicintindexOf(intch)返回此字符串中指定字符第一次出现的索引。若找不到返回-1publicintindexOf(intch,intfromIndex)返回此字符串中指定字符第一次出现的索引,从指定索引fromIndex处开始搜索。若找不到返回-1publicintindexOf(Stringstr,intfromIndex)在此字符串中,从指定位置从左向右查找指定字符串的位置,若找不到返回-1publicintlastIndexOf(Stringstr)在此字符串中,从右向左查找指定字符串的位置,若找不到返回-1publicintlastIndexOf(Stringstr,intfromIndex)在此字符串中,从指定位置从右向左查找指定字符串的位置,若找不到返回-1publicbooleanstartsWith(Stringprefix)判断此字符串是否以指定的字符串开头,若是,则返回true;否则返回falsepublicbooleanstartsWith(Stringprefix,intoffset)从指定位置offset判断此字符串是否以指定的字符串开头,若是,则返回true;否则返回falsepublicbooleanendsWith(Stringsuffix)判断此字符串是否以指定的字符串suffix结尾,若是,则返回true;否则返回false5.5.2字符串处理5、查找字符串96Strings="Wearestudents";intindex1=s.indexOf('a');//index1=3intindex2=s.indexOf("are");//index2=3intindex3=s.indexOf('a',5);//index3=-1System.out.println("中国电子".contains("中电"));//输出falseSystem.out.println("中国电子".contains("电子"));//输出trueString[]str={"tst..test","guetjava@sa@2","@test#javademo!!"};intindex4=str[0].indexOf("java");//index4=-1intindex5=str[1].indexOf("java");//index5=4intindex6=str[1].indexOf("@",3);//index6=8intindex7=str[1].lastIndexOf("@");//index7=11booleanisPre=str[2].startsWith("@");//isPre=truebooleanisEnd=str[2].endsWith("!!");//isEnd=true5.5.2字符串处理6、字符串拼接下面使用+拼接多个字符串:如果用+连接字符串和其他数据类型值,会将其他数据类型值先自动转换为字符串,再连接97Strings1="Hello";Strings2="world";Strings=s1+""+s2+"!";System.out.println(s);//输出:Helloworld!intage=25;Strings="ageis"+age;System.out.println(s);//输出:ageis255.5.2字符串处理6、字符串拼接方法publicStringconcat(Stringstr),其作用是连接多个字符串:如果需要将多个字符串拼接在一起,并用一个界定符分隔,可以使用String类的静态方法join()从JavaSE11开始,Java语言提供了repeat方法,对相同字符串重复拼接:98"care".concat("less")//返回字符串:"careless""to".concat("get").concat("her")//连续调用,返回字符串:"together"Stringstr=String.join("#","C","Java","Python");//str:C#Java#PythonStrings="hello".repeat(3);//s:hellohellohello995-13字符A的Unicode值是65,表达式"A"+1的值是()66BA1非法表达式ABCD提交单选题1分5.5.2字符串处理7、获取子字符串100Stringstr1="Helloword";Stringsubstr1=str.substring(3);//获取子字符串,substr1值为lowordStringstr2="Helloword";Stringsubstr2=str.substring(0,3);//substr的值为hel方法描述publicStringsubstring(intbeginIndex)返回一个字符串,其内容是此字符串的子字符串。子字符串以指定索引处的字符开始,并延伸到此字符串的末尾。publicStringsubstring(intbeginIndex,intendIndex)返回一个字符串,其内容是此字符串的子字符串。子字符串从指定的beginIndex开始,并扩展到索引endIndex-1处的字符。因此,子字符串的长度是endIndex-beginIndex。Stringstr3=;Stringsub_str1=str2.substring(0,3);Stringsub_str2=str2.substring(7);Stringstr4=sub_str1+"****"+sub_str2;//str4:187****09881015-14"SELECT".substring(0,5)返回的值为()"SELECT""SELEC""SELE""LECT"ABCD提交单选题1分此题未设置答案,请点击右侧设置按钮5.5.2字符串处理8、从控制台读取字符串从控制台读取字符串可使用Scanner类的next()方法或者nextLine()方法。102Scannerinput=newScanner(System.in);Stringstr=input.next();//从控制台读取一个字符串StringstrNew=input.nextLine();输入:helloIamacoder!
读取的字符串是整行字符串,strNew的值是:helloIamacoder!。5.5.2字符串处理9、去除空格103Stringstr="hello";StringstrNew=str.trim();//strNew为hello5.5.2字符串处理10、大小写转换String类大小写转换方法是:publicStringtoLowerCase()和publicStringtoUpperCase()104Stringstr1="ABCDefg";Stringstr2="abcDEFG";StringlowerStr=str1.toLowerCase();//lowerStr为abcdefgStringupperStr=str2.toUpperCase();//upperStr为ABCDEFG1055-15下面哪一个语句能够正确地返回JAVA()toUpperCase("Java")"Java".toUpperCase("Java")"Java".toUpperCase()String.toUpperCase("Java")ABCD提交单选题1分5.5.2字符串处理11、基本类型转换字符串当需要把基本类型值转换为字符串时,可以使用String类的静态方法publicstaticStringvalueOf(基本数据类型变量名)106String.valueOf(123);//"123"String.valueOf(45.67);//"45.67"String.valueOf(45.67f);//"45.67"String.valueOf(true);//"true"String.valueOf('A');//"A"5.5字符串1075.5.3文本块5.5.1String类基础5.5.2字符串处理5.5.3文本块文本块(TextBlocks)在JavaSE15中被确定下来成为正式功能文本块是一种多行字符串文字,它以三个双引号字符(""")开始,以三个双引号字符(""")结束108一段HTML文本,如果用传统双引号字符串表示,需要进行拼接,并使用转义字符采用文本块形式定义一段HTML文本,省略了转义序列,缩进保留,可读性更好5.5.3文本块文本块避免了大多数转义序列的需要,以一种可预测的方式自动设置字符串的格式,并在需要时使开发人员可以控制格式,简化编写Java程序的任务。注意:(1)文本块以3个双引号"""开始和结束,开始的3个双引号"""必须单独成一行。(2)文本块可以在3个双引号"""内插入任何字符,包括换行符。(3)文本块可以使用转义字符来插入双引号或其他特殊字符。(4)文本块支持缩进,提升阅读的清晰性;Java编译器在处理文本块缩进时,会自动删除不需要的缩进:每行结尾的空格都会删除;每行开始的共有的空格会自动删除;只保留相对缩进。示例:程序清单5-18TestTextBlock.java1091105-16下面关于文本块定义,正确的是()Stringstr="""json""";Stringstr="""
json""";TextBlockstr="""json""";String[]str="""
json""";ABCD提交单选题1分内容1115.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.6正则表达式一些应用程序具有验证用户输入的需求,例如,一个应用程序要求用户输入一个手机号,那么该程序就应该要验证输入的字符是否数字,是否11位。如何编写代码来验证用户的输入呢?通常,一个有效的做法就是使用正则表达式(RegularExpression,简写为regex)正则表达式:是由普通字符以及特殊符号组成的一个字符串,用来描述匹配一个字符串集合的模式。"java-\\d":java-0、java-1、java-2、…、java-9匹配11位手机号码,以数字1开头:"1\\d{10}“常用正则表达式符号和示例1125.6正则表达式113符号含义示例解释.
匹配除\n以外的任何字符
a..b以a开头,b结尾,中间包括2个任意字符的长度为4的字符串\d
匹配单个数字字符,相当于[0-9]\d{3}(\d)?包含3个或4个数字的字符串\D
匹配单个非数字字符,相当于[^0-9]\D(\d)*以单个非数字字符开头,后接任意个数字字符串\w匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z]\d{3}\w{4}以3个数字字符开头的长度为7的数字字母字符串\W匹配单个非数字、大小写字母字符,相当于[^0-9a-zA-Z]\W+\d{2}以至少1个非数字字母字符开头,2个数字字符结尾\p{P}一个标点字符!"#$%&'()+,-./:<>=?@[\]^_{}|`~java\p{P}以java开头,后接任意一个标点符号的字符串,例如,java#、java$、…[
]
可接收的字符列表[efgh]e、f、g、h中的任意1个字符[^]
不接收的字符列表[^abc]除a、b、c之外的任意1个字符,包括数字和特殊符号
|匹配“|”之前或之后的表达式
ab|cdab或者cd(
)
将子表达式分组
(abc)将字符串abc作为一组5.6正则表达式114符号含义示例解释
-
连字符A-Z任意单个大写字母
*
指定字符重复0次或n次
(abc)*仅包含任意个abc的字符串,等效于\w*+
指定字符重复1次或n次m+(abc)*
以至少1个m开头,后接任意个abc的字符串?指定字符重复0次或1次m+abc?以至少1个m开头,后接ab或abc的字符串{n}只能输入n个字符
[abcd]{3}由abcd中字母组成的任意长度为3的字符串{n,}指定至少n个匹配[abcd]{3,}由abcd中字母组成的任意长度不小于3的字符串
{n,m}指定至少n个但不多于m个匹配
[abcd]{3,5}由abcd中字母组成的任意长度不小于3,不大于5的字符串^指定起始字符
^[0-9]+[a-z]*以至少1个数字开头,后接任意个小写字母的字符串$指定结束字符^[0-9]\-[a-z]+$以1个数字开头后接连字符“–”,并以至少1个小写字母结尾的字符串5.6正则表达式1155.6.3字符串替换5.6.1字符串匹配5.6.2字符串拆分5.6正则表达式1165.6.3字符串替换5.6.1字符串匹配5.6.2字符串拆分5.6.1字符串匹配booleanmatches(Stringregex):表示此字符串是否匹配给定的正则表达式regex117Stringregex1="java-\d";System.out.println("java-1".matches(regex1));//输出trueSystem.out.println("java-2".matches(regex1));//输出trueSystem.out.println("java-10".matches(regex1));//输出false//判断字符串是否符合手机号码规则:数字1开头,后接10个数字Stringregex2="1\\d{10}";System.out.println(.matches(regex2));//输出trueSystem.out.println("03978308333".matches(regex2));//输出false5.6正则表达式1185.6.3字符串替换5.6.1字符串匹配5.6.2字符串拆分5.6.2字符串拆分119方法描述publicString[]split(Stringregex)基于给定正则表达式的匹配项对字符串进行拆分,返回字符串数组publicString[]split(Stringregex,intlimit)基于给定正则表达式的匹配项对字符串进行拆分,返回字符串数组,limit参数确定模式匹配多少次,最后返回的字符串数组长度由limit决定Stringstr="192,34?56!8";String[]strList=str.split("\\p{P}");for(inti=0;i<strList.length;i++){System.out.print(strList[i]+"");}19234568针对split(regex,limit)版本,如果limit<=0,split(regex,limit)等同于split(regex)。如果limit>0,模式匹配次数最多为limit–1次Stringstr="192,34?56!8";String[]strList1=str.split("\\p{P}",-1);//strList1:19234568,4个元素String[]strList2=str.split("\\p{P}",0);//strList2:19234568,4个元素String[]strList3=str.split("\\p{P}",1);//strList3:192,34?56!8,1个元素String[]strList4=str.split("\\p{P}",2);//strList4:19234?56!8,2个元素String[]strList5=str.split("\\p{P}",3);//strList5:1923456!8,3个元素5.6正则表达式1205.6.3字符串替换5.6.1字符串匹配5.6.2字符串拆分5.6.3字符串替换121
方法描述publicStringreplace(CharSequencetarget,CharSequencereplacement)将目标字符序列替换成第二个参数位置上的字符序列,返回新的字符串,不支持正则表达式publicStringreplaceAll(Stringregex,Stringreplacement)将目标字符子串或者匹配正则表达式的子串,替换成第二个参数位置上的字符序列,返回新的字符串publicStringreplaceFirst(Stringregex,Stringreplacement)将目标字符子串或者匹配正则表达式的第一个符合条件的子串,替换成第二个参数位置上的字符序列,返回新的字符串,支持正则表达式//不使用正则表达式的替换Stringstr1="北京:海淀:中关村";System.out.println(str1.replace(":",","));//输出:北京,海淀,中关村Stringstr2="MyJavaStringandMatrix";System.out.println(str2.replaceAll("a","*"));//输出:MyJ*v*String*ndM*trixSystem.out.println(str2.replaceFirst("a","*"));//输出:MyJ*vaStringandMatrix//使用正则表达式的替换System.out.println(str1.replaceAll("\\p{P}","#"));//输出:北京#海淀#中关村System.out.println(str1.replaceFirst("\\p{P}","#"));//输出:北京#海淀:中关村5.6.3字符串替换下面是使用正则表达式将手机号中间四位替换成*进行脱敏处理122Stringstr3=;Stringreg1="(\\d{3})(\\d{4})(\\d{4})";//数字分成三组System.out.println(str3.replaceAll(reg1,"$1****$3"));//输出:187****0456$1、$2、$3分别对应正则表达式3个部分\\d{3}、\\d{4}、\\d{4}在replaceAll方法中,"$1****$3"表示第一个部分、第三个部分保持不变,中间部分用****替换内容1235.1一维数组5.2二维数组5.3多维数组5.4数组应用示例5.8可变长参数列表5.9命令行参数5.5字符串5.6正则表达式5.7字符串应用示例5.7字符串应用示例一个字符串如果从左向右读和从右向左读是一样的,这个字符串被称为回文(Palindrome)“level”、“noon”、“dad”、“mom”都是回文;而“te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 返租合同的协议
- 合伙协议合同范本4人
- 古代书画买卖合同协议
- 企业与食堂水电协议合同
- 合同协议六人怎样称呼
- 购买镜子合同协议书范本
- 蛋糕学徒合同协议
- 暂停租赁合同协议
- 设备场地租赁协议合同书
- 员工合同协议生效
- 《国家学生体质健康标准》登记卡
- 住院患者VTE相关评估量表课件
- 高中物理选修二第一章《安培力与洛伦兹力》测试题(含答案解析)
- 个体餐饮员工简易合同范本
- 2024年全国《劳动教育》基础知识考试题库与答案
- 非煤矿山安全教育培训试卷(答案)
- 江苏省徐州市睢宁县2023-2024学年七年级下学期期中考试数学试卷(含答案)
- 2024年北京市离婚协议书范文范本电子版
- 广告设计制作服务方案
- 中职护理专业护理服务质量评价体系研究
- 第八版口腔肿瘤TNM分期更新解读
评论
0/150
提交评论