资源预览内容
第1页 / 共62页
第2页 / 共62页
第3页 / 共62页
第4页 / 共62页
第5页 / 共62页
第6页 / 共62页
第7页 / 共62页
第8页 / 共62页
第9页 / 共62页
第10页 / 共62页
亲,该文档总共62页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学第四章第四章 数组与字符串数组与字符串信息类专业课程西北农林科技大学西北农林科技大学信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学主要内容数组数组的应用字符串String可变字符序列StringBuffer可变字符序列StringBuilder信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学4.1数组数组是相同类型的数据元素按顺序组成的一种复合数据类型,元素在数组中的相对位置由下标来指明。例如:publicstaticvoidmain(Stringargs)其中其中args是是String类型的数组类型的数组占用连续的内存地址数组的静态性一旦创建就不能修改数组的长度一旦创建就不能修改数组的长度信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学数组声明一维数组变量的声明格式有如下两种:(1)数组元素的数据类型数组元素的数据类型变量名变量名;(2)数组元素的数据类型数组元素的数据类型变量名变量名;示例:intc;Stringnames;intc;Stringnames;信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学数组的实例化Java数组实际上也是对象,所以可通过new关键字来创建。示例:intc;/声明,不必指定数组的大小c=newint12;/创建对象,并分配内存上面的两个语句可以简化成一个语句:intc=newint12;数组的长度用数组名.length,如c.length数组元素用数组名下表表示,下标的范围是0数组长度1,如c0信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学初始化数组基本数据类型的元素初始化为0值或false非基本数据类型的元素初始化为null可以采用循环结构初始化数组示例:doublesquares;squares=newdouble100;for(inti=0;isquares.length;i+)squaresi=i*i;信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学通过初始化语句创建数组Java语言允许通过数组的初始化语句创建数组示例:intn=10,20,30,40,50;上面语句创建了一个含有五个元素的数组上面语句创建了一个含有五个元素的数组下标值分别为下标值分别为0,1,2,3,4这时不需要运算符new信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学数组的内存分配示例信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学数组的注意事项当通过循环遍历数组时下标永远不要低于下标永远不要低于0下标永远要比数组元素个数小下标永远要比数组元素个数小当数组下标出错,Java产生ArrayIndexOutOfBoundsException异常数组一旦创建后,不能调整大小可使用相同的引用变量来引用一个全新的数组inta=newint6;a=newint10;信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学多维数组多维数组最常用的多维数组是二维数组inta=newint34;二维数组可以理解成如下图示的表格a00a10a20a01a11a21a02a12a22a03a13a23行的下标值行的下标值列的下标值列的下标值信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学二维数组的创建(内存分配)(1)直接为每一维分配空间,如:inta=newint23;该语句创建了一个二维数组a,其较高一维含两个元素,每个元素为由3个整型数构成的整型数组。此时该数组的元素为:a00a01a02a10a11a12信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学二维数组的创建(内存分配)(2)从最高维开始,分别为每一维分配空间二维数组的实际上是数组的数组,即创建以数组为元素的数组,意味着:二维数组的每一行可以具有不同的列数,如:intb=newint2;/最高维含2个元素,每个元素为一个整型数组b0=newint3;b1=newint5;此时该数组的元素为:b00b01b02b10b11b12b13b14信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学二维数组元素的初始化(1)先创建二维数组,然后通过循环直接对每个元素进行赋值,如:intmatrix=newint45;for(introw=0;rowmatrix.length;row+)for(intcol=0;colmatrixrow.length;col+)matrixrowcol=row+col;注:二维数组的长度指的是二维数组的行数,用数组注:二维数组的长度指的是二维数组的行数,用数组名名.length表示,某表示,某i行的数组长度(该行的列数)行的数组长度(该行的列数)用数组名用数组名i.length表示表示信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学二维数组元素的初始化(2)在声明数组的同时进行初始化。如:inta=2,3,1,5,3,4;声明了一个32的数组,并对每个元素赋值,即:a00=2a01=3a10=1a11=5a20=3a21=4信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学例:构造杨辉三角形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(); 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学4.2数组的应用复制数组数组的封装类Arrays数组用作参数和返回值main方法的数组参数获取命令行输入信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学复制数组Java在System类中提供了一个特殊的方法arraycopy(),用于实现数组之间的复制public class ArrayCopy public static void main(String args) int i; int arr1=1,2,3,4,5,6,7,8,9,10; int arr2=new int10; /把arr1中所有元素复制到arr2中,下标从0开始 System.arraycopy(arr1,0,arr2,0,arr1.length); for(i=0;iarr2.length;i+) System.out.print(arr2i+ ); System.out.println(); 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学数组的封装类Arraysjava.util包封装了一个Arrays类,可实现数组操作的查找、复制和排序binarySearch(inta,intfromIndex,inttoIndex,intkey)copyOf(intoriginal,intnewLength)copyOfRange(intoriginal,intfrom,intto)sort(inta)信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学例:数组元素排序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+);信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学数组用作参数和返回值数组可以作为参数传递给方法,也可以作为方法的返回值在调用的方法中的数组对象与调用者中的是同一个。如果在方法中修改了任何一个数组元素,因为这个数组与方法之外的数组对象是同一个,所以方法之外的数组也将发生改变。信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学例:数组作为调用方法的传递参数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信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学例:数组作为方法的返回结果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);信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学main方法的数组参数获取命令行输入在Java程序的主方法publicstaticvoidmain(Stringargs)中,args是一个字符串数组,用来接收应用程序被调用时由用户直接从键盘输的参数。例:应用程序被调用时参数的传递publicclassMyFriendpublicstaticvoidmain(Stringarg)System.out.println(arg0+and+arg1+aremygoodfriends!);程序经编译后,采用命令javaMyFriendTomAlice来执行程序运行结果为:TomandAlicearemygoodfriends!信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学4.3字符串String在Java中字符串是对象,用String类来创建在Java中对字符串的处理,需要事先创建一个String的实例,即像其它对象一样,需要对String声明和实例化,如:String name;name = new String( “Latte” );但我们也可以用简写的形式,像基但我们也可以用简写的形式,像基本数据类型一样创建本数据类型一样创建StringString ,如:,如:String name;name = “Latte”;信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String对象与C语言不同:字符(char)数组不是字符串(String),String数值不必以u0000结束String对象一旦被创建后就不能被改变,称为非可变对象信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学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)信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String对象的创建Strings1=“hello”;Strings2=“hello”;Strings3=newString(“hello”);Strings4=newString(“hello”);信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String对象的内存分配Strings1=“hello”;Strings2=“hello”;JohnJavaWorld堆内存堆内存字符串池字符串池JVMTomStrings1hellohellos2信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String对象的内存分配(续)Strings3=newString(“hello”);Strings4=newString(“hello”);JohnJavaWorld堆内存堆内存字符串池字符串池helloTomStringJVMhelloStrings3helloStrings4s1s2信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String对象的内存分配(续)s1=s1+“ world”;JohnJavaWorld堆内存堆内存字符串池字符串池helloTomStringJVMhelloStrings3helloStrings4hello worldStrings1s1s2信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String类的方法及应用字符串长度比较字符串连接字符串拷贝字符串搜索字符搜索子串修改字符串其他方法信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学字符串长度方法length()返回返回String的长度的长度与数组不同之处与数组不同之处:String不含有不含有length成员变量成员变量String name = “Sumatra”,str1 = “one”,str2 = “”,str3;对对 str3str3来说,没有创来说,没有创建对象,内容为建对象,内容为null.null.所以无法确定其长度所以无法确定其长度name.length( );str1.length( );str2.length( );str3.length( );730编译错误信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学比较字符串字符类型的数据也是数值类型数据比较字符串大小,实际上就是依次比较其所包含的字符的数值大小小写字母与大小字母是不相同的方法有:equals()equalsIgnoreCase()regionMatches()compareTo()compareToIgnoreCase()信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学equals()方法booleanequals(ObjectanObject)比较当前的字符串与指定的对象比较当前的字符串与指定的对象比较结果为真比较结果为真当且仅当给定的参数不为空,当且仅当给定的参数不为空,并且具有完全相同的字符序列并且具有完全相同的字符序列信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学应用1:String对象的比较Strings1=“hello”;Strings2=“hello”;Strings3=newString(“hello”);s1=s2s1=s3s1.equals(s2);s1.equals(s3);truefalsetruetrue(1) (2) 方式方式(1)比方式比方式(2)效率高效率高 “=” 比较地址比较地址 equals 比较内比较内容容信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学equalsIgnoreCase()方法booleanequalsIgnoreCase(StringanotherString)判别相等,但不区分大小写判别相等,但不区分大小写例如例如:在不区分大小写情况下在不区分大小写情况下,“hello”与与“HELLO”相等相等信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学regionMatches()方法regionMatches()方法实现子串匹配相等的比较,返回值为boolean类型。若相等则返回true,否则返回false格式如下:boolean str1. regionMatches(boolean ignoreCase,int offset,Stringstr2,intoffset,intlen)参数说明:booleanignoreCase若为true,则忽略大小写intoffset确定str1的起始偏移量Stringstr2str2为参与比较的另一个串intoffset确定str2的起始偏移量intlen确定子串长度信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学compareTo()与compareToIgnoreCase()intcompareTo(StringanotherString)比较两个字符串的内容比较两个字符串的内容返回返回:0:如果字符串内容完全相同如果字符串内容完全相同小于小于0的值的值:如果在比较第一个不相同字符,当前字如果在比较第一个不相同字符,当前字符串的字符的值小于符串的字符的值小于anotherString对应的字对应的字符的值符的值大于大于0的值的值:如果在比较第一个不相同字符,当前字如果在比较第一个不相同字符,当前字符串的字符的值大于符串的字符的值大于anotherString对应的字对应的字符的值符的值intcompareToIgnoreCase(Stringstr)比较两个字符串的内容,但不区分大小写比较两个字符串的内容,但不区分大小写信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学连接字符串“+”运算符concat()信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学拷贝字符串copyValueOf()getChars()toCharArray()substring()信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学搜索字符charAt(intindex)indexOf(intch)indexOf(intch,intfromIndex)lastIndexOf(intch)lastIndexOf(intch,intfromIndex)信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学搜索子串indexOf(Stringstr)indexOf(Stringstr,intfromIndex)lastIndexOf(Stringstr)lastIndexOf(Stringstr,intfromIndex)返回第一次找到的时下标,如果没有找到,则返回-1信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学修改字符串replace()toLowerCase()toUpperCase()trim()信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学String的其他方法valueOf()将参数的值转化成相应的字符串replace()替换字符串中的字符或字串toUpperCase()toLowerCase()toCharArray()将字符串转换成字符数组intern()返回具有相同内容的字符串的引用信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学4.4可变字符序列StringBufferStringBuffer类创建的串可以修改,可以对串的内容进行增、删、改操作。StringBuffer()构造一个其中不带字符的字符串缓冲区,初始容量为16个字符。StringBuffer(intcapacity)构造一个不带字符,但具有指定初始容量的字符串缓冲区。StringBuffer(Stringstr)构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学StringBuffer方法publicStringBufferappend(Stringstr)publicStringBufferinsert(intoffset,Stringstr)publicStringBufferdelete(intstart,intend)publicStringBufferdeleteCharAt(intindex)publicStringBufferreplace(intstart,intend,Stringstr)publicvoidsetCharAt(intindex,charch)publicStringBufferreverse()publicintlength()publicintcapacity()publicvoidsetLength(intnewLength)信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学StringBuffer对象的内存分配StringBuffer sb=new StringBuffer();sb.append(“hello”);sb.append(“ world”);堆内存堆内存JVMStringBuffersbhelloStringBuffersbhello worldStringBuffersb初始容量为初始容量为 16 个字符个字符 长度为长度为0 容量为容量为 16 个字符个字符 长度为长度为5 容量为容量为 16 个字符个字符 长度为长度为11信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学StringBuffer对象的内存分配(续) StringBuffer内部实现是内部实现是char数组,默认初始化数组,默认初始化长度为长度为16,每当字符串长度大于,每当字符串长度大于char数组长度时,数组长度时,JVM会构造更大的新数组,并将原先的数组内容会构造更大的新数组,并将原先的数组内容复制到新数组复制到新数组给给StringBuffer设置一个合理的初始化容量值设置一个合理的初始化容量值StringBuffer sb=new StringBuffer(1024);新数组长度新数组长度(新容量新容量)=原容量原容量22信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学编译后的字节码等同于以下源码:应用:连接字符串操作(1)String s=“hello”;s=s+“ world”;String s=“hello”;StringBuffer temp=new StringBuffer();temp.append(s);temp.append(“ world”);S=temp.toString();运行期决定连接字符串运行期决定连接字符串信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学运行期连接字符串操作String s=“hello”;s=s+“ world”;StringBuffer sb=new StringBuffer();sb.append(“hello”);sb.append(“ world”); 方式方式(2)比方式比方式(1)效率高效率高 (1) (2) 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学编译后的字节码等同于以下源码:应用:连接字符串操作(2)String s=“hello” +“ world”;String s=“hello world”;编译期决定连接字符串编译期决定连接字符串信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学编译期连接字符串操作StringBuffer sb=new StringBuffer();sb.append(“hello”);sb.append(“ world”); 方式方式(1)比方式比方式(2)效率高效率高 (1) (2) String s=“hello” +“ world”;信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学在编译期能确定字符串值时,采用Strings=“”;形式来定义,使用“+”为字符串连接的性能最佳经常改变字符串的操作或在运行期才能确定字符串时,采用StringBuffer如何选用String和StringBuffer?信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学尽量不要用new创建String对象避免使用“=”来重新构造String对象在声明StringBuffer对象时,指定合适的容量,如StringBuffersb=newStringBuffer(1024);使用String和StringBuffer注意事项信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学可变字符序列StringBuilderStringBuilder是JDK1.5版本以后出来的它是作为一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学思考思考:编写程序测试以下三种代码方式的效编写程序测试以下三种代码方式的效率高低?率高低?StringBuffer sb=new StringBuffer();for(int i=1;i=5;i+) sb.append(String.valueOf(i);String s1=sb.toString()(1) (2) String s=“1” +“2”+ “3”+ “4”+ “5”;String s;for(int i=1;i=5;i+) s+=String.valueOf(i);(3) 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学练习题关于以下程序段,正确的说法是关于以下程序段,正确的说法是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信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学练习题:阅读下面的程序,输出结果是什么?classTestStringpublicvoidstringReplace(Stringtext)text=text.replace(j,i);text=text+C;publicvoidbufferReplace(StringBuffertext)text.setCharAt(0,i);text=text.append(C);publicvoidchange(charch)ch0=Y;publicstaticvoidmain(Stringargs)Stringstr1=java;StringBufferstr2=newStringBuffer(java);charch=j,a,v,a;TestStringt=newTestString();t.change(ch);t.stringReplace(str1);t.bufferReplace(str2);System.out.println(str1);System.out.println(str2.toString();System.out.println(newString(ch);输出结果:输出结果:javaiavaCYava信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学作业4.1假设某班级有20个同学选修Java程序设计课程,请创建一个数组初始化所有同学的成绩,统计学生的平均成绩和各等级(优、良、中、及格和不及格)学生人数。信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学作业4.2、设有3个数组内容如下:Stringx=zero,one,two,three,four,five,six,seven,eight,nine;Stringy=ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen;Stringz=twenty,thirty,fourty,fifty,sixty,seventy,eighty,ninety;用Java命令行输入一个小于100的整数,将其翻成英文表示。例如:输入32,输出:thirtytwo输入14,输出:fourteen输入8,输出:eight反之,输入英文表示,输出相应的整数信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学作业4.3、设有一个由20个英文单词构成的字符串数组,要求:(1)统计以字母w开头的单词数;(2)统计单词中含“or”字符串的单词数;(3)统计长度为3的单词数。信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学Thank You Any ?
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号