




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 第四章 数组与字符串 信息类专业课程 西北农林科技大学 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 主要内容 数组 数组的应用 字符串String 可变字符序列StringBuffer 可变字符序列StringBuilder 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 4.1 数组 数组是相同类型的数据元素按顺序组成的一种复合数据 类型,元素在数组中的相对位置由下标来指明。 例如:public static void main(String args) 其中args是String类型的数组 占用连续的内存地址 数组的静态性 一旦创建就不能修改数组的长度 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 数组声明 一维数组变量的声明格式有如下两种: (1)数组元素的数据类型 变量名; (2)数组元素的数据类型 变量名 ; 示例: int c; String names; int c ; String names ; 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 数组的实例化 Java数组实际上也是对象,所以可通过new 关键字来创建。 示例: int c; / 声明,不必指定数组的大小 c = new int12; / 创建对象,并分配内存 上面的两个语句可以简化成一个语句: int c = new int12; 数组的长度用数组名.length,如c.length 数组元素用数组名下表表示,下标的范围是0数组长度1,如 c0 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 初始化数组 基本数据类型的元素初始化为0值或false 非基本数据类型的元素初始化为null 可以采用循环结构初始化数组 示例: double squares; squares = new double100; for (int i=0; i squares.length; i+) squaresi = i*i; 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 通过初始化语句创建数组 Java语言允许通过数组的初始化语句创建数组 示例: int n = 10, 20, 30, 40, 50 ; 上面语句创建了一个含有五个元素的数组 下标值分别为0, 1, 2, 3, 4 这时不需要运算符new 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 数组的内存分配示例 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 数组的注意事项 当通过循环遍历数组时 下标永远不要低于0 下标永远要比数组元素个数小 当数组下标出错,Java 产生 ArrayIndexOutOfBoundsException异常 数组一旦创建后,不能调整大小 可使用相同的引用变量来引用一个全新的数组 int a = new int6; a = new int10; 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 多维数组 最常用的多维数组是二维数组 int a = new int34; 二维数组可以理解成如下图示的表格 a 0 0 a 1 0 a 2 0 a 0 1 a 1 1 a 2 1 a 0 2 a 1 2 a 2 2 a 0 3 a 1 3 a 2 3 行的下标值 列的下标值 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 二维数组的创建(内存分配) (1)直接为每一维分配空间,如: int a = new int23; 该语句创建了一个二维数组a,其较高一维含两个元素,每个 元素为由3个整型数构成的整型数组。 此时该数组的元素为: a00 a01 a02 a10 a11 a12 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 二维数组的创建(内存分配) (2)从最高维开始,分别为每一维分配空间 二维数组的实际上是数组的数组,即创建以数组为元素的数组 ,意味着: 二维数组的每一行可以具有不同的列数,如: int b = new int2 ; / 最高维含2个元 素,每个元素为一个整型数组 b0 = new int3; b1 = new int5; 此时该数组的元素为: b00 b01 b02 b10 b11 b12 b13 b14 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 二维数组元素的初始化 (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表示 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 二维数组元素的初始化 (2)在声明数组的同时进行初始化。如: int a =2,3,1,5,3,4; 声明了一个32的数组,并对每个元素赋值,即: a00 = 2 a01 = 3 a10 = 1 a11 = 5 a20 = 3 a21 = 4 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 例:构造杨辉三角形 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(); 信息科学(信息科学( 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) 西北农林科技大学西北农林科技大学 数组的封装类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) 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 例:数组元素排序 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+“ “); 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 数组用作参数和返回值 数组可以作为参数传递给方法,也可以作为方法的返回值 在调用的方法中的数组对象与调用者中的是同一个。 如果在方法中修改了任何一个数组元素,因为这个数组与方法 之外的数组对象是同一个,所以方法之外的数组也将发生 改变。 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 例:数组作为调用方法的传递参数 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 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 例:数组作为方法的返回结果 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); 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 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! 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 4.3 字符串String 在Java中字符串是对象,用String类来创建 在Java中对字符串的处理,需要事先创建一个String的实例 ,即像其它对象一样,需要对String声明和实例化, 如: String name; name = new String( “Latte” ); 但我们也可以用简写的形式,像基 本数据类型一样创建String ,如 : String name; name = “Latte”; 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String对象 与C语言不同: 字符(char)数组不是字符串(String), String数值不必以u0000结束 String对象一旦被创建后就不能被改变,称为非可变对 象 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 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) 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String对象的创建 String s1=“hello”; String s2=“hello”; String s3=new String(“hello”); String s4=new String(“hello”); 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String对象的内存分配 String s1=“hello”; String s2=“hello”; John Java World 堆内存 字符串池 JVM Tom String s1 hellohello s2 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String对象的内存分配(续) String s3=new String(“hello”); String s4=new String(“hello”); John Java World 堆内存 字符串池 hello Tom String JVM hello String s3 hello String s4 s1 s2 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String对象的内存分配(续) s1=s1+“ world”; John Java World 堆内存 字符串池 hello Tom String JVM hello String s3 hello String s4 hello world String s1 s1 s2 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String类的方法及应用 字符串长度 比较字符串 连接字符串 拷贝字符串 搜索字符 搜索子串 修改字符串 其他方法 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 字符串长度 方法 length( ) 返回 String 的长度 与数组不同之处: String不含有 length成员变量 String name = “Sumatra”, str1 = “one”, str2 = “”, str3; 对 str3来说,没有创 建对象,内容为null. 所以无法确定其长度 name.length( ); str1.length( ); str2.length( ); str3.length( ); 7 3 0 编译错误编译错误 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 比较字符串 字符类型的数据也是数值类型数据 比较字符串大小,实际上就是依次比较其所包含的字符的数值大小 小写字母与大小字母是不相同的 方法有: equals() equalsIgnoreCase() regionMatches() compareTo() compareToIgnoreCase() 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 equals()方法 boolean equals(Object anObject) 比较当前的字符串与指定的对象 比较结果为真当且仅当给定的参数不为空 ,并且具有完全相同的字符序列 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 应用1:String对象的比较 String s1=“hello”; String s2=“hello”; String s3=new String(“hello”); s1=s2 s1=s3 s1.equals(s2); s1.equals(s3); true false true true (1) (2) 方式(1)比方式(2)效率高 “=” 比较地址 “equals“ 比较内 容 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 equalsIgnoreCase()方法 boolean equalsIgnoreCase(String anotherString) 判别相等,但不区分大小写 例如: 在不区分大小写情况下, “hello”与 “HELLO”相等 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 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 确定子串长度 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 compareTo() 与 compareToIgnoreCase() int compareTo(String anotherString) 比较两个字符串的内容 返回: 0 : 如果字符串内容完全相同 小于0的值: 如果在比较第一个不相同字符,当前字 符串的字符的值小于anotherString对应的字 符的值 大于0的值: 如果在比较第一个不相同字符,当前字 符串的字符的值大于anotherString对应的字 符的值 int compareToIgnoreCase(String str) 比较两个字符串的内容,但不区分大小写 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 连接字符串 “+”运算符 concat() 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 拷贝字符串 copyValueOf() getChars() toCharArray() substring() 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 搜索字符 charAt(int index) indexOf(int ch) indexOf(int ch,int fromIndex) lastIndexOf(int ch) lastIndexOf(int ch,int fromIndex) 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 搜索子串 indexOf(String str) indexOf(String str, int fromIndex) lastIndexOf(String str) lastIndexOf(String str, int fromIndex) 返回第一次找到的时下标,如果没有找到,则返回-1 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 修改字符串 replace () toLowerCase() toUpperCase() trim () 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 String的其他方法 valueOf() 将参数的值转化成相应的字符串 replace() 替换字符串中的字符或字串 toUpperCase() toLowerCase() toCharArray( )将字符串转换成字符数组 intern()返回具有相同内容的字符串的引用 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 4.4 可变字符序列StringBuffer StringBuffer类创建的串可以修改,可以对串 的内容进行增、删、改操作。 StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。 StringBuffer(int capacity) 构造一个不带字符,但具有指定初始容量的字符串缓冲 区。 StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字 符串内容 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 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) 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 StringBuffer对象的内存分配 StringBuffer sb=new StringBuffer(); sb.append(“hello”); sb.append(“ world”); 堆内存 JVM StringBuffer sb hello StringBuffer sb hello world StringBuffer sb 初始容量为 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) 西北农林科技大学西北农林科技大学 在编译期能确定字符串值时,采用 String s=“”;形式来定义,使用“+”为字符串连接的性能最 佳 经常改变字符串的操作或在运行期才能确定字符串时,采用 StringBuffer 如何选用String和StringBuffer? 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 尽量不要用new创建String对象 避免使用 “ =” 来重新构造String对象 在声明StringBuffer对象时,指定合适的容量,如StringBuffer sb=new StringBuffer(1024); 使用String和StringBuffer注意事项 信息科学(信息科学( INFORMATION SCIENCE) 西北农林科技大学西北农林科技大学 可变字符序列StringBuilder StringBuilder是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) 西北农林科技大学西北农林科技大学 练习题 关于以下程序段,正确的说法是 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 信息科学(信息科学( INFORMATION S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化学品氢氟酸安全培训课件
- 内网安全教育培训内容课件
- 内经选读素问痹论课件
- 内燃机车原理课件
- 内河船舶机务安全培训课件
- 七年级上册1《春》作业设计(含答案)
- 2025年秋部编版语文五上 26 我的“长生果”(公开课一等奖创新教案++备课素材)
- 化妆品安全培训课件
- 先丰安全官培训课件
- 地理学科知识与教学能力
- QA出货检验日报表
- 《婴幼儿常见病识别与应对》3.5 消化系统常见病防治与护理
- 加润滑油安全操作规程
- 萨福双脉冲气保焊说明书DIGIPLUS课件
- 高中期中考试家长会PPT课件 (共51张PPT)
- JJG 573-2003膜盒压力表
- GB/T 39634-2020宾馆节水管理规范
- GB/T 13234-2018用能单位节能量计算方法
- 营业线施工单位“四员一长”施工安全知识培训考试题库
- 紧急采购申请单
- 工程地质学:第7章 岩体结构及其稳定性
评论
0/150
提交评论