




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序设计基础初识Java第1章-初识Java.pptx第2章-数据类型和运算符.pptx第3章-流程控制.pptx第4章-方法与数组.pptx第5章-String字符串.pptx第6章-类和对象.pptx第7章-包和访问控制.pptx第8章-面向对象的基本特征.pptx第9章-抽象类和接口.pptx全套可编辑PPT课件Java
SE主要内容1认知过程2记忆
理解
应用
分析
评价
创造——基于美国学者布卢姆提出的人对事物的认知过程课程教学目标3能按理解描述Java的运行原理、跨平台、可移植等特点。能非常熟练运用Java中的基本数据类型及运算符。能非常熟练运用Java流程控制语句编写程序,分析并解决实际问题。能非常熟练运用Java数组解决实际问题。能区别什么是类、对象,能熟练创建类、对象,从项目需求分析出类的属性、方法并用代码实现。能非常熟练运用字符串API。能熟练运用Java中的四种访问权限及其修饰符。能熟练完成包的创建和使用。能按理解描述面向对象的特性。能区别什么是抽象类、什么是接口,以及它们的使用场景。初识Java主要内容41.1
Java简介1.2
Java程序的工作原理(重点、难点)1.3
Java开发环境搭建(重点)1.4第一个Java程序(重点)本章教学目标5能描述Java发展史上的重要里程碑能描述Java的主要特点能区分JavaSE、JavaEE和JavaME这组概念能描述Java源码编译执行的命令及背后的过程能区分JDK、JRE和JVM这组概念能描述Java跨平台的机制和原理能描述Java开发环境的搭建过程,区分JAVA_HOME、PATH、CLASSPATH等环境变量的作用能编写输出简单句子和图形的Java程序,并知晓其基本规则能用注释为程序添加说明知晓基本的编码风格,并在编程中遵循这些风格Java发展历程61995年5月23日,Sun公司第一次公开发布Java和HotJava浏览器。1996年1月,Sun发布了JDK1.0,它包括了两部分:JRE和JDK。1998年12月,Sun发布了JDK1.2,推出了3个平台:J2SE,J2EE和J2ME。2000年5月,发布J2SE1.3。2002年2月,发布J2SE1.4。2004年9月30日,J2SE1.5发布,成为Java语言发展史上的重要版本。2006年4月,Sun又推出了JavaSE6.0。2011年7月,JDK7.0发布。2014年3月,JDK8.0发布。2017年9月,JDK9.0发布。截止目前的最新版本是JDK15Java主要特点7Java语言是高级语言Java语言是简单的Java语言是面向对象的Java语言是分布式的Java语言是健壮的Java语言是安全的Java语言是平台无关的Java语言是可移植的Java语言是解释型的Java语言是高性能的Java语言是多线程的Java语言是动态的Java的体系8JavaSE(JavaStandardEdition)JavaEE(JavaEnterpriseEdition)JavaME(JavaMicroEdition)从源码到机器码9词汇和语法分析。填写符号表。注释处理。生成字节码文件。JDK、JRE、JVM是什么10JDK:JavaDevelopmentKitJRE:JavaRuntimeEnvironmentJVM:JavaVirtualMachineJDK、JRE、JVM是什么11字节码是什么12Java的字节码是Java虚拟机执行的一种指令格式。即时编译13JVM可判断某段字节码其是否属于使用频率较高的热点代码。如果是,就会将字节码文件转换出的本地机器码保存,以便下次直接执行机器码文件。这使得Java程序的执行效率得到很大的提高。Java跨平台原理14在不同的平台上,安装不同的Java虚拟机,这些不同的Java虚拟机屏蔽了各个不同平台的差异,从而使Java程序(字节码文件)具有平台无关性。垃圾回收机制15垃圾回收机制能自动释放不再使用的内存空间。Windows平台开发环境搭建16下载JDK。安装JDK。配置环境变量。蓝桥云课开发环境搭建17下载&安装JDK。配置环境变量。编写第一个程序18新建一个HelloWorld.java文件编写代码编写第一个程序19编译java源文件运行java程序HelloWorld详解20文件扩展名为.java。若使用public修饰class,则类名必须和文件名相同,若没有,则可以不同。main方法是程序的入口,写法是固定的。输出语句。Java中的注释21为什么要写注释。什么是注释。Java中的注释:单行注释多行注释文档注释编程风络22集成开发工具23使用集成开发工具的功能:代码编写、错误分析与提示、编译、运行、调试等。常见的集成开发工具:EclipseMyEclipseIntelliJIDEAVS
Code面试题24请说说你对Java跨平台的理解Java程序设计基础数据类型和运算符数据类型和运算符主要内容262.1标识符和关键字2.2变量和常量2.3数据类型(重点)2.4成员变量和局部变量(重点)2.5从控制台输入数据2.6运算符(重点、难点)2.7表达式本章教学目标27能描述标识符规则(合法和合理),能辨别正确或错误的标识符能为变量取符合规则、见名知意的名字能读懂编译器对误用关键字作为变量名的错误提示并修正能区分变量和常量这组概念,明确final关键字的含义能准确描述Java数据类型的分类、基本数据类型的名称和特点能准确描述Java
4种整形类型的表数范围及推理能将其他进制数据转化为十进制(手算)了解字符串的定义和基本使用能描述基本数据类型相互转换的规则能区分成员变量和局部变量这组概念能运用Scanner接收控制台各种类型的数据,并将输入数据赋予合适的变量(类型和命名)能准确描述各种运算符的作用,并能运用运算符解决实际的计算问题基本清晰运算符的优先级能推测表达式计算结果的数据类型能综合运用上述知识解决实际问题(如温度转换)标识符是什么28Java对各种变量、方法、类和包等要素命名时使用的字符序列称为标识符。标识符的规则:标识符由字母、数字、下划线_、美元符号$组成,并且首字符不能是数字。不能把Java关键字作为标识符。标识符没有长度限制。标识符对大小写敏感(在计算机领域,“对大小写敏感”就是指“会对大写或小写英文进行区分”)。哪些是合法的标识符?29lan_qiao520lzyLaoLuo-520luo
zhao
yongluoZhaoYong$YanQun$#lzy#^_^boolean标识符的命名规范30变量和方法名:第一个单词应以小写字母作为开头,后面的每个单词则都要以大写字母开头,例如stuAge、sendMessage,变量尽量用名词,方法尽量用动词。类名:每一个单词的首字母都需要大写,如果类名称中包含单词缩写,则这个缩写词的每个字母均应大写,例如XMLModule(XML是几个单词的缩写)。另外,由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。常量:通常全部使用大写字母,并且指出该常量完整的含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词,例如MAX_VALUE。包名:通常全部用小写。哪些是规范的标识符31变量和方法名:HelloWorld、你好、Print、sayHello、_maxNum类名:hello、Person、STUDENT常量:ID_COUNT、maxAge、$hiddenProperty包名:Com、LANQIAO、dao关键字是什么32Java关键字对Java编译器有特殊的意义,它们用来表示一种数据类型或者表示程序的结构,不能用作变量名、方法名、类名和包名。以及下表未包含的var什么是变量33变量被用于存储程序中的值变量的值可以被改变变量中可以存放数值、字符串、日期和对象等不同类型的数据(重点)对变量的命名要符合以下要求(重点):
首字母只能是:字母/汉字、下划线、$/¥
其余字母只能是:字母/汉字、下划线、$/¥、数字什么是变量34定义变量的核心要素是变量类型、变量名和变量值,其声明格式如下:
typevarName[=value];在使用变量时,要避免出现未赋值就使用的情况变量使用示例
intnum1=10;
intnum2;num2=20;
floatarea=123.4f;doublecube=987.654;Studentstu=newStudent();//定义一个学生对象(了解)35变量的值可以被改变,常量的值不能被改变在Java语言中,利用final关键字来定义Java常量finaldoublePI=3.141592654;常量在声明的时候,要么直接进行初始化赋值,要么通过后续讲解的构造方法赋值注意,直接书写的值如“12”,“12.13”我们称之为字面值常量,有时也简称为常量什么是常量变量都有哪些类型36各类型的特点37四种整型的特点38最大值:高位为0表示正数,其余7个位为1,十进制为127。最小值:高位为1表示负数,其余7个位为0,十进制为-128。所有的负数都是以补码的方式存储的。以一个字节的-6为例:原码:1000
0110 反码:1111
1001 补码:1111
1010四种整型的特点39两位可取的范围:00011011即22=4个四种整型的特点4012701111111-127原码:11111111反码:10000000补码:10000001计算机中常见的进制41二进制(Binary):Java中,二进制数使用0b或0B开始,如0B110表示十进制的6八进制(Octal):Java中,八进制数使用0开始,如014表示十进制的12十进制(Decimal):Java中,默认使用10进制十六进制(Hexadecimal):Java中,二进制数使用0x或0X开始,如0XA5表示十进制的165二进制转十进制421
1
0
0
1
0
1
17
6
5
4
3
2
1
027+26+23+21+20=128+64+8+2+1=203十进制转二进制43
2311……15……12……11……00……1从下往上,从左向右:10111二进制转八进制44从右向左每3位按二进制转十进制的方式转换11011101011565八进制转二进制45每个数按十进制转二进制的方式转为3位二进制,不足时补齐3位716111
001
110二进制转十六进制46从右向左每4位按二进制转十进制的方式转换110111110137D十六进制转二进制47每个数按十进制转二进制的方式转为4位二进制,不足时补齐4位71A111
0001
1010浮点类型48Java语言浮点型字面值常量默认为double型,表示float型字面值常量需要在字面值常量后面加上f或F,例如:floatfloatNum=3.14F;Java浮点类型字面值常量有以下两种表示形式。十进制形式:例如3.14,314.0,.314。科学记数法形式:例如3.14e2,3.14E2,100E-2。字符型有什么特点49字符字面值常量为用单引号括起来的单个字符。
Java字符类型使用Unicode编码,一个Unicode编码占2个字节,字符型变量可以存放一个汉字,例如:chareChar='q';charcChar='桥';Java字符型字面值常量有以下3种表示形式:用英文单引号括起来的单个字符,例如'a'、'汉'。用英文单引号括起来的十六进制代码值来表示单个字符,其格式为'\uXXXX',其中u是约定的前缀(u是Unicode的第一个字母),而后面的XXXX位是4位十六进制数,是该字符在Unicode字符集中的序号,例如'\u0061'等价于'a'。某些特殊的字符可以采用转义符‘\'来转换,转义符可以将其后面的字符转变为其他的含义,例如'\t'代表制表符,'\n'代表换行符,'\r'代表回车符等。布尔类型50Java中的布尔型(boolean)可以表示真或假,只允许取值true或false(不可以用0或非0的整数替代true或false,这点和C语言不同),例如:booleanflag=true;字符串类型51字符串不属于基本数据类型。字符串变量通过String来声明,字符串字面值常量则需要用半角双引号将内容包裹。字符串字面值常量的长度,可以是0,也可以是任意数量的。例如:Stringstr1="";Stringstr2="HelloWorld";基本数据类型的转换52容量小的类型可自动转换成容量大的数据类型,如下图所示。byte、short、char参与运算时会被自动转换为int类型。容量大的数据类型转换成容量小的数据类型时,需要加上强制转换符,但可能造成精度降低或溢出,使用时需要格外注意。有多种类型的数据混合运算时,系统首先自动地将参与运算的变量或字面值常量转换成容量最大的数据类型,然后再进行计算。成员变量53根据变量声明位置的不同,可以将变量分为成员变量和局部变量(重点)成员变量定义在类的内部、方法的外部,其作用域从变量定义位置起到类结束(了解)publicclassHelloWorld{intnum=10;//num是成员变量publicstaticvoidmain(String[]args){...}}类的成员有变量和方法,为示区分往往将它们称为成员变量和成员方法(了解)所有成员方法可共享(使用)所有的成员变量局部变量54局部变量是在方法内部(含语句块)定义的变量(包括前面说到的参数),其作用域从变量定义位置起到方法(含语句块)结束(重点)publicstaticvoidmain(String[]args){//args是局部变量intnum=10;//num是局部变量}
语句块是一对花括号“{}”包裹起来的若干代码,在语句块中也可以定义变量,也称之为局部变量从控制台输入数据55引入Scanner类:importjava.util.Scanner;创建一个输入对象:Scannerinput=newScanner(System.in);获取输入数据Java中的运算符56Java语言支持如下运算符(重点)算术运算符:+、-、*、/、%、++、--、三目运算符
关系运算符:>、<、>=、<=、==、!=
赋值运算符:=、+=、-=、*=、/=等
逻辑运算符:!、&&、||等
位运算符:~、&、|、^、>>、<<、>>>(无符号右移)算术运算符57从参与运算的因子的数量,可以将算术运算符分为以下3类。单目运算符:+(取正)、-(取负)、++(自增1)、--(自减1)。双目运算符:+、-、*、/、%(取余)。三目运算符:(表达式1)?(表达式2):(表达式3),当表达式1的结果为真时,整个运算的结果为表达式2,否则为表达式3,该运算符是Java语言唯一一个三目运算符,常被使用,需要掌握。关系运算符58关系运算符:>、<、>=、<=、==、!=关系运算符的比较结果是布尔类型,例如:booleanflag=3>2;//比较结果:true赋值运算符59赋值运算符:=、+=、-=、*=、/=等赋值运算符=和关系运算符==看起来比较类似,但含义完全不同,==用于判断两边是否相等,而=是将右边的值赋给左边。+=、-=等是扩展的赋值运算符,x+=y等价于x=x+y,程序员在实际的编程过程中,为了方便阅读,尽量不要使用这种扩展的赋值运算符。逻辑运算符60Java语言中有3种逻辑运算符,它们是逻辑非(用符号“!”表示)、逻辑与(用符号“&&”表示)和逻辑或(用符号“||”表示)逻辑非表示取反,其逻辑关系值表如下表所示
逻辑运算符61逻辑与的运算规则为:有一个运算数为假,其值为假,两个运算数都为真,其值为真。逻辑与的关系值表如下表所示逻辑运算符62逻辑或的运算规则为:有一个运算数为真,其值为真,两个运算数都为假,其值为假。逻辑或的关系值表如下表所示。位运算符63在计算机中,所有的信息都是以二进制形式存储的。可以用位运算符对整数的二进制位进行操作位运算符主要包括按位非(用符号~表示)、按位与(用符号&表示)、按位或(用符号|表示)、按位异或(用符号^表示)和移位运算符(用符号<<、>>、>>>表示)按位非表示按位取反,其关系值表如下表所示位运算符64按位与是逐位逻辑与。按位与的关系值表如下表所示位运算符65按位或是逐位逻辑或。按位或的关系值表如下表所示位运算符66按位异或是当两个运算位不同时(重点在“异”字),结果为1,否则为0。按位异或的关系值表如下表所示什么是表达式67表达式是符合一定语法规则的运算符和操作数的组合。例如:(a-b)*c–4
(x>y)&&(m<=n)思考以下表达式的值是什么68int
i
=
0;int
j
=
1;int
k
=
j+++i;i、j、k的值分别是什么?表达式5<<2==3/2的值是什么?笔试题69以下哪些是合法的变量命名()?
A.Hello-WorldB.Hello_WorldC.HelloWorld
D.2HelloWorld
E.HelloWorld2
F.$HelloWorld2以下代码的运行结果是?inta=1>0?(3<2?4:5):(6==6?7:8);以下代码的运行结果是?笔试题70以下代码的运行结果是?inti=10;System.out.print(i++);System.out.print(i++);System.out.print(i);i=10;System.out.print(++i);System.out.print(++i);System.out.print(i);笔试题71int表示的最大值和最小值分别是什么()?提示:根据数据类型所占的字节数思考。请使用程序实现以下功能某公司举办以下抽奖活动:员工按固定格式输入自己的入职日期(格式是“MMdd”如:0212就表示2月12日入职的),之后程序会自动计算此日期所表示数字的各个位数之和(如0212的各个位数之和就是0+2+1+2=5)。如果计算出来的数字能被3整除,就表示此员工中奖。Java程序设计基础流程控制流程控制主要内容733.1
if语句3.2
switch语句3.3
while/do-while循环3.4
for循环3.5跳转语句3.6
debug本章教学目标74能理解并根据业务需求编写if语句能说出if/if-else/if-else
if的区别和使用场景能理解并根据业务需求编写switch语句能说出if语句和switch语句的区别能理解并根据业务需求编写while语句能说出while/do-while的区别和使用场景能熟悉使用for循环能理解双重for循环的执行过程和步骤能使用debug调试程序为什么要用if语句75默认情况下,Java代码是由上向下执行所有语句,但在某些情况下,我们需要根据业务情况执行不同的代码,这个时候就需要用到if语句。例如用户登录的时的流程图:if的基本形式76if语句共有三种形式。第一种形式:
if(表达式){
代码块
}if的基本形式77代码块中只有一条语句时可简写为:
if(表达式)
一条语句if的第二种形式78第二种形式:
if(表达式){
代码块A
}else{
代码块B }if的第三种形式79第三种形式:
if(表达式1){
代码块A
}elseif(表达式2){
代码块B
}elseif(表达式3){
代码块C
…
}else{
代码块X
}if的第三种形式80成绩等级查询:>100:输入有误85-100:优秀70-84:良好60-69:合格<60:不合格嵌套的if语句81形式如下:
if(表达式1){
if(表达式2){
代码块A
}else{
代码块B
}
}else{
代码块C
}switch语句82switch语句的语法形式如下:
switch(表达式){
case常量1:
代码块A;
break;
case常量2:
代码块B;
break;
…
default:
代码块X;
break;
}表达式支持的类型:byte、short、int、char、String、枚举default和break语句不是必须的。为什么需要循环语句83循环语句可以轻松高效的完成有规律或重复性的功能。例如输出1-100、计算1-100的总和、输出如下图形或内容:
老罗真帅!
罗真帅!
真帅!
帅!
!while语句84while循环的语法形式如下:
while(循环条件){
循环代码块
}do-while语句85do-while循环的语法形式如下:
do{
循环代码块
}while(循环条件);do-while中循环代码块一定会执行至少一次for循环86for循环的语法形式如下:
for(表达式1;表达式2;表达式3){
循环代码块
}for循环的重点在于其3个表达式,其中:表达式1通常是赋值语句,一般是循环语句的初始部分,为循环参数赋初值,表达式1可以省略。表达式2通常是条件语句,即循环条件,当该条件满足时,进入循环,不满足则跳出循环。表达式2也可以省略,但省略后就没有了循环判断条件,也就形成了死循环。表达式3通常也是赋值语句,属于循环结构的迭代部分,当一次循环代码块执行完毕以后,程序执行表达式3,然后再去判断表达式2的循环条件是否满足。表达式3通常用来更改循环参数的值。表达式3也可以省略,如果省略,通常需要在循环代码块中添加修改循环参数的语句。for循环87for循环执行流程如下图:
嵌套的循环语句88for循环的语法形式如下:
for(表达式1;表达式2;表达式3){
for(表达式4;表达式5;表达式6){
循环代码块
}
}嵌套的循环语句在外层for循环每一次循环都会将内层for全部循环一次。跳转语句89在介绍switch语句的时候,首次接触了break语句,其作用是跳出switch代码块,执行switch语句后面的代码。在介绍双重for循环时,用到了continue语句,continue语句的主要作用为跳出当次循环,继续执行下一次循环。其中break、continue以及后面要学的return语句,都是让程序从一部分跳转到另一部分,习惯上都称为跳转语句。在循环体内,break语句和continue语句的区别在于:使用break语句是跳出循环进而执行循环之后的语句(即结束当前的循环代码),而continue语句是跳过本次循环继续执行下一次循环(即跳过本次循环)。在企业面试的时候,这个问题经常被问到,务必掌握。debug90debug不是自动找出程序的bug,而是用于查看程序执行的过程。Java程序设计基础方法与数组方法与数组主要内容924.1Java方法(重点)4.2一维数组(重点)4.3简单的排序算法(重点、难点)4.4二维数组本章教学目标93能理解int型数组的内存演变过程能理解String型数组的内存演变过程能准确的使用递归方法解决常见问题能理解冒泡排序、插入排序和快速排序的算法逻辑能准确的编写冒泡排序、插入排序和快速排序的实现代码能区分单向扫描法和双向扫描法两种方式的快速排序能理解二维数组的存储结构能理解二维数组的存储结构能准确的为二维数组元素赋值、遍历二维数组元素能理解int型数组的内存演变过程能理解String型数组的内存演变过程能准确的使用递归方法解决常见问题能理解冒泡排序、插入排序和快速排序的算法逻辑能准确的编写冒泡排序、插入排序和快速排序的实现代码能区分单向扫描法和双向扫描法两种方式的快速排序能准确的为二维数组元素赋值、遍历二维数组元素什么是Java方法94方法是Java中一个命名的代码块,我们一直在使用的main就是一个方法方法可以提高代码的复用度,减少重复方法可以使程序结构更加清晰Java方法声明的语法形式如下(重点)
[修饰符]返回值类型方法名([形参列表]){方法体}大括号前面的内容称为方法头,大括号中的内容称为方法体方法声明后如何调用95本节介绍类内部方法的调用在类内部调用方法,只需给出方法名以及方法的实际参数列表(实参列表的数据类型必须与形参列表一致或可以自动转换成形参列表的格式),如下intx=returnAdd(3+5);drawStar(8);使用方法调用的形式,代码结构清晰,方法声明可以被复用JDK本身也提供了很多的方法,我们也一直都在使用。例如,System.out.println()就是在调用JDK提供的方法向向控制台输出,nextInt()方法(Scanner类)从控制台获取用户输入的整数等方法声明里的元素:修饰符和返回值类型96修饰符:用来规定方法的可见范围等特征例如,我们一直在使用的main方法,其中的publicstatic就是修饰符,public表示这个方法的可见范围,static表示main方法是一个静态方法返回值类型:表示该方法返回什么类型的值特殊的,如果方法无需返回值,这时需要用void表示一旦一个方法需要返回值时,那么方法体中就必须使用return语句返回此类型的值方法声明里的元素:修饰符和返回值类型97示例publicvoiddrawCircular()//该方法的返回值为空{...}publicintreturnInt(){//该方法返回值为int类型
intx=10;
...
returnx;}一个方法只能有一个返回值,因此也只能有一个返回值类型如果逻辑上确实需要返回多个值,则可以将需要返回的“多个值”先转换为一个数组或一个对象,然后再返回转换后的这“一个值”方法声明里的元素:方法名和形参列表98示例publicintreturnAdd(intx,inty){//x、y是形参returnx+y;}//以下是方法调用,后续讲解;这里仅用于区分形参和实参publicinttest(){
returnAdd(1,2);
//1、2是实参}一个特殊的方法(递归)99递归调用是指一个方法在它的方法体内调用它自身Java语言允许方法的递归调用,在递归调用中,主调方法同时也是被调方法。执行递归方法将反复调用其自身,每调用一次就再进入一次本方法递归调用最容易出现的问题是,如果递归调用没有退出的条件,则递归方法将无休止地调用其自身,这显然是不正确的。为了防止递归调用无休止地进行,必须在方法内有终止递归调用的手段。通常的做法就是增加条件判断,满足某条件后就不再进行递归调用,然后逐层返回一个特殊的方法(递归)100示例:使用递归调用计算整数n的阶乘//求n的阶乘的方法longfactorial(intn){if(n==1){//判断条件,一旦满足就不再递归,逐层返回return1;}longsum=factorial(n-1);//递归调用returnsum*n;//逐层返回求阶乘}什么是数组101如果一个系统中存储的是一个Java工程师信息,假设这个系统需要存储100个Java工程师信息,如何便捷的存储这些信息?使用数组Java提供了一种称为数组的数据类型,数组不是基本数据类型,而是引用数据类型数组是把相同类型的多个变量按一定顺序组织起来,这些按序排列的同类型数据元素的集合称为数组数组中的元素在内存中是连续存储的数组中的数据元素既可以是基本类型,也可以是引用类型使用数组的三个步骤(声明、创建和赋值)102使用数组时,需要声明、创建、赋值并使用三个步骤声明数组的语法形式如下,推荐使用前一种
数据类型[]数组名;或数据类型数组名[];声明数组就是告诉内存,该数组中元素是什么类型的,如下intengNo[];double[]engSalary;String[]engName;//String字符串是引用类型,engName数组里存放的是引用类型元素必须注意,Java语言中声明数组的时候不可以指定数组长度,例如intengNo[100]是非法的使用数组的三个步骤(声明、创建和赋值)103创建数组,就是要为数组分配内存空间,不分配内存是不能存放数组元素的,创建数组就是在内存中划分出几个连续的空间用于依次存储数组中的数据元素,其语法形式如下
数组名=new数据类型[数组长度];也可以把数组声明和数组创建合并,其语法形式为:
数据类型[]数组名=new数据类型[数组长度];其中数组长度就是数组中存放的元素个数,必须是正整数,如下int[]engNo=newint[5];String[]engName=newString[5];使用数组的三个步骤(声明、创建和赋值)104赋值并使用数组。在使用数组时,主要通过下标来访问数组元素给数组赋值的语法形式如下
数组名[数组下标]=数值;数组下标从0开始编号,数组名[0]代表数组中第1个元素,数组名[1]代表数组中第2个元素...数组下标的最大值为数组长度减1,如果下标值超过最大值会出现数组下标越界问题,如下engNo[0]=1001;engNo[1]=1002;`engName[4]="张三";engName[5]="李四";//错误,数组的最大长度是5,因此最后一个数组元素是engName[4]一维数组的静态初始化105本节介绍一维数组的静态初始化,即在声明、创建的时候同时直接为元素赋值int[]engNo=newint[]{1001,1002,1003,1004,1005};String[]engName=newString[]{"柳海龙","孙传杰","孙悦"};甚至可以直接写成:int[]engNo={1001,1002,1003,1004,1005};String[]engName={"柳海龙","孙传杰","孙悦"};静态初始化适用于一开始就知道数组内容的情况数组的内存结构106数组不属于基本数据类型(虽然其内部存储的可能是基本数据类型),只能是引用数据类型。因此语句int[]engNo=newint[]{1001,1002,1003,1004,1005};中,数组本身是在堆内存中开辟的空间,该空间的地址存储在栈内存中并命名为engNo,如图int型数组的内存演变过程107声明,int[]engNo;在栈内存中分配1个空间命名为engNo,用于存放整型数组的地址(现在这个地址还不存在,默认是null)创建,int[]engNo=newint[5];在堆内存中分配5个连续空间,并把空间地址赋给engNo,使engNo指向这5个连续的内存空间,这5个空间里存放的默认初始值为0(整数的默认值),如图所示int型数组的内存演变过程108赋值,engNo[0]=1001;将整数1001放到engNo数组的第1个元素空间里,如图所示int型数组的内存演变过程109赋值,engNo[1]=1002;将整数1002放到engNo数组的第2个元素空间里,如图所示String型数组的内存演变过程110引用的名称实际代表的是存放数据的地址。因此,如果数组中的元素是String类型,那么数组元素存放的就是String类型的引用即数据的地址。在使用String[]names=newString[4];创建字符串数组时,会在堆内存中分配4个连续空间,并把空间地址赋给names,使names指向这4个连续的内存空间。这4个空间里存放的默认初始值为null(String类型数据的默认值),如图所示。String型数组的内存演变过程111names[0]="王云";因为数组的元素是引用类型,因此会将"王云"的地址放到names数组的第1个元素空间里之后,依次将"刘静涛","南天华","雷静"的地址存放到names中相应的位置,如图所示为什么要学习排序算法112从实际编程的角度看,使用Java的一些工具类中的排序方法,就可以实现排序的功能。但作为学习数组的强化,编写一些简单算法是很有益处的所谓排序,就是使一串记录(通常存储在数组中),按照某种算法,递增或递减地排列起来的操作排序的算法有很多,各种算法对空间的要求及时间效率也各有差别冒泡排序113通过上面的分析可以看出,假设需要排序的序列的个数是n,则需要经过n-1轮,最终完成排序。在第一轮中,比较的次数是n-1次,之后每轮减少1次。插入排序114插入排序将待排序的数据分为两个部分,第一部分中的数据是已经排好序的(初始时,第一个数据划入第一部分),第二部分中的数据是无序的。之后,每次从第二部分取出头部(即第一个)元素,把它插入到第一部分的合适位置,使插入后的第一部分仍然有序。直接插入排序的具体流程如下第一轮:以下标1的元素(记为a1,后面类似)为头部向前找插入位置,如果a1≥a0,则维持现状;否则a1向前插(a0后移,位置0处将a1放入)。
第二轮:以a2为头部向前找插入位置,如果a2≥a1,则维持现状;否则a1向后挪。继续与a0比较,此时如果a2≥a0,则在位置1处放入a2,如果a0>a2,将a0后挪一位,在位置0处将a2放入。
总的来说,第i轮时,ai为待定位的数据,通过与前序数据比较并将更大的数据后挪(如有必要)的方式找到合适的位置插入ai,使得数组的前i+1个元素有序。一共要进行n-1轮。快速排序法115快速排序是对冒泡排序的一种改进,是通过每一趟排序,将要排序的数组(或后续讲解的集合)分割成两个独立的部分。其中,一部分的所有数据比另一部分的所有数据都要小。然后通过递归重复这种操作,对分割后的两部分数据分别进行快速排序,最终达到整个数据都是有序排列的。本节将会介绍单向扫描法和双向扫描法两种方式的快速排序。快速排序法116快速排序之单向扫描法选定数组的一个元素,将之称为“主元”。之后,扫描一趟数组,将大于或等于主元的元素放在主元的右边,把小于或等于主元的元素放在主元的左边,这个过程被称为用主元分割数组。
具体做法是:
1.选定数组的第一个元素(即nums数组中的元素4)作为主元。
2.定义两个标记变量sp和bigger,它们都是数组下标。其中sp表示1中,在从左往右扫描一趟数组的过程中,当前正在扫描的位置,它会向右移动;bigger是边界,其右侧的数据大于或等于主元。初始时,sp指向数组的第二个元素,bigger指向数组的最后一个元素,如图所示快速排序法117
3.假设数组名是arr,第一趟的比较流程是:在sp≤bigger的情况下循环,比较arr[sp]<=主元是否成立,如果是,sp右移一位;否则,就交换arr[sp]和arr[bigger],并将bigger的位置左移一位(注意sp原地不动),第一次比较过程如图所示。
(1)数据交换前快速排序法118
(2)数据交换后(3)bigger左移一位快速排序法119
4.继续循环,重复c中描述的过程,如下。
(1)(续接上图)因为当前的arr[sp]<=主元(1<4)成立,所以sp右移一位即sp++;
(2)此时arr[sp]<=主元(6>4)不成立,所以交换arr[sp]和arr[bigger],再将bigger左移一位,如下图所示。数据交换前快速排序法120数据交换后bigger左移一位快速排序法121
(1)因为arr[sp]<=主元(2<4)成立,sp右移一位,如图所示
sp右移一位
(2)因为arr[sp]<=主元(7>4)不成立,所以交换arr[sp]和arr[bigger],再将bigger左移一位,如下图所示数据交换前快速排序法122数据交换后bigger左移一位快速排序法123
此时,sp==bigger,仍要继续判断,此处因为arr[sp]<=主元(3<4)成立,所以sp还会右移一次变为大于bigger,而bigger保持不动至此,循环结束,bigger右侧的数据全部大于或等于主元,注意bigger本身指向的数据是小于主元的,下面通过交换arr[bigger]和主元就可以完成以主元分割数组的任务
快速排序法1245.交换arr[bigger]和主元,如图所示。此时,主元左边的元素都小于主元,主元右边的元素都大于或等于主元。即主元已经是处在排好序的位置了。将此时的数组以主元为界,分割为两部分,分别对两部分递归处理,即从a.开始——选取新的主元(图中的新主元1和新主元2),如图所示。用同样的方法,将新的主元也放置到排好序的位置快速排序法125递归的结束条件是:子数组只有1个元素或者0个元素快速排序法126快速排序之双向扫描法双向扫描法仍然是选取第一个元素为主元,然后在主元以外的元素里,从左右两侧同时扫描,如下图中的left、right
快速排序法127left在向右扫描(移动)的过程中,如果arr[left]<=主元成立,则left右移,否则停止移动;right向左扫描的过程中,如果arr[right]>=主元成立,则right左移,否则停止移动。当left和right都停止移动时,如果这时left<=right,则交换左右arr[left]和arr[right],如下图所示。扫描停止并准备交换数据:
快速排序法128交换后的数据:之后继续向中间遍历,直到left>right,如下。1.上一个图中,arr[left]<=主元成立,所以left右移;arr[right]>=主元成立,所以right左移,如图所示
快速排序法129此时,left<right,因此需要交换arr[left]和arr[right],如图所示。right左移数据交换前:right左移数据交换后:
快速排序法1302.上一个图中,arr[left]<=主元成立,所以left右移;arr[right]>=主元成立,所以right左移,如图所示此时,left<=right成立,且left和right满足停止条件,因此需要交换arr[left]和arr[right],如下图所示。数据交换前:
快速排序法131数据交换后:
快速排序法1323.上一个图中,arr[left]<=主元成立,所以left右移;arr[right]>=主元成立,所以right左移,如图所示此时,已达到了循环退出条件left>right,因此循环终止
快速排序法1334.再交换主元与arry[right],如下图所示。主元与arry[right]交换前:主元与arry[right]交换后:
快速排序法134至此,主元也处在了合适的位置上,一趟排序结束。再用递归,将主元左侧和右侧的子数组视为两个需要排序的数组,重复以上步骤即可实现对整个数组的排序。
二维数组135Java语言允许构造多维数组并存储多维数据多维数组的数组元素有多个下标,以标识它在数组中的位置声明并创建二维数组的语法形式如下数据类型[][]数组名;或数据类型数组名[][];数组名=new数据类型[第一维长度][第二维长度];创建的时候,可以同时设置第一维长度和第二维长度,也可以只设置第一维长度,但不可以只设置第二维长度int[][]arr=newint[3][4];int[][]arr=newint[3][];二维数组136二维数组本质是一维数组的叠加,二维数组的所有元素都是引用类型,这些元素分别指向不同的一维数组,其内存结构和之前介绍的一维数组类似。例如,二维数组arr指向了由arr[0]、arr[1]和arr[2]组成的数组,而arr[0]、arr[1]和arr[2]自身也是一维数组。arr[0]、arr[1]和arr[2]是二维数组的三个元素,这三个钥匙盒是并排的。arr[0]、arr[1]和arr[2]所引用的是三个独立的数组,由于new操作符总是开辟新的空间且无法保证连续,arr[0]、arr[1]和arr[2]中的“钥匙”(即地址)不是连续的,如图所示。二维数组137二维数组的赋值和使用与一维数组类似,都是通过下标访问数组元素,不同的是一维数组只有一个下标,而二维数组有两个下标,分别表示该元素所在数组的行数和列数。例如arr[0][3],其表示的是数组arr中第1行第4列的元素如何遍历二维数组?二维数组是二维的,是由“行”和“列”构成的。因此,只需要先遍历每一行,然后再遍历每一行中的每一列即可。其中的“行”,就是构成二维数组的元素:一维数组。遍历二维数组的伪代码如下所示
//遍历二维数组的每一行for(inti=0;i<二维数组.length;i++){//遍历每一行中的每一列for(intj=0;j<二维数组[i].length;j++){//二维数组[i][j]}}笔试题138以下哪些代码是正确的()(1)int[]nums=newint[3];(2)int[3]nums=newint[];(3)int[]nums=newint[]{1,2,3};(4)int[]nums=newint[3]{1,2,3};(5)int[]nums={1,2,3};(6)int[]nums;nums={1,2,3};(7)int[]nums=newint[3];nums={1,2,3};笔试题139以下关于test()方法的定义,哪一个是错误的()?A.voidtest(inta,intb){...}B.statictest(inta,intb){...}C.publicstaticvoidtest(inta,intb){...}D.publicvoidtest(inta,intb){...}笔试题140nums是一个已经按照从小到大的顺序,排好序的int数组。nums数组中最小的数字值是?最大的数字值是?请使用方法和数组编写程序,实现以下功能某公司为新员工设置以下抽奖活动:员工入职时会登记姓名和年龄,登记完毕后,系统会为该员工自动分配一个四位随机数,作为该员工的员工编号。之后,系统会生成6个四位随机数作为当日的幸运数字。如果员工编号正好是6个幸运数字之一,则此员工中奖。Java程序设计基础String字符串String字符串主要内容1425.1JavaAPI及API文档5.2String类(重点)5.3StringBuffer类(重点)5.4其他工具类教学目标143能通过查阅API文档学习类及方法的基本作用能准确使用String类中的常用方法及其作用能理解String的不可变性能准确区分String的两种“相等”比较能准确区分StringBuffer类和String类的特点能正确的使用构造方法创建String、StringBuffer及StringBuilder对象能理解StringBuffer的内存模型能正确使用Date、SimpleDateFormat等常用工具类JavaAPI144Java给程序员提供了JavaAPI(ApplicationProgrammingInterface,应用程序编程接口)文档,供Java程序员随时查阅。API文档描述了类库中的类及其方法的输入、输出和功能,程序员依据文档直接调用,无须关注实现细节。在使用JavaAPI文档时,需要注意API文档的版本号要和JDK的版本号一致,否则可能出现文档与实际使用的类库不一致的情况。API文档145以JDK8为例,JavaAPI文档的文档结构API文档146如果要查找String字符串类的其他方法,可以在“索引”处输入String,在弹出的对话框(见下图)中选择相关主题,单击“显示”按钮,就会显示String类的相关内容String简介147String类表示字符串,Java程序中的所有字符串(例如“蓝桥”)都作为此类的对象String类不是基本数据类型,它是一个类。因为对象的初始化默认值是null,所以String类对象的初始化默认值也是nullString是一种特殊的对象String字符串是常量,字符串的值在创建之后不能更改String类是final修饰的最终类,因此不能被继承创建String对象148String(Strings):创建一个新的String对象,使其内容为参数s中的字符序列String(char[]value):创建一个新的String对象,使其内容为参数value中的字符序列String(char[]value,intoffset,intcount):创建一个新的String对象,其内容为取自字符数组参数value的一个子序列。offset参数是子数组第一个字符的索引(从0开始建立索引),count参数指定子数组的长度创建String对象149示例StringstuName1=newString("王云");char[]charArray={'刘','静','涛'};StringstuName2=newString(charArray);StringstuName3=newString(charArray,1,2);//从'静'字开始,截取2个字符,结果是“静涛”不可变特性150String字符串是常量,字符串的值在创建之后不能更改。concat(Stringstr)方法实际创建了一个新String字符串,用来存放stuName1字符串加上“同学”的结果,而不是在原来stuName1字符串的后面增加内容,对于stuName1而言,它是常量,内容并没有变化比较相等151比较字符串常用的两个方法是运算符==和String类的equals方法使用“==”比较两个字符串,是比较两个对象在内存中的地址是否一致,本质上就是判断两个变量是否指向同一个对象,如果是则返回true,否则返回falseString类的equals方法则是比较两个String字符串的内容是否一致,返回值也是一个布尔类型。常用方法152publiccharcharAt(intindex)返回index指定的索引处的字符publicintlength()返回此字符串的长度。这里需要和获取数组长度区别开,获取数组长度是通过数组名.length获取的publicintindexOf(Stringstr)返回指定子字符串str在此字符串中第一次出现处的索引。常用方法153publicintindexOf(Stringstr,intfromIndex)返回指定子字符串str在此字符串中第一次出现处的索引,从指定的索引fromIndex处开始搜索publicbooleanequalsIgnoreCase(Stringanother)将此String与另一个字符串another比较,比较时不区分大小写publicStringreplace(charoldChar,charnewChar)返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。这里再重申一下,String类方法中的索引都是从0开始编号的。常用方法154publicbooleanstartsWith(Stringprefix)判断此字符串是否以prefix指定的前缀开始publicbooleanendsWith(Stringsuffix)判断此字符串是否以suffix指定的后缀结束publicStringtoUpperCase()将此String中的所有字符都转换为大写常用方法155publicStringtoLowerCase()将此String中的所有字符都转换为小写publicStringsubstring(intbeginIndex)返回一个从beginIndex开始到结尾的新的子字符串publicStringsubstring(intbeginIndex,intendIndex)返回一个从beginIndex开始到endIndex结尾(不含endIndex所指字符)的新的子字符串常用方法156publicStringtrim()返回字符串的副本,忽略原字符串前后的空格publicString[]split(Stringregex)通过regex指定的分隔符分隔字符串,返回分隔后的字符串数组。常用方法157publicstaticStringvalueOf(基本数据类型参数)返回基本数据类型参数的字符串表示形式,例如:publicstaticStringvalueOf(inti)publicstaticStringvalueOf(doubled)常用方法158前两个方法是String类的静态方法,关于“静态”的内容将会在后面的课程详细介绍,这里需要大家注意的是,静态方法是通过类名.方法名直接调用的,例如:Stringresult=String.valueOf(100);//将int型100转换为字符串"100"StringBuffer简介159StringBuffer字符串代表的是可变的字符序列,可以对字符串对象的内容进行修改StringBuffer类最常用的构造方法。StringBuffer():构造一个空白的字符串缓冲区,其初始容量为16个字符。StringBuffer(Stringstr):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。StringBuffer简介160通过StringBuffer类的构造方法创建StringBuffer字符串
StringBufferstrB1=newStringBuffer();System.out.println(strB1.length());以上通过strB1.length()返回的字符串长度是0。但实际上,strB1的底层创建了一个长度为16的字符数组,为接收字符串内容做准备。StringBufferstrB2=newStringBuffer("柳海龙");System.out.println(strB2.length());通过strB2.length()返回长度是3,实际在底层创建了一个长度为3+16的字符数组追加和插入161publicStringBufferappend(Stringstr)将str指定的字符串追加到此字符序列的末尾publicStringBufferappend(StringBufferstr)将str指定的StringBuffer字符串追加到此序列的末尾publicStringBufferappend(char[]str)将str指定的字符数组追加到此序列的末尾。追加和插入162publicStringBufferappend(char[]str,intoffset,intlen)自索引offset开始截取str的len个字符追加到此序列中。publicStringBufferappend(doubled)将double类型的变量d的字符串表示形式追加到此序列的末尾。publicStringBufferappend(Objectobj)将参数obj的字符串表示形式追加到此序列的末尾。publicStringBufferinsert(intoffset,Stringstr)将字符串str插入到此字符序列中,offset表示插入位置。StringBuilder163StringBuilder类是在Java5.0中被提出的,它和StringBuffer之间的最大不同在于StringBuilder的方法是非线程安全的,而StringBuffer是线程安全的对于我们初学者而言,非线程安全意味着速度更快,因此在目前阶段建议使用StringBuilder类;等以后大家学习了高并发相关内容以后,再根据情况考虑使用StringBuffer。StringBuilder164StringBuffer是一个内容可变的字符序列,或者说它是一个内容可变的字符串类型。当使用StringBufferstrB1=newStringBuffer("柳海龙");语句创建StringBuffer对象时,内存结构示意图如图所示。StringBuilder165当使用strB1.append("工程师")方法时,将之前创建的StringBuffer对象的内容“柳海龙”修改成“柳海龙工程师”,内存结构示意图如图所示Date类166JDK8.0以前的Date类用于定义当前的日期和时间,提供了以下常用方法Date(longmillisec)带一个参数的Date构造方法,该参数是从1970年1月1日零点起的毫秒数。longgetTime()返回自1970年1月1日零点以来,此Date对象经过的毫秒数。booleanafter(Datedate)判断当前对象是否在参数date指定的日期之后。如果是返回true,否则返回false。booleanbefore(Datedate)判断当前对象是否在参数date指定的日期之前。如果是返回true,否则返回false。Date类167在JDK8.0提供的新日期API中,所有的类都是不可变的,这就对高并发编程提供了友好支持。并且新的API将“时间”的概念更加精细化,提供了日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unixtimestamp)以及时区等细化的时间类DK8.0新增的日期API都在java.time包下,其中常见的API如下表所示SimpleDateFormat类168在SimpleDateFormat中,是通过构造方法指定Date的输出格式的,并且在设置这些格式时需要使用时间通配符,常见的通配符如下表所示例如yyyy-MM-ddHH:mm:ss就代表了“4位数年-2位数月-2位数日2位数时:2位数分:2位数秒”的日期显示格式其他类169除了Date和SimpleDateFormat以外,JDK还提供了非常丰富的其他工具类例如,Calendar类为特定时间与日历字段(YEAR、MONTH、DAY_OF_MONTH、HOUR等)之间的转换,以及操作日历字段提供了一些方法。而Math类可以方便的进行一些数学运算。Calendar、Math以及其它工具类的具体使用,大家可以查阅JavaAPI文档。笔试题170下列String字符串类的()方法实现了“将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组”的功能。Asubstring(...)Bsplit(...)CvalueOf(...)Dreplace(...)笔试题171给定如下Java代码,编译运行后,输出的结果将是()?publicclassTest{publicstaticvoidmain(Stringargs[]){Strings1=newString("Test");
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- CA证书制作管理办法
- 仓储财产安全管理办法
- 业务合同登记管理办法
- 上街宣传物料管理办法
- 管道业仓储管理办法
- 质量检测员管理办法
- 西藏基金机构管理办法
- 中学财务后勤管理办法
- 蒸汽用户稽查管理办法
- 上海此次疫情管理办法
- 政府专职消防员入职考试250题及答案
- 砖厂安全生产风险分级管控和隐患排查治理双体系方案全套资料汇编
- 四川九寨沟国家地质公园规划(2022-2035年)
- 气压治疗课件
- 《口腔材料学》教材笔记(12章全)
- 七上数学期末26天复习计划
- 新能源汽车维护与故障诊断-课件-项目二-新能源汽车故障诊断技术
- 18项护理核心制度
- 财务管理基础(第四版)全套教学
- 四级完整词汇(打印专用)
- 穴位注射操作规范及流程图
评论
0/150
提交评论