Java04数组与字符串.ppt

上传人:本田雅阁 文档编号:2145371 上传时间:2019-02-21 格式:PPT 页数:62 大小:1,014.51KB
返回 下载 相关 举报
Java04数组与字符串.ppt_第1页
第1页 / 共62页
Java04数组与字符串.ppt_第2页
第2页 / 共62页
Java04数组与字符串.ppt_第3页
第3页 / 共62页
亲,该文档总共62页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java04数组与字符串.ppt》由会员分享,可在线阅读,更多相关《Java04数组与字符串.ppt(62页珍藏版)》请在三一文库上搜索。

1、第四章 数组与字符串,信息类专业课程,西北农林科技大学,主要内容,数组 数组的应用 字符串String 可变字符序列StringBuffer 可变字符序列StringBuilder,4.1 数组,数组是相同类型的数据元素按顺序组成的一种复合数据类型,元素在数组中的相对位置由下标来指明。 例如:public static void main(String args) 其中args是String类型的数组 占用连续的内存地址 数组的静态性 一旦创建就不能修改数组的长度,数组声明,一维数组变量的声明格式有如下两种: (1)数组元素的数据类型 变量名; (2)数组元素的数据类型 变量名 ; 示例: i

2、nt c; String names; int c ; String names ;,数组的实例化,Java数组实际上也是对象,所以可通过new 关键字来创建。 示例: int c; / 声明,不必指定数组的大小 c = new int12; / 创建对象,并分配内存 上面的两个语句可以简化成一个语句: int c = new int12; 数组的长度用数组名.length,如c.length 数组元素用数组名下表表示,下标的范围是0数组长度1,如c0,初始化数组,基本数据类型的元素初始化为0值或false 非基本数据类型的元素初始化为null 可以采用循环结构初始化数组 示例: double

3、 squares; squares = new double100; for (int i=0; i squares.length; i+) squaresi = i*i; ,通过初始化语句创建数组,Java语言允许通过数组的初始化语句创建数组 示例: int n = 10, 20, 30, 40, 50 ; 上面语句创建了一个含有五个元素的数组 下标值分别为0, 1, 2, 3, 4 这时不需要运算符new,数组的内存分配示例,数组的注意事项,当通过循环遍历数组时 下标永远不要低于0 下标永远要比数组元素个数小 当数组下标出错,Java 产生 ArrayIndexOutOfBoundsExc

4、eption异常 数组一旦创建后,不能调整大小 可使用相同的引用变量来引用一个全新的数组 int a = new int6; a = new int10;,多维数组,最常用的多维数组是二维数组 int a = new int34; 二维数组可以理解成如下图示的表格,行的下标值,列的下标值,二维数组的创建(内存分配),(1)直接为每一维分配空间,如: int a = new int23; 该语句创建了一个二维数组a,其较高一维含两个元素,每个元素为由3个整型数构成的整型数组。 此时该数组的元素为: a00 a01 a02 a10 a11 a12,二维数组的创建(内存分配),(2)从最高维开始,分

5、别为每一维分配空间 二维数组的实际上是数组的数组,即创建以数组为元素的数组,意味着: 二维数组的每一行可以具有不同的列数,如: int b = new int2 ; / 最高维含2个元素,每个元素为一个整型数组 b0 = new int3; b1 = new int5; 此时该数组的元素为: b00 b01 b02 b10 b11 b12 b13 b14,二维数组元素的初始化,(1)先创建二维数组,然后通过循环直接对每个元素进行赋值,如: int matrix = new int45; for (int row=0; row matrix.length; row+) for (int col=

6、0; col matrixrow.length; col+) matrixrowcol = row + col; 注:二维数组的长度指的是二维数组的行数,用数组名.length表示,某i行的数组长度(该行的列数)用数组名i.length表示,二维数组元素的初始化,(2)在声明数组的同时进行初始化。如: int a =2,3,1,5,3,4; 声明了一个32的数组,并对每个元素赋值,即: a00 = 2 a01 = 3 a10 = 1 a11 = 5 a20 = 3 a21 = 4,例:构造杨辉三角形,class Yanghui public static void main(String ar

7、gs) int yanghui =1,1,1,1,2,1,1,3,3,1, 1,4,6,4,1; for(int i=0;iyanghui.length;i+) for(int j=0;jyanghuii.length;j+) System.out.print(“t“+yanghuiij); System.out.println(); ,4.2数组的应用,复制数组 数组的封装类Arrays 数组用作参数和返回值 main方法的数组参数获取命令行输入,复制数组,Java在System类中提供了一个特殊的方法arraycopy(),用于实现数组之间的复制 public class ArrayCop

8、y 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(); ,数组的封装类Arrays,java.util包封装了一个Arrays类,可实现数组操作的查找、复制和排序 b

