版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.字符串介绍第5章数组、字符串和枚举什么是字符串字符串:字符串是字符的序列,它是组织字符的基本数据结构,从某种程度上来说有些类似于字符的数组。在Java中,字符串被当作对象来处理,是String类的实例。字符串常量使用双引号括住的一串字符,比如:Java编译器自动为每一个字符串常量生成一个String类的实例,因此可以用字符串常量直接初始化一个String对象,如:"Helloworld!"Strings="Helloworld!";创建字符串通过使用String类的构造方法来创建字符串:String共有11个构造方法。常用的几个是:例如:注意:String类是不可改变的,所以一旦创建了String对象,那它的值就无法改变了publicString(); //创建一个空的字符串publicString(Strings); //用已有字符串创建新的string(最常用)publicString(StringBufferbuf); //用StringBuffer对象的内容初始化新的StringpublicString(charvalue[]); //用已有的字符数组初始化新的stringStrings=newString("Helloworld!");字符串常用方法String类位于java.lang包中,java会默认的导入java.lang包,所以使用java.lang包的类时,不需要显示的import类,String类具有丰富的方法,其中比较常用的有:在Java中,equals()方法用于比较两个字符串的内容是否相等,而“==”用于比较两个字符串的引用是否相等。字符串比较上面的代码中,s1和s2都是直接赋值的字符串常量,它们的引用指向同一个字符串对象。s3是通过new关键字创建的新的字符串对象,它的引用指向一个新的字符串对象。当我们使用equals()方法比较s1和s2、s1和s3时,返回的结果是true,因为它们的内容都相等。当使用“==”比较s1和s2、s1和s3时,s1和s2的引用相等,所以返回true,而s1和s3的引用不相等,所以返回false。Strings1="Hello";Strings2="Hello";Strings3=newString("Hello");
System.out.println(s1.equals(s2)); //trueSystem.out.println(s1.equals(s3)); //trueSystem.out.println(s1==s2); //trueSystem.out.println(s1==s3); //false连接字符串String类提供了连接两个字符串的方法:返回string2连接string1的新字符串。也可以对字符串常量使用concat()方法,如:更常用的是使用'+'操作符来连接字符串,如:结果如下:string1.concat(string2);"我的名字是".concat("张三");"Hello,"+"world"+"!""Hello,world!"StringBuilder类和StringBuffer类String类对象的长度和内容赋值后是不能被改变的、或者被附加新的子串;尽管可以用“+”的方式把子串附加到String对象的原串中,如在例中的StringtoHexString(byte[]b)方法:publicstaticStringtoHexString(byte[]b){Stringa="[";for(inti=0;i<b.length;i++){Stringhex=Integer.toHexString(b[i]&0xFF);//保留1字节if(hex.length()==1){hex='0'+hex;}a=a+((i==0)?(hex):(","+hex));}a=a+"]";returna.toUpperCase();}程序中字符串对象a初值赋给“[”,每次执行第08行时,又会在原串的基础上附加新的子串,生成新的对象实例;这种方式能够正确运行,但是每次执行后会产生新的String对象实例,占用新的存储空间。类似这种频繁追加操作,势必在堆中产生大量的实例;如果大量使用,可能会导致堆空间紧张;此外,每次生成新的对象需要时间,也会影响运行效率;从空间和时间考虑,建议避免使用。StringBuilder类和StringBuffer类在面向对象程序设计时,最好采用能够重复使用的对象。对于串对象,Java引入两个可以重复使用的串类,StringBuilder和StringBuffer类。这两类创建的串对象后,它们的内容允许被改变,也就是说,对象可以重复修改、使用。两者的区别是:StringBuffer类是线程安全的、而StringBuilder是线程不安全的,因为线程安全是需要牺牲性能的,因此,线程安全者性能较差,线程不安全者则性能较好。所谓“线程安全”,主要体现两点:第一,在多个线程对同一个实例访问时不会相互干扰,不会产生冲突;其次,是每个线程有自己的字段,这些不会在多个线程间共享。更深入的理解将在后续多线程章节的课程介绍。StringBuilder类和StringBuffer类StringBuilder():用不带参数构建StringBuilder对象;StringBuilder(CharSequenceseq):用CharSequence作为参数构建StringBuilder对象;StringBuilder(inti):用int数据作为参数构建StringBuilder对象;StringBuilder(Stringstr):用String对象作为参数构建StringBuilder对象。StringBuilder类的方法见Java的API文档。StringBuilder类和StringBuffer类的构造方法类似。在这里仅介绍StringBuilder类的构造方法:StringBuilder类和StringBuffer类publicstaticStringtoHexString0(byte[]b){StringBuildera=newStringBuilder("[");//创建一个初值为“[”的StringBuilder对象aStringBuilderhex=newStringBuilder("");//创建一个带空串的StringBuilder对象hex
for(inti=0;i<b.length;i++){ hex.append((Integer.toHexString(b[i]&0xFF)).toUpperCase());//保留1字节,转换成大写字母if(hex.length()==1)hex.insert(0,"0");if(i==0)a.append(hex);//调用a.append()方法追加到hex对象序列的后面elsea.append(","+hex);//调用hex.append()方法追加到hex对象序列的后面hex.delete(0,hex.length());//调用hex.delete()方法把原先hex中的序列全部删除
}a.append("]");returna.toString();//由于a是StringBuilder类对象,而返回的是String类,把a中序列转换成String类}应用StringBuilder类,可以重写上述例中的StringtoHexString(byte[]b)方法,更名为toHexString0(byte[]b),仍然放在StringMethod01.Java源程序中:2.1数组的使用第5章数组、字符串和枚举什么是数组数组:数组(array)是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。什么是数组在Java中数组的下标是从零开始的,很多计算机语言的数组下标也从零开始。Java数组下标访问运算符是中括号,如intArray[0],表示访问intArray数组的第一个元素,0是第一个元素的下标。Java中的数组本身是引用数据类型,它的长度属性是length。数组:所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。Numbers[0]NumBers[1]Numbers[2]Numbers[3]……FirstElementLastElement声明数组在java中声明一个数组,可以使用下面的语法:datatype用于指定被存储在数组中的元素的类型。arrayName指定数组的名称。示例:注意:Java语言中声明数组时不能指定其长度(数组中元素的数),例如:inta[5];是错误的datatype[]arrayName;或者datatypearrayName[];inta[];int[]b;String[]c;初始化数组声明一个数组不会在内存中初始化数组。当初始化数组变量时,可以赋值给数组。数组是一个引用类型,所以需要使用new关键字来创建数组的实例。动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行int[]arr=newint[3];arr[0]=3;arr[1]=6;arr[2]=9;intarr[]=newint[]{3,6,9};//或int[]arr={3,6,9};//定义数组长度为0,数组的长度可以为0int[]a=newint[]{};int[]a={};静态初始化
:在定义数组的同时就为数组元素分配空间并赋值使用数组声明并用运算符new为之分配空间后,才可以引用数组中的每个元素数组元素的引用方式:数组名[数组元素下标]数组元素下标可以是整型常量或整型表达式。如a[3],b[i],c[6*i]数组元素下标从0开始;长度为n的数组合法下标取值范围:0—>n-1,即[0,length)每个数组都有一个属性length指明它的长度注意:数组一旦初始化,其长度是不可变的使用数组示例:声明并初始化长度为10的整型数组,遍历赋值和输出成绩。Scannerinput=newScanner(System.in);//定义长度为10的整型一维数组int[]arr=newint[10];//遍历输入成绩,索引范围0~arr.length-1for(inti=0;i<arr.length;i++){arr[i]=input.nextInt();}//遍历输出成绩,索引范围0~arr.length-1for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}总结1.一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。2.有序性:数组中的元素是有序的,通过下标访问。3.不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。数组特性:在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:总结数组可以是一维数组、二维数组或多维数组。数值数组元素的默认值为0,而引用元素的默认值为null。数组的索引从0开始,如果数组有n个元素,那么数组的索引是从0到(n-1)。数组元素可以是任何类型,包括数组类型。数组类型是从抽象基类Array派生的引用类型。数组特点:2.2数组常用算法第5章数组、字符串和枚举数组的遍历在Java中,通常使用循环结构来遍历数组。常见的循环结构包括for循环和foreach循环。使用for循环遍历数组for循环适用于已知需要遍历的次数的情况。以下是使用for循环遍历数组的示例代码:在上述代码中,通过array.length获取数组的长度,然后使用for循环遍历数组。循环变量i从0开始递增,直到i的值等于数组长度减1。for(inti=0;i<array.length;i++){//访问数组中的元素并进行相应的操作System.out.println(array[i]);}数组的遍历使用foreach循环遍历数组foreach循环适用于不需要使用索引值的情况。以下是使用foreach循环遍历数组的示例代码:在上述代码中,通过intnum:array的语法,将数组array中的每个元素赋值给变量num,然后对num进行相应的操作。for(intnum:array){//访问数组中的元素并进行相应的操作System.out.println(num);}冒泡排序从第一个元素开始,两两进行比较,将较大的数往后移,这样就将最大的数放在了最后。第二轮将第二大的数放在倒数第二个,以次类推,将元素按大小顺序排序。原理:冒泡排序练习:已知一组数:{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48},请按从小到大的顺序输出。//声明初始化数组(静态初始化)int[]arr={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//两两比较,每次得到最大值,并移动到最右边。//因为最后一次比较得出最后两个数值的位置,则进行length-1轮比较for(inti=0;i<arr.length-1;i++){for(intj=0;j<arr.length-1-i;j++){//比较当前j索引值与下一个索引(j+1)值的大小if(arr[j]>arr[j+1]){inttemp=arr[j]; //定义临时变量存储j索引的值arr[j]=arr[j+1]; //将(j+1)索引的值赋值到j索引元素arr[j+1]=temp; //将临时变量temp(存储了j索引的值)赋值到(j+1)索引元素}}}//遍历输出数组for(inti=0;i<arr.length;i++)System.out.print(arr[i]+"、");数组查找在Java编程中,数组是一种常用的数据结构,用于存储一系列相同类型的元素。当我们需要查找数组中的某个元素时,可以使用不同的算法和方法来实现。冒泡排序练习:已知一组数:{1,2,3,4,5},查找输入目标元素是否存在。//初始化数组int[]array={1,2,3,4,5};Scannerscanner=newScanner(System.in); //创建输入对象inttarget=scanner.nextInt(); //输入需要查找的目标元素//遍历数组booleanfound=false;for(inti=0;i<array.length;i++){if(array[i]==target){found=true;break;}}//返回结果if(found)System.out.println("目标元素找到了!");elseSystem.out.println("目标元素未找到!");二分查找在有序数组中寻找一个元素x,先用数组的中间元素和x比较,如果相等则返回,x小于中间元素的话就在左半区寻找,大于中间元素就在右半区寻找,此时也可以用半区的中间元素进行比较,进一步缩小寻找范围,直到找到,可以采用递归的思想。原理:二分查找利用二分查找返回元素在有序数组中的索引,没找到则返回-1。publicstaticintgetIndex(int[]arr,intnum){intminIndex=0;intmaxIndex=arr.length-1;intmidIndex=(minIndex+maxIndex)/2;while(minIndex<=maxIndex){if(num==arr[midIndex]){returnmidIndex;}elseif(num>arr[midIndex]){minIndex=midIndex+1;}else{maxIndex=midIndex-1;}midIndex=(maxIndex+minIndex)/2;}return-1;}2.3多维数组第5章数组、字符串和枚举什么是多维数组在Java中,从数组底层的运行机制来看,其实没有多维数组。多维数组可以看成以数组为元素的数组。Java中可以有二维、三维、甚至更多维数组,但是实际开发中用的非常少,最多到二维数组。多维数组:二维数组介绍二维数组的本质其实就是一维数组,只不过每个元素又是一个一维数组。在java中声明一个二位数组,可以使用下面的语法:“[][]”用于表明定义了一个二维数组,通过多个下标进行数据访问:二维数组的初始化主要分为静态初始化和动态初始化。datatype[][]arrayName;或者datatypearrayName[][];数组名[数组元素下标][数组元素下标]二维数组:二维数组介绍在创建数组时不直接指定数据元素个数,而是直接将具体的数据内容进行指定。publicclassTest{publicstaticvoidmain(String[]args){int[][]a={{1,2,3},{3,4},{3,5,6,7}};System.out.println(a[2][3]);}}静态初始化:二维数组介绍在创建数组时不直接指定数据元素个数,而是直接将具体的数据内容进行指定。importjava.util.Arrays;publicclassTest{publicstaticvoidmain(String[]args){int[][]a=newint[3][];//a[0]={1,2,5};//错误,没有声明类型就初始化a[0]=newint[]{1,2}; a[1]=newint[]{2,2}; a[2]=newint[]{2,2,3,4}; System.out.println(a[2][3]); System.out.println(Arrays.toString(a[0]));System.out.println(Arrays.toString(a[1])); System.out.println(Arrays.toString(a[2]));}}运行结果:动态初始化:二维数组介绍练习:创建一个二维数组存储两个班的成绩,每班10人,请遍历赋值和输出成绩。Scannerinput=newScanner(System.in);//定义二维数组int[][]arr=newint[2][10];//遍历输入成绩,索引范围0~arr.length-1for(inti=0;i<arr.length;i++){//得到一维数组int[]arr_1=arr[i];//遍历一维数组,索引范围0~arr_1.length-1for(intj=0;j<arr_1.length;j++){arr[i][j]=input.nextInt();}}//遍历输出成绩,索引范围0~arr.length-1for(inti=0;i<arr.length;i++){//得到一维数组int[]arr_1=arr[i];//遍历一维数组,索引范围0~arr_1.length-1for(intj=0;j<arr_1.length;j++){System.out.print(arr[i][j]+"\t");}//换行System.out.print("\n");}实现代码1实现代码2Arrays类的使用JDK中提供了一个专门用于操作数组的工具类,即Arrays类,位于java.util包中。Arrays类的使用Arrays类提供了一些列方法来操作数组,如排序、复制、比较、填充等,用户直接调用这些方法即可不需要自己编码实现,降低了开发难度。java.util.Arrays是一个与数组相关的工具类,里面提供了大量静态方法,用来事项数组常见的操作。Arrays类的使用3.枚举介绍第5章数组、字符串和枚举什么是枚举Java枚举(Enum)是一种特殊的数据类型,它是一组预定义的常量,每个常量都有一个名称和一个值。枚举类型在Java中被广泛使用,它可以用来代替常量、标志位、状态码等,使代码更加清晰、易读和易维护。在日常生活中,经常遇到一些数据,如一个星期只有7天、一年有12个月、交叉路口的信号灯只有红绿黄3中颜色等等,这些数据被称为可枚举数据。枚举:枚举的使用在Java中,可以通过关键字enum来定义枚举类型。枚举类型的定义格式如下:其中EnumName是枚举类型的名称Constant1、Constant2、Constant3等是枚举类型的常量。每个枚举常量都有一个名称和一个值,枚举常量的名称通常采用大写字母命名,多个单词之间用下划线分隔。enumEnumName{Constant1,Constant2,Constant3,...}定义枚举类型:枚举的使用例如:可以定义一个月份的Month枚举类:例如:定义一个星期的Weekday枚举类:publicenumMonth{//索引值January,February,March,April,May,June,July,August,September,October,November,December}publicenumWeekday{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;}定义枚举类型:访问枚举常量:枚举的使用在Java中,可以通过枚举类型的名称来访问枚举常量。例如,一年四个季节Season枚举,可以通过如下方式来访问枚举常量:Weekday.Monday表示Weekday枚举类型中的Monday常量。Weekdaymonday=Weekday.Monday;枚举的使用枚举类型可以定义方法,这些方法可以在枚举常量上调用。例如,可以在Weekday枚举类型中定义一个isWeekend方法来判断当前枚举常量是否为周末:在上面的例子中,通过在枚举常量后面定义方法,可以在每个枚举常量上调用这个方法。例如,可以通过Weekday.Saturday.isWeekend()来判断Saturday是否为周末。enumWeekday{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;
publicbooleanisWeekend(){returnthis==Saturday||this==Sunday;}}枚举方法:枚举的使用枚举类型也可以定义构造器,这些构造器只能在枚举常量的定义中被调用,并且只能用来初始化枚举常量的值。例如,可以在Weekday枚举类型中定义一个带参数的构造器来设置枚举常量的值:enumWeekday{Monday("星期一"),Tuesday("星期二"),Wednesday("星期三"),Thursday("星期四"),Friday("星期五"),Saturday("星期六"),Sunday("星期日");
privateStringvalue;privateWeekday(Stringvalue){this.value=value;}publicStringgetValue(){returnvalue;}}枚举构造器:枚举的使用例如,可以在Weekday枚举类型中定义一个带参数的构造器来设置枚举常量的值:在上面的例子中,通过在枚举常量后面定义构造器,可以在枚举常量的定义中为枚举常量设置值。例如,可以通过Weekday.Monday.getValue()来获取Monday的值。枚举构造器:enumWeekday{Monday("星期一"),Tuesday("星期二"),Wednesday("星期三"),Thursday("星期四"),Friday("星期五"),Saturday("星期六"),Sunday("星期日");
privateStringvalue;privateWeekday(Stringvalue){this.value=value;}publicStringgetValue(){returnvalue;}}枚举的练习练习:假设我们有一个游戏,游戏中有三个角色:战士、法师和牧师。每个角色都有自己的属性:血量、攻击力和防御力。可以使用枚举类型来表示这三个角色。枚举的练习publicenumRole{WARRIOR("战士",100,50,30), //枚举常量:WARRIOR
MAGE("法师",80,70,20), //枚举常量:MAGE
PRIEST("牧师",60,30,50); //枚举常量:PRIEST
privateStringname;
//角色名称privateinthp;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二手机器转让简单合同范本年
- 施工工程运输合同范本
- 购买二手房买卖合同范本
- 2025cc直播平台主播转公会合同
- 二手商品房买卖合同
- 水泥销售合同范本
- 石料买卖合同
- 2025续订劳动合同通知书模板
- 2025建筑企业流动资金借款合同范本版
- 广告发布投放合同
- 《新能源汽车技术》课件-第二章 动力电池
- 数字金融 远程音视频手机银行技术规范
- 2024届高考语文一轮复习:论证思路专练(含答案)
- 四年级学业指导模板
- 会议系统设备维护方案
- 少儿口才培训主持课件
- 餐饮业绩效考核表(店长、前厅领班、吧台、厨师长、后厨、服务员、收银员、库管、后勤)3
- 艺术课程标准(2022年版)
- 中国风军令状誓师大会PPT模板
- 小儿高热惊厥精品课件
- 2022年电拖实验报告伍宏淳
评论
0/150
提交评论