版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、java的常量1.常量的定义:在程序执行过程中,其值不可以发生改变的量。2.常量的分类:(1)字符串常量被双引号包裹起来的字符串,如"helloworld",""(这是空字符串)(2)整数常量如12(3)小数常量如12.34(4)字符常量被单引号包裹起来的单个字符,如'a'(5)布尔常量true,false打印出来也是true,false(6)空常量null3.常量数据在转换时,按int型转换二、java变量的数据类型1.java是一种强类型语言,针对每一个数据都给出了明确的数据类型。2.java变量数据类型的分类:分为基本数据类型、引用数据类型(类、接口、数组)。String属于类,不属于数据类型。3.java变量基本数据类型的分类:四类八种(1)整型:byte1个字节,short2,int4,long8。默认是int型。(2)浮点型:float4,double8。默认是double型。注意:double,float类型的变量在做算数运算时,要注意有精度丢失的问题,如果做关系运算,就不需要考虑精度丢失的问题。(3)字符型:char2,如'a'(4)布尔型:boolean14.变量的定义格式:数据类型变量名称=初始化值;5.注意事项:定义long型的数据,末尾加L或l,建议加L;定义float型的数据,末尾加F或f,建议加F。6.基本数据类型在类中的默认值byte,short,intlong的默认值为0零float,double的默认值为0.0char的默认值为'\u0000'优零boolean的默认值为false引用类型的默认值为null三、标识符identifier1.定义:就是用来给包、类、变量、方法等起名字的符号2.组成规则(1)unicode字符、数字字符、英文大小写字符、汉字(不建议使用汉字)(2)下划线_(3)美元符号$3.注意事项:(1)不能以数字开头(2)不能是java的关键字4.命名规范:(1)见名知意,最好用英文、汉语拼音(2)给类、接口命名,每个单词的首字母要大写,如MaxAge(3)给方法、变量命名,从第二个单词开始,首字母要大写,如maxAge(4)给常量命名,每个字母都大写,多个单词之间用下划线隔开,如MAX_AGE(5)给包命名,全部字母小写,多级包之间用"."隔开,一般用公司域名倒过来,如的包名可以写成com.cctv(6)给项目命名:和类或者和方法的名称一致即可。四、类型转换TypeConversion1.分类:隐式转换、强制转换2.隐式转换(1)byte,short,char--->int--->long--->float--->double(2)boolean类型不参与这样的运算(3)注意:byte,short,char在做运算时,无论遇没遇到int,都会首先提升为int,再参与运算。(4)byteb=3+4;//这里3和4都是常量,而常量会优先做运算,按int型计算编程7,再参与运算。3.强制转换(1)格式:目标类型变量名称=(目标类型)(被转换的数据);(2)注意:虽然可以做强制转换,但是不建议,因为强制转换可能有数据的丢失。只有不得不转换,而且你确定不会出现问题的时候,才可以使用强制转换,否则不要强用。五、写程序时,做数据测试,应该考虑这几种情况:(1)正确数据;(2)边界数据;(3)错误数据。六、数组1.定义:数组是存储同一种数据类型的多个变量的容器。其中每一个变量叫做元素,元素的编号叫做索引。2.格式:(1)数据类型[]数组名;//推荐用这个(2)数据类型数组名[];3.int[]arr;//定义了一个int类型的数据,数组名是arr。--推荐用这个intarr[];//定义了一个int类型的变量,变量名是arr数组。4.数组的初始化(1)数组的初始化,就是为数组开辟内存空间,并为数组中的每一个元素赋予初始值。(2)数组初始化的分类:动态初始化、静态初始化(3)动态初始化:只给出长度,由系统给出初始化值。格式:数据类型[]数组名=new数据类型[数组长度];举例:int[]arr=newint[3];左边:int:说明数组中的元素类型是int类型[]:说明这是数组arr:这是数据的名称右边:new:为数组分配内存空间int:说明数组中中的元素是int类型[]:说明这是数组3:数组长度,就是数组中的元素个数赋值:数组名[索引]=数据;获取元素的格式:数组名[索引](4)静态初始化:给出初始值,由系统决定长度。格式:数据类型[]数组名=new数据类型[]{元素1,元素2,...};简化格式:数据类型[]数组名={元素1,元素2,...};5.如果两个数组拿的是同一个堆内存的地址,那么任何一个数组对堆内存数据进行了修改,另一个访问到的也是修改过的。例子:夫妻-娃int[]arr_1=newint[3];int[]arr_2=arr_1;//把arr_1数组的地址赋值给arr_2数组,这样两个数组都指向了同一个堆内存空间。6.数组操作的常见问题(1)ArrayIndexOutOfBoundsException数组索引越界异常,因为访问了不存在的索引。(2)NullPointerException空指针异常,因为null是指不再指向堆内存的数据,而程序还要访问它。空常量null是可以复制给引用数据类型的,表示该引用不再指向堆内存的数据。(3)代码示例:int[]arr={1,2,3};System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsExceptionarr=null;System.out.println(arr[0]);//java.lang.NullPointerException7.用数据的length属性获取数组元素个数,格式:数组名.length例子:遍历数组for(inti=0;i<arr.length;i++){System.out.println(arr[i]);}例子:获取数组最值解题思路:1.找一个参照物,但是这个参照物只能是该数组中的元素,不能是外部的。2.拿数组中第一个元素作为参照物。max=arr[0];min=arr[0];3.遍历数组,从第二个元素开始,依次与参照物比较,如果元素比max大,那么久留下来做参照物。if(max<arr[i])max=arr[i];if(min>arr[i])min=arr[i];4.再比较下一个元素。最后输出结果。例子:不死神兔有一对兔子,从出生后第三个月起,每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。假如兔子都不死,问第20个月,兔子对数是多少?解题思路:先找规律规律对数第一个月1二1三2四3五5……找出的规律为:从第三个月开始,每个月的兔子对数都是前两个月兔子对数相加之和,第一个月和第二个月的兔子对数都是1。分析:1.由于数据比较多,所以我们定义数组实现。int[]arr=newint[20];2.给数据元素赋值。arr[0]=1;arr[1]=1;3.从第三个月开始,根据规律赋值。for(inti=2;i<length;i++)arr[i]=arr[i-1]+arr[i-2];8.数组常用的方法importjava.util.Arrays;Arrays.sort(arr);//可以对数组从小到大排序,只能对一维数组进行排序。System.out.println(Arrays.toString(arr));//可以把数组元素拼接成一个好看的字符串,输出:[16,13,28,56]9.二维数组(1)数组是引用数据类型,所以里面可以再放数组,叫做二维数组。(2)定义:int[][]arr;//推荐intarr[][];(3)初始化int[][]arr=newint[3][5];//3代表这个二维数组中有3个一维数组,每个一维数组里有5个元素int[][]arr={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};(4)遍历二维数组for(inti=0;i<arr.length;i++){//遍历的是二维数组里所有的一维数组for(intj=0;j<arr[i].length;j++){//遍历的是一维数组里的每一个元素System.out.print(arr[i][j]+"");}System.out.println();}10.数组的缺点:数组的长度是固定的。以后工作中用集合。面向对象1.OOP的特点:封装encapsulation,继承inheritance,多态polymorphism2.类的成员:成员变量、成员方法(1)成员变量:定义在类中、方法外的局部变量。(2)成员变量与局部变量的相同点和区别:相同点:成员变量与局部变量的定义是相同的。区别:A.在类中的位置不同。成员变量的位置在类中方法外。局部变量在方法内或者方法声明上(形式参数)。B.在内存中的位置不同。成员变量在堆内存。静态成员变量随着类的加载而加载,随着程序的结束而消失。局部变量在栈内存。C.生命周期不同。成员变量随着对象的创建而存在,随着对象的消失而消失。局部变量随着方法的调用而存在,随着方法的调用完毕而消失。D.初始化值不同。成员变量有默认值,可以不用初始化就可以说使用。局部变量没有默认值,必须先定义(即初始化)、赋值,最后使用。(3)成员方法:与方法的定义相同,区别是成员方法去掉了修饰符的static关键字。3.类的使用:就是使用该类的成员(成员变量和成员方法)。要想使用一个类的成员,就必须先拥有该类的对象,即创建对象。(1)格式:类名对象名=new类名();(2)对象访问成员:A.访问成员变量:对象名.成员变量B.访问成员方法:对象名.成员方法(...)封装1.基本概念(1)把成员变量都用private修饰,对外提供public修饰的getXxx()、setXxx()方法。(2)封装的原则:A.将不需要对外提供的东东都隐藏起来。B.把属性隐藏,提供公共方法对其访问。(3)封装的好处:增加了代码的安全性和复用性。弊端:牺牲了一些效率。但是利大于弊,因为变量是不可控的,方法是可控的。(4)方法中成员变量访问的原则:就近原则(5)访问变量:局部变量.成员变量2.this:代表所在类的对象引用,即代表当前的那个对象。谁调用的,this就代表谁。(1)如果局部变量名和成员变量名称一致,在方法中使用的时候采用的是就近原则,所以用this。(2)方法被那个对象调用,this就代表谁。(3)使用场景:就是用于解决成员变量被隐藏的问题。(用在局部变量隐藏成员变量的情况,即局部变量与成员变量重名)3.构造方法Constructor:用于给对象的数据进行初始化(1)格式:A.方法名和类名相同B.没有返回值类型,连void都不能写C.没有具体的返回值D.构造方法可以重载类名对象名=new构造方法名(...)(2)构造方法的注意事项A.如果我们没有给出构造方法,系统将给出一个默认的无参构造方法供我们使用。B.如果我们给出了构造方法,系统将不再提供构造方法供我们使用。C.构造方法也是可以重载的,一般的时候我们写构造方法写两个:空参构造方法、全参构造方法。(3)给成员变量赋值的方法A.setXxx()B.构造方法(4)构造方法的使用给属性初始化:构造方法是在创建对象的时候给属性进行初始化,只能用一次。用setXxx()方法进行初始化:当创建完对象后,再想修改属性值就需要用到setXxx()方法了。继承格式:publicclass类名extends父类{}1.构造方法不能继承。2.开发的原则:高内聚,低耦合高内聚:一个类或一个方法只完成一个功能,并且不依赖于其它的类或方法。就是自己完成某件事的能力。低耦合:修改完一个方法后,其它的方法基本不需要动代码,维护起来很方便。类与类的关系尽量减少。3.java中类的继承特点:(1)java中类只支持单继承,不支持多继承。(2)支持多层继承。4.就近原则:成员变量名称相同时,在子类方法中访问变量,(1)在方法的局部范围找,如果有就使用。(2)在子类的成员范围找,如果有就使用。(3)在父类的成员范围找,如果有就使用。(4)如果还找不到,就报错。5.this和super(1)this代表本类对象的引用。super代表父类的存储空间,也可以理解为代表父类对象的引用。(2)用法:A.访问成员变量:this.成员变量。super.成员变量B.访问构造方法:this(...)调用本类的构造方法。super(...)调用父类的构造方法C.访问成员方法:this.成员方法。super.成员方法6.java继承中构造方法的访问特点(1)子类构造方法执行前,都会先执行父类的无参构造方法。因为子类会继承父类的成员方法,父类必须先初始化好了,子类才能继承。(2)在子类的构造方法中,默认第一行有一条语句super(),即必须在构造方法的第一行。如果子类没有写super(),系统会默认加上一条。如果我们写了构造方法,系统就不会给我们提供构造方法了。问题:如果父类中没有无参构造方法,怎么办呢?回答:A.在父类中添加一个无参构造方法。(推荐)B.可以通过super去访问父类的带参构造方法。我们在写构造方法的时候,最好写上无参构造方法和全参构造方法。7.java继承中成员方法的访问特点:也是就近原则子类中方法和父类中方法的声明相同时(这叫方法的覆盖override),调用的是子类中的方法。8.重载overload:在同一个类中出现的方法名相同的情况覆盖override:子类中出现了和父类中一模一样的方法声明的情况9.方法覆盖的注意事项(1)@override注解标记一个方法,表名该方法是覆盖父类的方法(2)父类私有的方法不能被覆盖(3)子类覆盖父类方法时,访问权限不能更低private<默认修饰符friendly<protected<publicpublic:本类、别的包的类、本包的类protected:本包中的类、其他包子类中friendly:只能在本包中的类private:只能在本类中10.分析案例的时候是从子类分析到父类,写代码的时候是从父类写到子类。多态1.java多态的前提(1)有继承关系(2)有方法覆盖(不是必须的)(3)有父类引用指向子类对象Fuf=newZi();Dogdog=newDog();//我说这只狗是狗Animalani=newDog();//我说这只狗是只小动物2.多态中成员访问的特点(1)成员变量:编译看左边,运行看左边(2)成员方法:编译看左边,运行看右边3.为什么成员变量和成员方法的访问不一样呢?因为成员方法有覆盖,而成员变量没有覆盖。4.多态的缺点:父类不能访问子类特有的方法。解决办法:向下转型。多态的优点:提高了程序的扩展性。具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作。fun(Animala){...}Catc=newCat();调用:.fun(c);//等价于Animala=newCat();5.多态中的转型问题(1)A.向上转型:从子到父,父类引用指向子类对象。Animalani=newDog();B.向下转型:从父到子,父类引用转为子类对象。 注:强制转换可能会发生ClassCastException类型转换异常(2)在做向下转型之前,要先做判断if(aniinstanceofDog){Dogdog=(Dog)ani;dog.lookDoor();}instanceof左边的对象应该是右边类的父类或同类对象。6.静态成员变量:随着类的加载而加载,随着程序的消失而消失。以后会学集合、数组,假如集合、数组被static修饰了,如果你的这个集合或数组比较庞大,占用内存比较大,那么在程序结束之前,它始终会占据着内存空间。如果内存比较小的话,就会出现内存溢出异常。解决的办法:1.加内存;2.不要用static来修饰这种比较占内存的集合。final和static关键字1.final(1)final是一个关键字,表示最终的意思。可以用来修饰类、修饰变量、修饰方法。举例:绝育手术(2)final修饰类的时候:表明该类是最终类,不能被继承。(3)final修饰成员变量:表明该变量是常量,不能再次被赋值,只能赋值一次。(4)final修饰方法:表明该方法是最终方法,不能被覆盖override。2.static(1)static是一个关键字,表示静态的意思。可以用来修饰成员变量和成员方法。(2)static修饰成员的特点:A.被类的所有对象共享。其实也是判断一个成员是否应该用static修饰的条件。 B.可以通过类名直接访问。类名.static成员。推荐使用。 C.优先于对象存在。优先于所有对象加载。 D.随着类的加载而加载。(它在方法区中的静态区里)3.使用场景及原因packagecom.mystudy.constants;publicclassConstants{/*放各种常量:地址、网址、硬盘上的地址*/publicstaticfinalStringADDRESS="中国北京";//调用:Constants.ADDRESS//static修饰:是为了用类名进行访问,用到常量的时候。//final修饰:不让外界进行修改//public修饰:可以在别的类中尽心访问}4.访问权限(1)非静态的成员方法:A.能访问静态的成员变量 B.能访问非静态的成员变量 C.能访问静态的成员方法 D.能访问非静态的成员方法(2)静态的成员方法:A.能访问静态的成员变量 B.能访问静态的成员方法(3)注意事项:静态成员方法中不能出现this、super这样的关键字。愿意你:静态是随着类的加载而加载,this、super这样的关键字是随着对象的创建而存在的。(开发的原则:先进内存的东东不能访问后进内存的东东。)抽象类1.在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。2.抽象类、抽象方法都必须用abstract修饰。publicabstractvoideat();publicabstractclassAnimal{}3.抽象类的特点:(1)抽象类和抽象方法都必须用abstract来修饰。(2)抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。(3)抽象类不能实例化,不能直接创建对象,但可以通过多态来创建对象。抽象类如何实例化呢?参照多态的方式,通过子类实例化。Animalani=newCat();ani.ea();ani.sleep();(4)抽象类的子类:要么重写抽象类中的所有抽象方法,要么也是抽象类。4.抽象类的成员特点:成员变量:有成员变量,成员变量可以是变量,也可以是常量。构造方法:有构造方法。抽象类中构造方法的作用是用于子类访问父类数据的初始化。成员方法:有成员方法,成员方法可以是抽象的,也可以是非抽象的。抽象方法:限定子类必须完成某些动作,起到一个规范和统一的作用。非抽象方法:提高代码的复用性。5.思维的方式:分析:从具体到抽象实现:从抽象到具体使用:使用的是具体的类的对象。举例:老师、基础班老师、毕业班老师接口1.类或抽象类:放一些共性的东西,大家都有的东西,即“你会我也会,你有我也有。”接口:定义的是额外的扩展性的东西,不是每个人都会的。2.接口的特点:(1)定义接口使用的是interface关键字。(2)类和接口之间是实现关系,用implements关键字。classimplementsinterface(3)接口不可以创建对象,可以使用多态的形式创建对象。它连构造方法都没有。接口有没有其他的方式实例化呢?参照多态的形式使用类来实现实例化。Jumpingj=newCat();j.jump();多态的几种形式:A.具体类多态(几乎不用)B.抽象类多态C.接口多态(最常用)(4)接口的实现类一个类实现一个接口。要么重写接口中的所有抽象方法,要么这个类就是抽象类。3.接口的成员特点:成员变量:有成员变量,而且只能是常量。有默认的publicstaticfinal修饰符,即是静态常量。构造方法:没有构造方法成员方法:有成员方法,而且都是抽象的。有默认的publicabstract修饰符,即是抽象方法。4.关系区别类与类:继承关系。只能单继承,可以多层继承。类与接口:实现关系。可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。接口与接口:继承关系,可以单继承,也可以多继承。5.抽象类和接口的区别(1)成员区别:抽象类:成员变量:可以是变量,也可以是常量。构造方法:有。成员方法:可以是抽象方法,也可以是非抽象方法。接口:成员变量:只能是常量。成员方法:只能是抽象方法。(2)关系区别类与类:继承关系。只能单继承,可以多层继承。类与接口:实现关系。可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。接口与接口:继承关系,可以单继承,也可以多继承。(3)设计理念的区别抽象类:被继承,体现的是isa。抽象类中定义的是继承体系的共性功能。接口:被实现,体现的是likea。抽象中定义的是该体系的扩展功能。四种权限修饰符1.本类2.同一个包下(子类和无关类)3.不同包下(子类和无关类)3.1子类3.2无关类private1.Y默认(friendly)1.Y2.Yprotected1.Y2.Y3.1Ypublic1.Y2.y3.1Y3.2Yequals方法1.功能:比较两个对象是否相等。如果没有重写的话,比较的是两个对象的地址值。重写后,可以比较两个对象的属性值。2.==:(1)可以比较基本数据类型,比较基本数据类型的时候,比较的是基本数据类型的值是否相同。(2)可以比较引用数据类型,比较引用数据类型的时候,比较的是引用数据类型的地址是否相同。3.如果想比较引用对象的内容是否相同,重写publicbooleanequals(Objectobj){...}4.s1.equals(s2);//this=s1,哪个对象调用的equals,this就是谁。obj=s2,被调用时的参数是哪个对象,obj就是谁。5.重写equals方法业务流程:(1)地址值(2)对象是否为空null(3)是否是同一个类的对象(4)obj向下转型,开始比较各个属性值。(5)比较基本数据类型(6)比较引用数据类型:a.对象是否为null。b.值。具体代码:publicbooleanequals(Objectobj){//调用:cat.equals(cat2);//this:cat//obj:cat2if(this==obj)returntrue;//比较cat和cat2的地址是否相同。如果相同,说明它们是同一个对象,肯定相同。if(obj==null)returnfalse;//看cat2是否为null。cat肯定不为null。如果cat为null,会报NullPointerException,根本走不到这个方法里。if(getClass()!=obj.getClass())returnfalse;//看两个对象cat和cat2是不是同一个类的对象。如果不是同一个类的对象,说明不是同一个物种,直接returnfalse,没有比较的必要。Catother=(cat)obj;//把obj向下转型,为什么呢?因为下面要比较cat和cat2的属性值。如果不向下转型,还是obj的话,是不能获取cat2的属性值的。if(age!=other.age)returnfalse;//由于age属性是基本数据类型,可以直接用关系运算符比较。if(name==null){//看cat/this的name属性是否为null。这里为什么要判断name是否为null呢?如果name为null,两边比较name的属性值的时候,会报NullPointerException。if(!=null)returnfalse;//如果为null,但是不为null,说明它们不相同,直接返回false。}elseif(!name.equals())returnfalse;//比较和的值是否相同,如果不同,直接返回false。returntrue;}//theendString类1.String:代表字符串类。字符串是由多个字符组成的一串数组。字符串的本质就是一个字符数组。2.构造方法String(Stringoriginal):把字符串数据封装成字符串对象。Strings=newString("Hello");String(char[]value):把字符数组的数据封装成字符串对象。char[]chs={'H','E','L','L','O'};Strings=newString(chs);String(char[]value,intindex,intcount):把字符数组的一部分数据封装成字符串对象。Strings=newString(chs,1,2);3.最常用的方式-直接赋值:Strings="hello";4.String类创建对象的特点(1)通过构造方法创建对象。通过构造方法创建的字符串对象是在堆内存中。(2)通过直接赋值的方式创建对象。通过直接赋值的方式创建的字符串对象,是在方法区的常量池中。(推荐用这个方式)字符串的内容存储在方法区的常量池。这样做事为了方便字符串数据的复用。Strings1=newString("hello");Strings2=newString("hello");Strings3="hello";Strings4="hello";System.out.println(s1==s2);//falseSystem.out.println(s1==s3);//falseSystem.out.println(s3==s4);//true代码1.遍历字符串,即获取字符串中的每一个字符Strings="16JKM13";for(inti=0;i<s.length();i++){charch=s.charAt(i);//获取字符串s中的某个索引位置的字符串元素if(ch>='0'&&ch<='9'){//判断字符是不是数字System.out.println(ch);//比较的是ASCII码值}}//ch>='A'&&ch<='Z'大写字母//ch>='a'&&ch<='z'大写字母//ch-=('a'-'A');从小写字母变成大写字母'a'-'A'=32,'A'=65,'a'=972.字符串的拼接int[]arr={11,22,3,4,5};Strings="[";for(inti=0;i<arr.length;i++){if(i==arr.length-1){s+=arr[i];}else{s+=arr[i]+",";}}s+="]";System.out.println(s);//字符串拼接s+=...因为Stringconcat方法重载overload了3.字符串反转abc-->cbaStrings="abc";Strings_new="";//空串for(inti=s.length-1;i>=0;i--){charch=s.charAt(i);s_new+=ch;}System.out.println(s_new);StringBuilder1.StringBuilder:是一个可变的字符串类,内容是可变的,非常适合做字符串拼接操作。String:内容是固定的,字符串都是常量。2.构造方法publicStringBuilder();//创建一个空的字符串publicStringBuilder(Stringstr);//把str这个字符串转成了StringBuilder对象3.一些功能(1)添加功能:publicStringBuilderappend(任意类型);//添加数据,并返回对象本身链式编程:sb.append("hello").append("world");//反着看,这是一个方法,方法由对象调用;正着看,对象调方法,返回的是一个对象。(2)反转功能:publicStringBuilderreverse();(3)删除功能:publicStringBuilderdelete(intstart,intend);//移除此序列的子字符串中的字符4.StringBuilder和String的相互转换StringBuilder-->String:publicStringtoString();//通过toString()就可以把StringBuilder转换为StringString-->StringBuilder:publicStringBuilder(Strings);//通过构造方法就可以把String转换为StringBuilder5.练习:字符串反转思路:String-->StringBuilder-->reverse-->StringScannersc=newScanner(System.in);Strings=sc.nextLine();StringBuildersb=newStringBuilder(s);sb.reverse();Strings2=sb.toString();StringBuffer和StringBuilder:StringBuilder:线程不安全,效率高。StringBuffer:线程安全,效率低一些。====字符串的一些常用方法----字符串方法需要接收返回结果。publiccharcharAt(intindex);//返回字符串中某个索引位置的字符元素publicbooleanendWith(Stringsmall);//判断字符串是否已小字符结尾publicbooleanequals(ObjectanObject);//判断两个字符串是否相等publicbooleanequalsIgnoreCase(StringanotherString);//判断两个字符串是否相等,忽略大小写publicintindexOf(intch);//获取字符或小字符串在大字符串中的位置,不存在的话返回-1publicintlength();//返回字符中元素的个数,字符串的长度publicStringreplace(CharSequencesmall,CharSequencereplace);//把大字符串中的小字符串替换成replace,替换所有例如:Strings="11,22,33,44";Stringreplace=s.replace(",","-");System.out.println(replace);//11-22-33-44publicStringreplaceFirst(Stringsmall,Stringreplace);//把大字符串中的小字符串替换成replace,只替换第一次出现的例如:Strings="11,22,33,44";Stringreplace=s.replaceFirst(",","-");System.out.println(replace);//11-22,33,44publicString[]split(Stringsmall);//用小字符串切割大字符串例如:Strings="11,22,33,44";String[]split=s.split(",");for(inti=0;i<split.length;i++){System.out.println(split[i]);}publicbooleanstartsWith(Stringprefix);//判断大字符串是否以小字符串开头publicStringsubString(intbeginIndex);//截取字符串,从索引beginIndex开始,截取到最后例如:Strings="abcdefg";StringsubString=s.subString(3);System.out.println(subString);//defgpublicStringsubString(intbeginIndex,intendIndex);//截取字符串,从beginIndex开始,到endIndex结束,包含beginIndex,不包含endIndex例如:Strings="abcedfg";StringsubString=s.subString(1,4);System.out.println(subString);//bcdpublicchar[]toCharArray();//把字符串编程字符数组例如:Strings="abcdefg";char[]chs=s.toCharArray();for(inti=0;i<chs.length;i++){System.out.println(chs[i]);}publicStringtoLowerCase();//把字符串中的大写字母变成小写字母例如:Strings="dfkdjALSJDLJF";s=s.toLowerCase();System.out.println(s);publicStringtoUpperCase();//把字符串中的小写字母变成大写字母例如:Strings="dfkdjALSJDLJF";s=s.toUpperCase();System.out.println(s);publicstaticStringvalueOf(booleanb);//把各种类型的数据转成字符串例如:StringvalueOf=String.valueOf(234);System.out.println(valueOf);//234====Arrays类----1.Arrays类提供了对数组操作的各种方法2.常用方法publicstaticStringtoString(int[]arr);//把数组转换成字符串publicstaticvoidsort(int[]arr);//对数组进行升序排序3.Arrays的构造方法是私有的。私有构造方法是为了不让外界使用创建对象。成员都用static修饰,可以用类名直接访问。4.常用工具类的设计思想:(1)构造方法私有。(2)成员都用static修饰。Math.pow(base,n);//base的n次幂数学工具类Collections:关系集合的一些操作方法====基本类型的包装类----1.为了对基本数据类型进行更多更方便的操作,java为每一种基本数据类型提供了一个对应的引用类型。基本数据类型的包装类最常用的做法,就是做基本数据类型和字符串的相互转换。基本类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBooleanString-->char:Strings="a";charc=s.charAt(0);2.Integer类构造方法:Integer(intvalue);Integer(Strings);//s必须是数字字符串组成的,否则抛NumberFormatException直接调用对象时,调用的是对象的toString()方法。toString()方法不重写,输出的是地址值。把一个数字字符串转成一个包装类型,字符串里只能包含数字字符。3.int与String类型的相互转换Integer类的publicintintValue();//ReturnsthevalueofthisIntegerasanint.Integer类的publicstaticIntegervalueOf(Strings);//ReturnsanIntegerobjectholdingthevalueofthespecifiedString.Integer类的publicstaticIntegervalueOf(inti);//ReturnsanIntegerinstancerepresentingthespecifiedintvalue.Integer类的publicstaticStringtoString(inti);//ReturnsaStringobjectrepresentingthespecifiedinteger.Integer类的publicstaticintparseInt(Strings);//Parsesthestringargumentasasigneddecimalinteger.String类的publicstaticStringvalueOf(inti);//Returnsthestringrepresentationoftheintargument.int-->String:方法一:intnumber=100;Strings1=""+number;//比较方便,但不专业方法二:Strings2=String.valueOf(number);String-->int:方法一:String-->Integer-->intStrings="100";Integeri=newInteger(s);intx=Value();方法二:inty=Integer.parseInt(s);总结:int-->String:String::publicstaticStringvalueOf(inti);String-->int:Integer::publicstaticintparseInt(Strings);4.练习题:把字符串排序"9127463850"-->"2738465091"分析:(1)定义一个字符串对象。(2)把字符串中的数字数据存储到一个int型的数组中。A.字符串拆分成字符串数组String::publicString[]split(Stringregex);B.字符串数组转成整型数组Integer::publicstaticparseInt(Strings);(3)对int数组进行排序Arrays::publicstaticvoidsort(int[]arr);对指定的int型数组按数字升序进行排序(4)把排序后的数组中的元素进行拼接,得到一个字符串。StringBuilder-->String:StringBuilder.append(Strings);StringBuilder.toString();代码:importjava.util.Arrays;Strings="9127463850";String[]sArr=s.split("");int[]numArr=newint[sArr.length];for(inti=0;i<numArr.length;i++){numArr[i]=Integer.parseInt(sArr[i]);}Arrays.sort(numArr);StringBuildersb=newStringBuilder();for(inti=0;i<numArr.length;i++){if(i==numArr.length-1)sb.append(numArr[i]);else{sb.append(numArr[i]).append("");}}Strings2=sb.toString();System.out.println(s2);5.自动装箱和拆箱JDK5提供的(1)自动装箱:把基本数据类型转换为对应的包装类类型。Integer::publicstaticIntegervalueOf(inti);//ReturnsanIntegerinstancerepresentingthespecifiedintvalue.(2)自动拆箱:把包装类类型转换为对应的基本数据类型。Integer::publicintintValue();//ReturnsthevalueofthisIntegerasanint.Integeri=100;//自动装箱,这行代码等价于:Integeri=Integer.valueOf(100);i+=200;//i=i+200;自动拆箱,然后自动装箱。这行代码等价于:i=Integer.valueOf(Value()+200);Integeri3=null;i3+=300;//NullPointerException在使用包装类类型的新特性的时候,如果做操作,最好先判断是否是null。开发中的原则:只要是对象,在使用前就必须进行不为null的判断。====Date类和SimpleDateFormat----1.Date类:表示特定的瞬间,精确到毫秒所属的包:importjava.util.Date;构造方法:Date();//根据当前时间创建的日期对象Date(longdate);//从1970-01-0100:00:00开始计算的时间,毫秒longdate=1000(毫秒)*60(分钟)*60(小时),即1小时,因为是东八区,最后给出的是9点。用long类型是因为int类型会出现溢出。longtime=(long)1000*60*60*24*30,即一个月Dated=newDate(time);//1970-01-3108:00:002.Date对象<-->毫秒值从Date对象得到一个毫秒值:publiclonggetTime();//获取的是毫秒值,从1970-01-0100:00:00开始从一个毫秒值得到一个Date对象:方法一:publicvoidsetTime(longtime);//设置时间,给的是毫秒值方法二:构造方法Date(longtime);3.SimpleDateFormat所属的包:java.text.SimpleDateFormat功能:格式化和解析日期的具体类格式化日期-->文本,Date-->String:publicfinalStringformat(Datedate);解析文本-->日期,String-->Date:publicDateparse(Stringsource);//可能会有java.text.ParseException代码://Date-->StringDated=newDate();SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");Strings=sdf.format(d);System.out.println(s);//2019年07月10日15:37:59可以自己定义pattern,比如:HH:mm:ssyyyy-MM-ddHH:mm:ssEEE(EEE表示星期几)因为Date对象在创立时,已经给每个字符设置了属性//String-->Date把一个字符串解析为日期的时候,要注意模式字符串和给定的日期字符串的格式要匹配Stringstr="2080-08-0812:23:45";SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Dated=sdf.parse(str);//throwsParseExceptionSystem.out.println(d);//ThuAug0812:23:45CST20804.写Date工具类DateUtil把日期转换为指定格式的字符串把指定格式的字符串解析为日期importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassDateUtil{privateDateUtil(){}publicstaticStringdateToString(Datedate,Stringpattern){SimpleDateFormatsdf=newSimpleDateFormat(pattern);Strings=sdf.format(date);returns;}publicstaticDateStringToDate(Stringdata,Stringpattern)throwsParseException{SimpleDateFormatsdf=newSimpleDateFormat(pattern);Dated=sdf.parse(data);returnd;}}5.Calendar日历类所在包:java.util.CalendarCalendarcal=Calendar.getInstance();//创建Calendar的对象,表示的是当前时间intyear=cal.get(Calendar.YEAR);intmonth=cal.get(Calendar.MONTH)+1;//第一个月是0,第二个月是1intday=cal.get(Calendar.DAY_OF_MONTH);intweek=cal.get(Calendar.DAY_OF_WEEK)-1;//星期日是1,星期一是2cal.set(Calendar.YEAR,2018);//设置年intyear2=cal.get(Calendar.YEAR);//获取年//Calendar的转换功能Datedate=newDate(1000);cal.setTime(date);//可以把date表示的时间设置给cal,Date-->CalendarDatetime=cal.getTime();//用cal的获取时间的方法可以获取到date对象,Calendar-->Date====对象也可以比较大小----如果想比较两个对象的大小,可以通过实现Comparable接口,重写compareTo方法。接口,比较器:java.lang.Comparable方法:publicintcompareTo(To);调用方法:inti=pareTo(stu2);//this:stu1;o:stu2如果大于,用1表示;如果小于,用-1表示;如果相等,用0表示。类声明:publicclassStudentimplementsComparable<Student>{@OverridepublicintcompareTo(Studento){if(this.getAge()>o.getAge()){return1;}//大于elseif(this.getAge()<o.getAge()){return-1;}//小于else{return0;}//相等}}====集合----一、集合的体系结构:见截图二、Collection集合的基础知识1.所在包:java.util.Collection2.publicinterfaceCollection<E>extendsIterable<E>3.Collection是单列集合的顶层接口。它表示一组对象,这些对象也称为Collection的元素JDK不提供此接口的任何直接实现。创建Collection集合对象采用的是多态的方式。4.<E>是一种特殊的数据类型,泛型使用:在出现E的地方使用引用数据类型替换即可,如Collection<String>importjava.util.ArrayList;Collection<String>c=newArrayList<>();//JDK7的新特性Collection<String>c=newArrayList<String>();//多态形式,推荐//booleanadd(Ee);添加元素c.add("Hello");c.add("World");5.输出集合元素System.out.println(c);ArrayList重写了toString()方法6.集合中不能存放基本数据类型,如果想放基本数据,就用它对应的包装类Collection<Integer>coll2=newArrayList<>();三、Collection的成员方法1.booleanadd(Ee);//添加元素booleanadd(intindex,Ee);//在指定位置添加元素通过查看源代码,我们知道ArrayList集合的add方法返回值永远都是true。2.booleanremove(Objecto);//根据对象从集合中删除元素booleanremove(intindex);//根据索引从集合中删除元素3.voidclear();//清除集合中的元素4.booleancontains(Objecto);//判断集合中是否存在指定的元素5.booleanisEmpty();//判断集合是否为空,空true,非空size();//集合的长度,也就是集合中的元素个数四、Collection集合的遍历1.没有索引,不能用普通for2.所在的包:java.util.Iterator3.Iterator<E>iterator();//返回此Collection的元素上进行迭代的迭代器Iterator<String>it=c.iterator();//返回的是迭代器接口的实现类的对象通过集合对象调用iterator()方法,得到迭代器对象。4.IteratorEnext();//返回迭代的下一个对象,获取到下一个元素,并一道下一个,等待NoSuchElementException:没有这样的元素异常IteratorbooleanhasNext();//如果仍有元素可以迭代,则返回truewhile(it.hasNext()){Strings=xt();System.out.println(s);}5.代码importjava.util.Collection;importjava.util.ArrayList;importjava.util.Iterator;Collection<String>c=newArrayList<String>();//创建集合对象c.add("小静");//给集合中添加字符串元素c.add("大熊");c.add("康夫");Iterator<String>it=c.iterator();//通过集合对象获取到迭代器对象while(it.hasNext()){//使用迭代器对象的方法获取数据Strings=it.next();//在一次循环体中,只能调用一次it.next()System.out.println(s);}6.迭代器是集合遍历的一种方式,依赖于集合而存在。五、集合的使用步骤1.创建集合对象2.创建元素对象3.把元素添加到集合4.遍历集合(1)通过集合对象获取迭代器对象(2)通过迭代器对象的hasNext()方法判断是否有元素(3)通过迭代器对象的next()方法获取元素,并指向下一个位置====List集合----1.所属包名:java.util.List2.List有索引,可以用普通for循环。(没有索引,就不可以用普通for循环。)3.List是有序的Collection,也称为序列。4.List集合的特点:(1)有序(存储和取出元素的顺序一致)(2)存储的元素可重复5.代码importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;List<String>list=newArrayList<String>();list.add("hello");//...Iterator<String>it=list.iterator();while(it.hasNext()){Strings=it.next();System.out.println(s);}6.List集合特有的成员方法(完全是针对索引操作的)voidadd(intindex,Eelement);//在指定位置添加元素,后面的元素往后移Eremove(intindex);//删除指定位置的元素,返回被删除的元素Eget(intindex);//获取指定位置的元素Eset(intindex,Eelement);//修改指定位置的元素,返回被修改的元素7.List集合的普通for遍历(1)迭代器(2)普通for循环intsize()for(inti=0;i<list.size();i++){System.out.println(list.get(i));}8.List列表迭代器的特有功能ListIterator<E>listIterator();//返回此列表元素的列表迭代器,允许程序员按任意方向遍历列表。正向遍历方式与Iterator相同。publicinterfaceListIterator<E>extendsIterator<E>;ListIterator<String>list=list.listIterator();特有功能:Eprevious();//返回列表中的前一个元素booleanhasPrevious();//如果以逆向遍历列表,列表迭代器有多个元素,则返回true注意事项:ListIterator可以实现逆向遍历,但是要求先正向遍历,才能逆向遍历。9.ConcurrentModificationException并发修改异常的原因及解决方案产生的原因:迭代器依赖于集合而存在,在判断成功后,集合中添加了新元素,而迭代器并不知道,所以就报错了。即迭代器遍历集合中的元素的时候,不要使用集合对象去修改集合中的元素。解决方案:方案一:用列表迭代器时,迭代器遍历的时候,用迭代器修改集合中的元素。元素是跟在刚才迭代的元素后面的。方案二:用普通for循环时,集合遍历的时候,可以通过集合对象修改集合中的元素。元素是在最后添加的。(推荐此方案)方案一的代码:ListIterator<Student>it=list.listIterator();while(it.hasNext){Studentstu=it.next();if(stu.equals(stu2)){it.add(stu4);//用迭代器添加}}方案二的代码:for(inti=0;i<list.size();i++){Studentstu=list.get(i);if(stu.equals(stu2)){list.add(stu4);//用集合添加}}10.正向删除时,要调整i,i--逆向删除时,不用调整i正向删除的代码:for(inti=0;i<list.size();i++){if(list.get(i).equals("5")){list.remove(i);i--;}}逆向删除的代码:for(inti=list.size();i>=0;i--){if(list.get(i).equals("5")){list.remove(i);}}11.增强for:是for循环的一种格式:for(元素的数据类型变量名:数组名或者Collection集合对象名){使用变量名即可,这个变量名代表的就是数组或者Collection集合中的元素}例如:for(intx:arr){System.out.println(x);}好处:简化了数组和Collection集合的遍历弊端:目标不能为null在遍历前,对目标做不为null的判断:if(list!=null){for(...:list){...}}增强for其实就是用来替代迭代器的。用哪种循环?只想打印集合时,用增强for;如果有增删集合时,用普通for。====常见的数据结构----1.栈:先进后出。例如子弹夹2.队列:先进先出。例如:排毒买票3.数组:存储同一个数据类型的多个元素的容器,有索引,方便我们获取元素。特点:查询快,增删慢。在数组中添加一个元素的步骤:(1)定义一个新数组,长度是以前的数组的长度+1(2)遍历以前的数组,得到每一个元素(3)数前面的:按照以前的索引存储到新数组中。数本身:继续存储。数后面的:添加那个新元素,然后把索引+1存储到新数组中。从数组中删除一个元素的步骤:(1)定义一个新数组,长度是以前的数组的长度-1(2)遍历以前的数组,得到每一个元素。数前面的:按照以前的索引存储到新数组中。数本身:不存储。数后面的:把索引-1存储到新数组中。4.链表:由一个链子把多个节点连接起来的数据。节点:由数据和地址组成。特点:查询慢,增删快。获取链表中的元素:从头开始在链表中插入一个元素的步骤(最好自己画一个图):(1)新元素应该也是一个节点(2)把数本身的下一个元素地址用tmp存储。(3)把新元素的地址付给数本身的下一个元素地址处(4)把tmp的值赋给新元素的下一个元素地址处从链表中删除一个元素的步骤(最好自己画一个图):(1)把数本身的下一个元素地址用tmp存储(2)把tmp的值赋给数本身的前一个元素的下一个元素地址处。底层数据结构是数组结构,用ArrayList,查询快,增删慢。底层数据结构是链表结构,用LinkedList,查询慢,增删快。如果数据查询多,就选ArrayList。如果数据增删多,就选LinkedList。不知道时,选ArrayList,因为数据量少。LinkedList的使用与ArrayList的相似。====集合的工具类Collections----所属包:java.util.CollectionsArrayList<Integer>list=newArrayList<Integer>();Collections.sort(list);//按正向排序Collections.reverse(list);//反转Collections.sort(list,Collections.reverseOrder());//倒序Collection与Collections的区别:Collection是单列集合的顶层接口。Collections是集合的工具类。====Set----Set:无序、唯一、元素不可重复,使用方式与Collection一致在java.util包中,是一个接口,继承了Collection1.不包含重复元素:HashSet不保证Set的迭代顺序,特别是它不保证该顺序恒久不变2.什么时候使用?(1)要对List集合进行去重。(2)要求生成不重复的元素。例子:在[1,10]生成10个不重复的数字。代码:importjava.util.HashSet;importjava.util.Random;HashSet<Integer>set=newHashSet<Integer>();Randomrd=newRandom();while(set.size()<10){intnum=rd.nextInt(10)+1;//如果生成了相同的元素,这里是添加不了的。//只要添加不了,size是不会变的。set.add(num);}3.HashSet保证元素唯一性的原理:通过查看add方法的源代码,我们知道了天价功能的执行过程中,是进行了数据的判断的,这个判断的流程是:首先比较对象的哈希值是否相同。这个哈希值是根据对象的hashCode()计算出来的。如果哈希值不同,就直接添加到集合中。如果哈希值相同,继续执行equals()进行比较。返回的是true,说明元素重复,不添加。返回的是false,说明元素不重复,就添加。如果我们使用HashSet集合存储对象,你要想保证元素的唯一性,就必须重写(override)hashCode()和equals()方法。注:是元素重写hashCode()和equals()方法。代码:importjava.util.HashSet;//创建集合对象HashSet<String>hs=newHashSet<String>();//添加元素hs.add("Hello");//add调用的是Map.put()方法hs.add("world");//遍历集合for(Strings:hs){System.out.println(s);}Map::publicVput(Kkey,Vvalue){if(table==EMPTY_TABLE){inflateTable(threshold);}if(key==null
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宣城市中医院抑郁症针灸治疗考核
- 舟山市人民医院胃肠道超声诊断考核
- 龙岩市人民医院耳鼻喉科护理考核
- 衢州市中医院脊柱术后康复方案制定考核
- 淄博市人民医院制剂质量检验考核
- 宿迁市中医院儿童ECMO团队配合考核
- 景德镇市中医院肺动脉造影与肺动脉取栓术考核
- 淄博市中医院皮内针技术专项考核
- 绍兴市中医院食管支架植入术考核
- 淮安市人民医院精液分析质量控制考核
- 图解自然资源部《自然资源领域数据安全管理办法》
- 股东之间股权转让合同协议书(2篇)
- PLC入门课程课件
- 港口液体危化品装卸管理人员理论考试题库(浓缩500题)
- 2024年深圳市龙华建设发展集团有限公司招聘笔试冲刺题(带答案解析)
- 药师竞聘正高述职报告
- 昇兴(安徽)包装有限公司年产 18 亿只铝制两片罐项目环境影响评价报告书
- 企业电气安全事故案例分析
- 2023学年完整公开课版液压方枕器
- 固定式人字抱杆整立施工作业指导书
- 犬胃切开术的课件资料
评论
0/150
提交评论