




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章 数组与字符串,信息类专业课程,西北农林科技大学,主要内容,数组 数组的应用 字符串String 可变字符序列StringBuffer 可变字符序列StringBuilder,4.1 数组,数组是相同类型的数据元素按顺序组成的一种复合数据类型,元素在数组中的相对位置由下标来指明。 例如:public static void main(String args) 其中args是String类型的数组 占用连续的内存地址 数组的静态性 一旦创建就不能修改数组的长度,数组声明,一维数组变量的声明格式有如下两种: (1)数组元素的数据类型 变量名; (2)数组元素的数据类型 变量名 ; 示例: int 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 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 产生 ArrayIndexOutOfBoundsException异常 数组一旦创建后,不能调整大小 可使用相同的引用变量来引用一个全新的数组 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)从最高维开始,分别为每一维分配空间 二维数组的实际上是数组的数组,即创建以数组为元素的数组,意味着: 二维数组的每一行可以具有不同的列数,如: 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=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 args) 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 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(); ,数组的封装类Arrays,java.util包封装了一个Arrays类,可实现数组操作的查找、复制和排序 binarySearch(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 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 hold=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 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 main (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 ,如:,String对象,与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 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,堆内存,字符串池,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()方法,boolean equals(Object anObject) 比较当前的字符串与指定的对象 比较结果为真当且仅当给定的参数不为空,并且具有完全相同的字符序列,应用1:String对象的比较,true false true true,(1),(2),方式(1)比方式(2)效率高,“=” 比较地址 “equals“ 比较内容,equalsIgnoreCase()方法,boolean equalsIgnoreCase(String anotherString) 判别相等,但不区分大小写 例如: 在不区分大小写情况下, “hello”与“HELLO”相等,regionMatches()方法,regionMatches()方法实现子串匹配相等的比较,返回值为boolean类型。若相等则返回true,否则返回false 格式如下: boolean str1. regionMatches(boolean ignoreCase,int offset,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的值: 如果在比较第一个不相同字符,当前字符串的字符的值小于anotherString对应的字符的值 大于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) lastIndexOf(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() 替换字符串中的字符或字串 toUpperCase() toLowerCase() toCharArray( )将字符串转换成字符数组 intern()返回具有相同内容的字符串的引用,4.4 可变字符序列StringBuffer,StringBuffer类创建的串可以修改,可以对串的内容进行增、删、改操作。 StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。 StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。 StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容,StringBuffer方法,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 reverse( ) 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),编译后的字节码等同于以下源码:,应用:连接字符串操作(2),编译期连接字符串操作,方式(1)比方式(2)效率高,(1),(2),在编译期能确定字符串值时,采用 String s=“”;形式来定义,使用“+”为字符串连接的性能最佳 经常改变字符串的操作或在运行期才能确定字符串时,采用StringBuffer,如何选用String和StringBuffer?,尽量不要用new创建String对象 避免使用 “ =” 来重新构造String对象 在声明StringBuffer对象时,指定合适的容量,如StringBuffer sb=new StringBuffer(1024);,使用String和StringBuffer注意事项,可变字符序列StringBuilder,StringBuilder是JDK1.5版本以后出来的 它是作为一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。 该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候 如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。,思考:编写程序测试以下三种代码方式的效率高低?,(1),(2),(3),练习题,关于以下程序段,正确的说法是 1 String s1=“Hello“; 2 String s2=“Hello“; 3 if(s1= =s2) 4 System.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+“C“; public void bufferReplace (StringBuffer text) text.setCharAt(0,i); text = text.append(“C“); public void change(char ch) ch0= Y;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 祝福教师节的活动方案计划2025年
- 2025年幼儿园月工作方案表
- 永久占地及青苗补偿协议
- 汽车使用与维护 课件 单元5 汽车发动机舱盖与后备箱盖的使用与维护- 车身外表及内饰的维护
- TSN技术白皮书 2025介绍
- 自由落体运动教学设计
- 2025年电动手术台项目可行性研究报告
- 2025年生物组织切片机项目可行性研究报告
- 2025年琴袋项目可行性研究报告
- 2025年特效低烟机项目可行性研究报告
- 即时通讯系统建设方案
- 2025年中国人保股份有限公司招聘笔试参考题库含答案解析
- 土石方施工合同协议书
- 《nike的品牌发展史》课件
- 口腔门诊接待流程
- 2025年上半年下半年中国南水北调集团东线限公司招聘工作人员拟聘人员易考易错模拟试题(共500题)试卷后附参考答案
- 药店零售医疗器械规章制度
- 【MOOC】《概率论与数理统计》(北京科技大学)中国大学MOOC慕课答案
- DB51T 2429-2017 雨夜公路交通反光标线质量要求和检测方法
- 数字银行的监管政策与实践-洞察分析
- 消防安全管理规定模版(2篇)
评论
0/150
提交评论