9、inarySearch(int a, int fromIndex, int toIndex, int key) copyOf(int original, int newLength) copyOfRange(int original, int from, int to) sort(int a),例:数组元素排序,import java.util.Arrays; public class ArraySort public static void main(String args) int hold=10,1,8,3,6,5,4,7,2,9; Arrays.sort(hold); for(int

10、i=0;ihold.length;i+) System.out.print(holdi+“ “); ,数组用作参数和返回值,数组可以作为参数传递给方法,也可以作为方法的返回值 在调用的方法中的数组对象与调用者中的是同一个。 如果在方法中修改了任何一个数组元素,因为这个数组与方法之外的数组对象是同一个,所以方法之外的数组也将发生改变。,例:数组作为调用方法的传递参数,public class CallArray static void updateArray (int arrays) arrays3=10; public static void main(String args) int hol

11、d=0,1,2,3,4,5,6,7,8,9; updateArray(hold); for(int i=0;ihold.length;i+) System.out.print(holdi+“ “); 运行时,hold数组的内容如下: 0,1,2,10,4,5,6,7,8,9,例:数组作为方法的返回结果,public class ReturnArray static int updateArray(int arrays) for(int i=0;iarrays.length;i+) arraysi=i; return arrays; public static void main(String

12、args) int hold=9,8,7,3,5,6,4,2,1,0; hold= updateArray(hold); for(int i=0;ihold.length;i+) System.out.println(“hold“+i+“=“+holdi); ,main方法的数组参数获取命令行输入,在Java程序的主方法public static void main (String args ) 中,args 是一个字符串数组,用来接收应用程序被调用时由用户直接从键盘输的参数。 例:应用程序被调用时参数的传递 public class MyFriend public static void m

13、ain (String arg) System.out.println(arg0+ “and“+ arg1 +“are my good friends! “); 程序经编译后,采用命令java MyFriend Tom Alice来执行 程序运行结果为: Tom and Alice are my good friends!,4.3 字符串String,在Java中字符串是对象,用String类来创建 在Java中对字符串的处理,需要事先创建一个String的实例,即像其它对象一样,需要对String声明和实例化, 如:,但我们也可以用简写的形式,像基本数据类型一样创建String ,如:,St

14、ring对象,与C语言不同: 字符(char)数组不是字符串(String),String数值不必以u0000结束 String对象一旦被创建后就不能被改变,称为非可变对象,String的构造方法,String() String(byte bytes) String(byte bytes, Charset charset) String(byte bytes, int offset, int length) String(byte bytes, int offset, int length, Charset charset) String(byte bytes, int offset, int

15、 length, String charsetName) String(byte bytes, String charsetName) String(char value) String(char value, int offset, int count) String(int codePoints, int offset, int count) String(String original) String(StringBuffer buffer) String(StringBuilder builder),String对象的创建,String对象的内存分配,John,Java,World,堆

16、内存,字符串池,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来说,没有创建对象,内容

17、为null.所以无法确定其长度,比较字符串,字符类型的数据也是数值类型数据 比较字符串大小,实际上就是依次比较其所包含的字符的数值大小 小写字母与大小字母是不相同的 方法有: equals() equalsIgnoreCase() regionMatches() compareTo() compareToIgnoreCase(),equals()方法,boolean equals(Object anObject) 比较当前的字符串与指定的对象 比较结果为真当且仅当给定的参数不为空,并且具有完全相同的字符序列,应用1:String对象的比较,true false true true,(1),(2

18、),方式(1)比方式(2)效率高,“=” 比较地址 “equals“ 比较内容,equalsIgnoreCase()方法,boolean equalsIgnoreCase(String anotherString) 判别相等,但不区分大小写 例如: 在不区分大小写情况下, “hello”与“HELLO”相等,regionMatches()方法,regionMatches()方法实现子串匹配相等的比较,返回值为boolean类型。若相等则返回true,否则返回false 格式如下: boolean str1. regionMatches(boolean ignoreCase,int offset

19、,String str2,int offset,int len) 参数说明: boolean ignoreCase 若为true,则忽略大小写 int offset 确定str1的起始偏移量 String str2 str2为参与比较的另一个串 int offset 确定str2的起始偏移量 int len 确定子串长度,compareTo() 与compareToIgnoreCase(),int compareTo(String anotherString) 比较两个字符串的内容 返回: 0 : 如果字符串内容完全相同 小于0的值: 如果在比较第一个不相同字符,当前字符串的字符的值小于ano

20、therString对应的字符的值 大于0的值: 如果在比较第一个不相同字符,当前字符串的字符的值大于anotherString对应的字符的值 int compareToIgnoreCase(String str) 比较两个字符串的内容,但不区分大小写,连接字符串,“+”运算符 concat(),拷贝字符串,copyValueOf() getChars() toCharArray() substring(),搜索字符,charAt(int index) indexOf(int ch) indexOf(int ch,int fromIndex) lastIndexOf(int ch) lastI

