




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章数组与字符串,信息类专业课程,西北农林科技大学,主要内容,数组数组的应用字符串String可变字符序列StringBuffer可变字符序列StringBuilder,4.1数组,数组是相同类型的数据元素按顺序组成的一种复合数据类型,元素在数组中的相对位置由下标来指明。例如:publicstaticvoidmain(Stringargs)其中args是String类型的数组占用连续的内存地址数组的静态性一旦创建就不能修改数组的长度,数组声明,一维数组变量的声明格式有如下两种:(1)数组元素的数据类型变量名;(2)数组元素的数据类型变量名;示例:intc;Stringnames;intc;Stringnames;,数组的实例化,Java数组实际上也是对象,所以可通过new关键字来创建。示例:intc;/声明,不必指定数组的大小c=newint12;/创建对象,并分配内存上面的两个语句可以简化成一个语句:intc=newint12;数组的长度用数组名.length,如c.length数组元素用数组名下表表示,下标的范围是0数组长度1,如c0,初始化数组,基本数据类型的元素初始化为0值或false非基本数据类型的元素初始化为null可以采用循环结构初始化数组示例:doublesquares;squares=newdouble100;for(inti=0;isquares.length;i+)squaresi=i*i;,通过初始化语句创建数组,Java语言允许通过数组的初始化语句创建数组示例:intn=10,20,30,40,50;上面语句创建了一个含有五个元素的数组下标值分别为0,1,2,3,4这时不需要运算符new,数组的内存分配示例,数组的注意事项,当通过循环遍历数组时下标永远不要低于0下标永远要比数组元素个数小当数组下标出错,Java产生ArrayIndexOutOfBoundsException异常数组一旦创建后,不能调整大小可使用相同的引用变量来引用一个全新的数组inta=newint6;a=newint10;,多维数组,最常用的多维数组是二维数组inta=newint34;二维数组可以理解成如下图示的表格,行的下标值,列的下标值,二维数组的创建(内存分配),(1)直接为每一维分配空间,如:inta=newint23;该语句创建了一个二维数组a,其较高一维含两个元素,每个元素为由3个整型数构成的整型数组。此时该数组的元素为:a00a01a02a10a11a12,二维数组的创建(内存分配),(2)从最高维开始,分别为每一维分配空间二维数组的实际上是数组的数组,即创建以数组为元素的数组,意味着:二维数组的每一行可以具有不同的列数,如:intb=newint2;/最高维含2个元素,每个元素为一个整型数组b0=newint3;b1=newint5;此时该数组的元素为:b00b01b02b10b11b12b13b14,二维数组元素的初始化,(1)先创建二维数组,然后通过循环直接对每个元素进行赋值,如:intmatrix=newint45;for(introw=0;rowmatrix.length;row+)for(intcol=0;colmatrixrow.length;col+)matrixrowcol=row+col;注:二维数组的长度指的是二维数组的行数,用数组名.length表示,某i行的数组长度(该行的列数)用数组名i.length表示,二维数组元素的初始化,(2)在声明数组的同时进行初始化。如:inta=2,3,1,5,3,4;声明了一个32的数组,并对每个元素赋值,即:a00=2a01=3a10=1a11=5a20=3a21=4,例:构造杨辉三角形,classYanghuipublicstaticvoidmain(Stringargs)intyanghui=1,1,1,1,2,1,1,3,3,1,1,4,6,4,1;for(inti=0;iyanghui.length;i+)for(intj=0;jyanghuii.length;j+)System.out.print(t+yanghuiij);System.out.println();,4.2数组的应用,复制数组数组的封装类Arrays数组用作参数和返回值main方法的数组参数获取命令行输入,复制数组,Java在System类中提供了一个特殊的方法arraycopy(),用于实现数组之间的复制publicclassArrayCopypublicstaticvoidmain(Stringargs)inti;intarr1=1,2,3,4,5,6,7,8,9,10;intarr2=newint10;/把arr1中所有元素复制到arr2中,下标从0开始System.arraycopy(arr1,0,arr2,0,arr1.length);for(i=0;iarr2.length;i+)System.out.print(arr2i+);System.out.println();,数组的封装类Arrays,java.util包封装了一个Arrays类,可实现数组操作的查找、复制和排序binarySearch(inta,intfromIndex,inttoIndex,intkey)copyOf(intoriginal,intnewLength)copyOfRange(intoriginal,intfrom,intto)sort(inta),例:数组元素排序,importjava.util.Arrays;publicclassArraySortpublicstaticvoidmain(Stringargs)inthold=10,1,8,3,6,5,4,7,2,9;Arrays.sort(hold);for(inti=0;ihold.length;i+)System.out.print(holdi+);,数组用作参数和返回值,数组可以作为参数传递给方法,也可以作为方法的返回值在调用的方法中的数组对象与调用者中的是同一个。如果在方法中修改了任何一个数组元素,因为这个数组与方法之外的数组对象是同一个,所以方法之外的数组也将发生改变。,例:数组作为调用方法的传递参数,publicclassCallArraystaticvoidupdateArray(intarrays)arrays3=10;publicstaticvoidmain(Stringargs)inthold=0,1,2,3,4,5,6,7,8,9;updateArray(hold);for(inti=0;ihold.length;i+)System.out.print(holdi+);运行时,hold数组的内容如下:0,1,2,10,4,5,6,7,8,9,例:数组作为方法的返回结果,publicclassReturnArraystaticintupdateArray(intarrays)for(inti=0;iarrays.length;i+)arraysi=i;returnarrays;publicstaticvoidmain(Stringargs)inthold=9,8,7,3,5,6,4,2,1,0;hold=updateArray(hold);for(inti=0;ihold.length;i+)System.out.println(hold+i+=+holdi);,main方法的数组参数获取命令行输入,在Java程序的主方法publicstaticvoidmain(Stringargs)中,args是一个字符串数组,用来接收应用程序被调用时由用户直接从键盘输的参数。例:应用程序被调用时参数的传递publicclassMyFriendpublicstaticvoidmain(Stringarg)System.out.println(arg0+and+arg1+aremygoodfriends!);程序经编译后,采用命令javaMyFriendTomAlice来执行程序运行结果为:TomandAlicearemygoodfriends!,4.3字符串String,在Java中字符串是对象,用String类来创建在Java中对字符串的处理,需要事先创建一个String的实例,即像其它对象一样,需要对String声明和实例化,如:,但我们也可以用简写的形式,像基本数据类型一样创建String,如:,String对象,与C语言不同:字符(char)数组不是字符串(String),String数值不必以u0000结束String对象一旦被创建后就不能被改变,称为非可变对象,String的构造方法,String()String(bytebytes)String(bytebytes,Charsetcharset)String(bytebytes,intoffset,intlength)String(bytebytes,intoffset,intlength,Charsetcharset)String(bytebytes,intoffset,intlength,StringcharsetName)String(bytebytes,StringcharsetName)String(charvalue)String(charvalue,intoffset,intcount)String(intcodePoints,intoffset,intcount)String(Stringoriginal)String(StringBufferbuffer)String(StringBuilderbuilder),String对象的创建,String对象的内存分配,John,Java,World,堆内存,字符串池,JVM,String对象的内存分配(续),John,Java,World,堆内存,字符串池,hello,JVM,s1,s2,String对象的内存分配(续),John,Java,World,堆内存,字符串池,hello,JVM,hello,String,s3,hello,String,s4,s1,s2,String类的方法及应用,字符串长度比较字符串连接字符串拷贝字符串搜索字符搜索子串修改字符串其他方法,字符串长度,方法length()返回String的长度与数组不同之处:String不含有length成员变量,对str3来说,没有创建对象,内容为null.所以无法确定其长度,比较字符串,字符类型的数据也是数值类型数据比较字符串大小,实际上就是依次比较其所包含的字符的数值大小小写字母与大小字母是不相同的方法有:equals()equalsIgnoreCase()regionMatches()compareTo()compareToIgnoreCase(),equals()方法,booleanequals(ObjectanObject)比较当前的字符串与指定的对象比较结果为真当且仅当给定的参数不为空,并且具有完全相同的字符序列,应用1:String对象的比较,truefalsetruetrue,(1),(2),方式(1)比方式(2)效率高,“=”比较地址equals比较内容,equalsIgnoreCase()方法,booleanequalsIgnoreCase(StringanotherString)判别相等,但不区分大小写例如:在不区分大小写情况下,“hello”与“HELLO”相等,regionMatches()方法,regionMatches()方法实现子串匹配相等的比较,返回值为boolean类型。若相等则返回true,否则返回false格式如下:booleanstr1.regionMatches(booleanignoreCase,intoffset,Stringstr2,intoffset,intlen)参数说明:booleanignoreCase若为true,则忽略大小写intoffset确定str1的起始偏移量Stringstr2str2为参与比较的另一个串intoffset确定str2的起始偏移量intlen确定子串长度,compareTo()与compareToIgnoreCase(),intcompareTo(StringanotherString)比较两个字符串的内容返回:0:如果字符串内容完全相同小于0的值:如果在比较第一个不相同字符,当前字符串的字符的值小于anotherString对应的字符的值大于0的值:如果在比较第一个不相同字符,当前字符串的字符的值大于anotherString对应的字符的值intcompareToIgnoreCase(Stringstr)比较两个字符串的内容,但不区分大小写,连接字符串,“+”运算符concat(),拷贝字符串,copyValueOf()getChars()toCharArray()substring(),搜索字符,charAt(intindex)indexOf(intch)indexOf(intch,intfromIndex)lastIndexOf(intch)lastIndexOf(intch,intfromIndex),搜索子串,indexOf(Stringstr)indexOf(Stringstr,intfromIndex)lastIndexOf(Stringstr)lastIndexOf(Stringstr,intfromIndex)返回第一次找到的时下标,如果没有找到,则返回-1,修改字符串,replace()toLowerCase()toUpperCase()trim(),String的其他方法,valueOf()将参数的值转化成相应的字符串replace()替换字符串中的字符或字串toUpperCase()toLowerCase()toCharArray()将字符串转换成字符数组intern()返回具有相同内容的字符串的引用,4.4可变字符序列StringBuffer,StringBuffer类创建的串可以修改,可以对串的内容进行增、删、改操作。StringBuffer()构造一个其中不带字符的字符串缓冲区,初始容量为16个字符。StringBuffer(intcapacity)构造一个不带字符,但具有指定初始容量的字符串缓冲区。StringBuffer(Stringstr)构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容,StringBuffer方法,publicStringBufferappend(Stringstr)publicStringBufferinsert(intoffset,Stringstr)publicStringBufferdelete(intstart,intend)publicStringBufferdeleteCharAt(intindex)publicStringBufferreplace(intstart,intend,Stringstr)publicvoidsetCharAt(intindex,charch)publicStringBufferreverse()publicintlength()publicintcapacity()publicvoidsetLength(intnewLength),StringBuffer对象的内存分配,堆内存,JVM,初始容量为16个字符长度为0,容量为16个字符长度为5,容量为16个字符长度为11,StringBuffer对象的内存分配(续),新数组长度(新容量)=原容量22,编译后的字节码等同于以下源码:,应用:连接字符串操作(1),运行期连接字符串操作,方式(2)比方式(1)效率高,(1),(2),编译后的字节码等同于以下源码:,应用:连接字符串操作(2),编译期连接字符串操作,方式(1)比方式(2)效率高,(1),(2),在编译期能确定字符串值时,采用Strings=“”;形式来定义,使用“+”为字符串连接的性能最佳经常改变字符串的操作或在运行期才能确定字符串时,采用StringBuffer,如何选用String和StringBuffer?,尽量不要用new创建String对象避免使用“=”来重新构造String对象在声明StringBuffer对象时,指定合适的容量,如StringBuffersb=newStringBuffer(1024);,使用String和StringBuffer注意事项,可变字符序列StringBuilder,StringBuilder是JDK1.5版本以后出来的它是作为一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。,思考:编写程序测试以下三种代码方式的效率高低?,(1),(2),(3),练习题,关于以下程序段,正确的说法是1Strings1=Hello;2Strings2=Hello;3if(s1=s2)4System.out.println(s1=s2);5if(s1.equals(s2)6System.out.println(s1.equals(s2);A.行4与行6都将执行B.行4执行,行6不执行C.行6执行,行4不执行D.行4、行6都不执行,Strings2=newString(Hello);,答案:A,修改后答案:C,练习题:阅读下面的程序,输出结果是什么?,classTestStringpublicvoidstringReplace(Stringtext)text=text.replace(j,i);text=text+C;publicvoidbufferReplace(StringBuffertext)text.setCharAt(0,i);text=text.append(C)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 元旦营销策划方案(3篇)
- 高端人群保险营销方案(3篇)
- 内网安全培训课件
- 化学品上岗安全培训课件
- 5G无线资源动态分配-洞察及研究
- 创伤的救治流程
- 化学仪器室安全守则培训课件
- 七年级上册(2024) 第二单元 写作 学会记事 公开课一等奖创新教案+(共18张)
- 2025年秋部编版语文四上 语文园地七(公开课一等奖创新教案+)
- 12 在牛肚子里旅行(+公开课一等奖创新教案+备课素材)
- 中国禁毒法课件
- 浅谈机关干部身心健康
- 湖南省多测合一收费指导标准(试行)2024年版
- 企业融资培训课件
- 期货技术指标培训课件
- 项目融资合同及还款计划安排说明
- 咖啡知识培训课件
- 施工进度管理的措施
- 富时新加坡海峡时报指数历史行情(1999年08月31日-2025年3月28日)
- 换药室工作制度
- DB42∕T 1496-2019 公路边坡监测技术规程
评论
0/150
提交评论