21、ndexOf(int ch,int fromIndex),搜索子串,indexOf(String str) indexOf(String str, int fromIndex) lastIndexOf(String str) lastIndexOf(String str, int fromIndex) 返回第一次找到的时下标,如果没有找到,则返回-1,修改字符串,replace () toLowerCase() toUpperCase() trim (),String的其他方法,valueOf() 将参数的值转化成相应的字符串 replace() 替换字符串中的字符或字串 toUpperCas

22、e() toLowerCase() toCharArray( )将字符串转换成字符数组 intern()返回具有相同内容的字符串的引用,4.4 可变字符序列StringBuffer,StringBuffer类创建的串可以修改,可以对串的内容进行增、删、改操作。 StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。 StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容,StringBuffer方法

23、,public StringBuffer append(String str) public StringBuffer insert(int offset,String str) public StringBuffer delete(int start,int end) public StringBuffer deleteCharAt(int index) public StringBuffer replace(int start,int end,String str) public void setCharAt(int index,char ch) public StringBuffer r

24、everse( ) public int length( ) public int capacity( ) public void setLength(int newLength),StringBuffer对象的内存分配,堆内存,JVM,初始容量为 16 个字符 长度为0,容量为 16 个字符 长度为5,容量为 16 个字符 长度为11,StringBuffer对象的内存分配(续),新数组长度(新容量)=原容量22,编译后的字节码等同于以下源码:,应用:连接字符串操作(1),运行期连接字符串操作,方式(2)比方式(1)效率高,(1),(2),编译后的字节码等同于以下源码:,应用:连接字符串操作

25、(2),编译期连接字符串操作,方式(1)比方式(2)效率高,(1),(2),在编译期能确定字符串值时,采用 String s=“”;形式来定义,使用“+”为字符串连接的性能最佳 经常改变字符串的操作或在运行期才能确定字符串时,采用StringBuffer,如何选用String和StringBuffer?,尽量不要用new创建String对象 避免使用 “ =” 来重新构造String对象 在声明StringBuffer对象时,指定合适的容量,如StringBuffer sb=new StringBuffer(1024);,使用String和StringBuffer注意事项,可变字符序列Stri

26、ngBuilder,StringBuilder是JDK1.5版本以后出来的 它是作为一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。 该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候 如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。,思考:编写程序测试以下三种代码方式的效率高低?,(1),(2),(3),练习题,关于以下程序段,正确的说法是 1 String s1=“Hello“; 2 String s2=“Hello“; 3 if(s1= =s2) 4 System

27、.out.println(“s1= =s2“); 5 if (s1.equals(s2) 6 System.out.println(“s1.equals(s2) “); A. 行4与行6都将执行 B. 行4执行,行6不执行 C. 行6执行,行4不执行 D. 行4、行6都不执行,String s2=new String(“Hello“);,答案:A,修改后答案:C,练习题:阅读下面的程序,输出结果是什么?,class TestString public void stringReplace (String text) text = text.replace(j , i); text=text+“

28、C“; public void bufferReplace (StringBuffer text) text.setCharAt(0,i); text = text.append(“C“); public void change(char ch) ch0= Y; public static void main(String args) String str1=“java“; StringBuffer str2=new StringBuffer(“java“); char ch=j,a,v,a; TestString t=new TestString(); t.change(ch); t.str

29、ingReplace (str1); t.bufferReplace (str2); System.out.println(str1); System.out.println(str2.toString(); System.out.println (new String(ch); ,输出结果: java iavaC Yava,作业,4.1假设某班级有20个同学选修Java程序设计课程,请创建一个数组初始化所有同学的成绩,统计学生的平均成绩和各等级(优、良、中、及格和不及格)学生人数。,作业,4.2、设有3个数组内容如下: String x=“zero“,“one“,“two“, “three“

30、,four“, “five“,“six“,seven“,“eight“,“nine“ ; String y=ten“,“eleven“,“twelve“,“thirteen“,“fourteen“,“fifteen“, “sixteen“,“seventeen“,“eighteen“,“nineteen“ ; String z=“twenty“,“thirty“,“fourty“,“fifty“, “sixty“,“seventy“, “eighty“,“ninety“ ; 用Java命令行输入一个小于100的整数,将其翻成英文表示。 例如: 输入32,输出:thirty two 输入14,输出:fourteen 输入8, 输出:eight 反之,输入英文表示,输出相应的整数,作业,4.3、设有一个由20个英文单词构成的字符串数组,要求: (1)统计以字母w开头的单词数; (2)统计单词中含“or”字符串的单词数; (3)统计长度为3的单词数。,Thank You Any ?,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1