第2章 Java编程基础
目录
2.1 Java的基本语法
Java中的程序都必须放在一个类中,类需要使用class关键字定义。
格式:
修饰词 class 类名{
程序代码
}
在编写Java代码时,需要特别注意下列几个关键点:
(1)Java中的程序代码可分为结构定义语句和功能执行语句。其中结构定义语句用于声明一个类或方法功能执行语句用于实现具体的功能,每条功能执行语句的最后都必须用分号(;)结束。
(2) Java语言严格区分大小写。
(3)虽然Java没有严格要求,用什么样的格式来编排程序代码,但是出于可读性的考虑,应该让自己编写的程序代码,整齐美观,层次清晰。
(4) Java程序中一句连续的字符串不能分开在两行中书写。
如果为了便于阅读,想将一个太长的字符串分在两行中书写,可以先将这个字符串分成两个字符串,然后用加号将这两个字符串连起来,在加号处断行。
Java中的注释
在编写程序时为了使代码与阅读,通常会在实现功能的同时为代码写一些注释。
注释是对程序的某个功能或某行代码的解释,说明它是在Java源文件中有效,在编译程序时编译器会忽略这些注射信息,我会将其注释到class字节码文件中去。
截图
Java中的注释有三种类型,具体如下:
单行注释:通常用于对程序中的某一行代码进行解释,用符号“//”,“//”后面为被注释的内容。
多行注释:顾名思义就是在注释中的内容可以为多行,它以符号“/*”开头,以符号“*/”结尾。
文档注释:以“/**”开头,并在注释内容末尾以“*/”结束。
Java中的标识符
在编程过程中经常需要在程序中定义一些符号,来标记一些名称如包名,类名方法名,参数名,变量名的等,些符号被称为标识符。
标识符可以由任意顺序的大小写字母,数字,下划线和美元符号组成,但不能以数字开头,不能是Java中的关键字。
Java中的关键字
关键字是编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字。和其他语言一样,Java中保留了许多关键字。例如class、 public等。
Java中的常量
常量就是在程序中固定不变的值,是不能改变的数据。
在Java中常量包括整型常量,浮点数常量,布尔常量,字符常量等。
1.整型常量:是整数类型的数据
2.浮点数常量
浮点数常量就是在数学中用到的小数,分为float单精度浮点数和double双精度浮点数两种类型。其中,单精度浮点数后面以F或f结尾,而双精度浮点数则以D或d结尾。当然,在使用浮点数时也可以在结尾处不加任何的后缀,此时虚拟机会默认为double双精度浮点数。浮点数常量还可以通过指数形式来表示。
3.字符常量
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号引起来,它可以是英文字母、数字、标点符号、以及由转义序列来表示的特殊字符。
4.字符串常量
字符串常量用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号引起来。
一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为0。
5.布尔类型
布尔常量及布尔型的两个值true和false,该常量用于区分一个事物的真与假。
6.null常量
null常量只有一个null,表示对象的引用为空。
2.2Java中的变量
变量的定义
在程序运行期间随时可能产生一些临时数据应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识,这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
对于变量的命名并不是随意的,应遵循以下几条规则:
1 、变量名必须是一个有效的字符。
2 、变量名不可以使用Java的关键字。
3、变量名不可重复。
4、应选择有意义的单词作为变量名。
变量的数据类型
Java是一门强类型的编程语言,它对变量的数据类型有严格的限定,在定义变量时必须声明变量的类型,在为变量赋值时必须赋予合变量同一种类型的值,否则程序会报错。
变量的类型转换
1、整数类型变量
用来存储整数数值,即没有小数部分的值。
整数类型分为4种不同的类型:字节型(byte)、短整型(short)、整型(int)和长整型(long)。
类型名 占用空间 取值范围
byte 8位(1个字节) -2⁷~2⁷-1
short 16位(2个字节) -215~215-1
int 32位(4个字节) -2³¹~2³¹-1
long 64位(8个字节) -263~263-1
占用空间指的是不同类型的变量分别占用的内存大小
取值范围是变量存储的值不能超出的范围
为一个long类型的变量赋值时需要注意一点,所赋值的后面要加上一个字母“L” (或小写“l”),说明赋值为long类型。如果赋的值未超出int型的取值范围,则可以省略字母“L” (或小写“l”).
long num =2200000000L;//所赋的值超出了int型的取值范围,后面必须加上字母Llong num =198L; //所赋的值未超出int型的取值范围,后面可以加上字母L
long num = 198; //所赋的值未超出int型的取值范围,后面可以省略字母L↵
2、浮点数类型变量
浮点数类型变量用来存储小数数值。
浮点数类型分为两种:单精度浮点数(float)、双精度浮点数(double),double型所表示的浮点数比float型更精确。
类型名 占用空间 取值范围
float 32位(4个字节) 1.4E-45~3.4E+38,-3.4E+38~-1.4E-45
double 64位(8个字节) 4.9E-324~1.7E+308,-1.7E+308~-4.9E-324
在取值范围中,E表示以10为底的指数,E后面的“+”号和“-”号代表正指数和负指数,例如1.4E-45表示:1.4^{ \ast }10^{-45}。
在为一个float类型的变量赋值时需要注意一点,所赋值的后面一定要加上字母“F” (或“f”),而为double类型的变量赋值时,可以在所赋值的后面加上字符“D”(或“d”),也可不加。
float f = 123.4f; //为一个float类型的变量赋值,后面必须加上字母fdouble d1 =100.1; //为一个double类型的变量赋值,后面可以省略字母d
double d2't 199.3d; //为一个double类型的变量赋值,后面可以加上字母d
在程序中也可以为一个浮点数类型变量赋予一个整数数值。
3、字符类型变量
用于存储一个单一字符,在Java中用char表示。
每个char类型的字符变量都会占用2个字节。
赋值时,要用英文半角格式的单引号(")把字符括起来,如′a′,。
也可以赋值为0~65535范围内的整数,计算机会自动将这些整数转化为所对应的字符,如数值97对应的字符为'a‘。
char c ='a';//为一个char类型的变量赋值字符a
char ch =97;//为一个char类型的变量赋值整数97,相当于赋值字符a
4、布尔类型变量
布尔类型变量用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即true和false。具体示例如下:
boolean flag =false;//声明一个boolean类型的变量,初始值为falseflag =true; //改变flag变量的值为true
变量的类型转换
当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。
根据转换方式的不同数据类型转换,可分为两种:动类型转换和强制类型转换。(布尔类型不包括)
声明:
布尔类型不参与其中的转换,因为我们说过布尔类型的值只有两个值,所以它不能和其他类型混在一起使用要显式地进行声明
1、自动类型转换
也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。
要实现自动类型转换,必须同时满足两个条件
第一是两种数据类型彼此兼容,
第二是目标类型的取值范围大于源类型的取值范围。
byte b = 3:int x= b; // 程序把 byte类型的变里b转换成了int 类型,无须特殊声明
(1) 整数类型之间可以实现转换,如byte类型的数据可以赋值给short、int、long类型的变量,short、char类型的数据可以赋值给intlong类型的变量,int类型的数据可以赋值给long类型的变量
(2) 整数类型转换为float类型,如byte、char、short、int类型的数据可以赋值给float类型的变量。
(3) 其它类型转换为double类型,如byte、char、short、int、longfloat类型的数据可以赋值给double类型的变量。
2、强制类型转换
强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明
当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。
强制类型转换的格式如下所示:
目标类型 变量 =(目标类型)值
注意:在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换,如将一个int类型的数转为byte类型,这样做极容易造成数据精度的丢失。
变量的作用域
变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。
在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域。
如果超出大括号范围,就会无效。(变量的作用域在编程中尤为重要)
双引号内部的是直接输出的,+就是说出多个内容起个连接作用,x表示x变量的值
2.3 Java中的运算符
算术运算符
算术运算符就是用来处理四则运算的符号,这是最简单、最常用的运算符号
算术运算符看上去比较简单,也很容易理解,但在实际使用时有很多需要注意的问题,具体如下:
(1)在进行自增 (++) 和自减 (--) 的运算时,如果运算符放在操作数的前面则是先进行自增或自减运算,再进行其它运算。反之,如果运算符放在操作数的后面则是先进行其它运算再进行自增或自减运算。
(2)在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数
(3) 在进行取模(%) 运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关
赋值运算符
赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量,表中列出了Java中的赋值运算符及用法。
在赋值运算符的使用中,需要注意以下几个问题:
(1) 在Java中可以通过一条赋值语句对多个变量进行赋值
int.X,Y,z;
X=Y=Z=5;//为三个变量同时赋值
intx=y=z=5;//这样写是错误的
(2)除了“=”,其它的都是特殊的赋值运算符,以“+=”为例,x += 3就相当于x=x+3,首先会进行加法运算x+3,再将运算结果赋值给变量x。-=、*=、/=、%=赋值运算符都可依此类推
在为变量赋值时,当两种类型彼此不兼容,或者目标类型取值范在为变量赋值时围小于源类型时,需要进行强制类型转换。
然而在使用+=、-=、*=、/=、%= 运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显式地声明。
比较运算符
比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。
比较运算符在使用时需要注意一个问题,不能将比较运算符“==”误写成赋值运算符“=”。
逻辑运算符
逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。
在使用逻辑运算符的过程中,需要注意以下几个细节:
(1)逻辑运算符可以针对结果为布尔值的表达式进行运算。如:x >3 &&y!=0。
(2)运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false。当运算符“&”和“&&”的右边为表达式时,两者在使用上还有一定的区别。在使用“&”进行运算时,不论左边为true或者false,右边的表达式都会进行运算。如果使用“&&”进行运算,当左边为false时,右边的表达式不会进行运算,因此“&&”被称作短路与。
(3)运算符“|”和“||”都表示或操作,当运算符两边的操作数任何一边的值为true时,其结果为true,当两边的值都为false时,其结果才为false。同与操作类似,“||”表示短路或,当运算符“||”的左边为true时,右边的表达式不会进行运算。
(4)运算符“^”表示异或操作,当运算符两边的布尔值相同时(都为true或都为false),其结果为false。当两边布尔值不相同时,其结果为true。
运算符的优先级
在对一些复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称为运算符的优先级。
案例代码
/*
* 商城库存清单案例
* 变量的形式对商品的数据保存
* 品牌,尺寸大小,价格,配置,库存数量
* 三个商品 苹果,thinkpad,华硕
*
* 计算出总的库存数,和商品的总金额
*/
public class Souhn {
public static void main(String[] args) {
// TODO Auto-generated method stub
//苹果笔记本电脑
String macBrand = "MacBookAIR";
double macSize = 13.3;
double macPrice = 5998.99;
String macConfig = "i5处理器4GB内存128GB固体硬盘";
int macCount = 5;
//联想Thinkpad笔记本电脑
String thinkpadBrabd = "ThinkpadT450";
double thinkpadSizs = 14.0;
double thinkpadPrice = 5999.99;
String thinkpadConfig = "i5处理器4GB内存500G硬盘";
int thinkpadCount = 10;
//华硕笔记本电脑
String ASUSBrand = "ASUS-FL5800";
double ASUSSize = 15.6;
double ASUSPrice = 4999.50;
String ASUSConfig = "i7处理器4G内存128G固态硬盘";
int ASUSCount = 18;
//列表的顶部
System.out.println("------------------------------商城库存清单------------------------------");
System.out.println(" 品牌型号 尺寸 价格 配置 库存数");
//列表的中部
System.out.println(macBrand + " "+macSize + " "+macPrice + " "+macConfig+" "+macCount);
System.out.println(thinkpadBrabd + " "+thinkpadSizs + " "+thinkpadPrice + " "+thinkpadConfig+" "+thinkpadCount);
System.out.println(ASUSBrand + " "+ASUSSize + " "+ASUSPrice + " "+ASUSConfig+" "+ASUSCount );
//统计总库存数 总库存金额
int totalCount = macCount + thinkpadCount + ASUSCount;
double totalMoney = (macPrice*macCount)+(thinkpadPrice*thinkpadCount)+(ASUSPrice*ASUSCount);
//列表底部
System.out.println("---------------------------------------------------------------------");
System.out.println("总库存是:"+totalCount);
System.out.println("库存商品总金额:"+totalMoney);
}
}
2.4 选择结构语句
if条件语句
if条件语句分为三种语法格式,具体如下:
(1) if语句
(2) if...else语句
(3) if...else if...else语句
1、if语:
if语句是指如果满足某种条件,就进行某种处理,其语法格式如下所示:
if (条件语句){
代码块
}
上述语法格式中,判断条件是一个布尔值,当值为true时,才会执行{}中的语句。
if语句的执行流程如下图所示
2、if...else语句
if...else语句是指如果满足某种条件,就进行某种处理,否则就进行另一种处理,其语法格式如下所示:
if (判断){
执行语句1
--
}else{
执行语句2
--
}
在Java中有一种特殊的运算叫做三元运算,它和if-else语句类似,语法如下:
判断条件?表达式1:表达式2
三元运算通常用于对某个变量进行赋值,当判断条件成立时,运算结果为表达式1的值,否则结果为表达式2的值。
3、if...else if...else语句
if...else if ...else语句用于对多个条件进行判断,进行多种不同的处理,其语法格式如下所示:
if(判断条件1){
执行语句1
}else if(判断条件){
执行语句2
}
…
else if(判断条件n){
执行语句n
}else{
执行语句n+1
}
Switch条件语句
Switch语句也是一种很常见的选择语句。和if条件语句不同,他只能针对某个表达式的值做出判断,从而决定执行哪一段代码。
在Switch语句中,使用Switch关键词来描述一个表达式,使用case关键字来描述和表达式结果比较的目标值,当表达式的值和某个目标值匹配时,会执行对应case下的语句,Switch语句的基本语法结果如下所示:
switch (表达式){
case 目标值 1:
执行语句 1
break;
case 目标值 2:
执行语句 2
break;
…………
执行语句 n+1
break;
}
/*
* Switch语句
*/
public class Tdshj {
public static void main(String[] args) {
// TODO Auto-generated method stub
int week = 8;
switch(week) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("输入的数字不正确...");
break;
}
}
}
注意:1、条件表达式的返回值类型必须是以下类型之一:int 、byte、 char、short 、string(如果传 入其他值,程序会报错。)
2、case子句中的值常量N必须是常量,而且所有case子句中的值应是不同的。
3、break语句用来在执行完一个case分支后,是程序跳出switch语句,即终止 switch语句的执行。
4、在一些特殊情况下,多个不同的case值执行一组相同的操作,这时可以不用break
while以及do..while循环嵌套
2.5 循环结构语句
while循环语句
while语句和if条件语句有点类似,都是根据条件判断来决定是否执行后面的代码,区别在于,while循环语句会反复的进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。
While循环语句的语法结构如下所示:
while(循环条件) {
执行语句
.......
}
do...while循环语句
do...while循环语句和while循环语句功能类似。其语句结构如下:
do {
执行语句
.........
} while(循环条件);
for循环语句
for循环语句是最常用的循环语句,一般用在循环次数已知的情况下,其语法格式如下:
for(初始化表达式;循环条件;操作表达式){
执行语句
......
}
在上述语法格式中, For后面的()中包括三部分内容,初始化表达式、循环条件和操作表达式,他们之间用“;”分隔,{}中的执行语句为循环体。
如果用1表示初始化表达式(从for循环开始带结束只执行一次)、2表达循环条件、3表示操作表达式、4表示循环体,则for循环的执行流程如下:
for(1;2;3;){
4
}
第一步,执行1
第二步,执行2,如果判断结果为 true,执行第三步,如果判断结果为 false,执行第五步
第三步,执行4
第四步,执行3,然后重复执行第二步
第五步,退出循环
循环嵌套
嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。while、do... while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环,格式如下:
for(初始化表达式;循环条件;操作表达式;){
……
for(初始化表达式;循环条件;操作表达式;){
执行语句
…….
}}
/*
* for循环(使用*打印直角三角形)
*/
public class Ghj {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i,j;//定义两个循环变量
for(i = 1;i<=9;i++) {//外层循环
for(j = 1;j<=i;j++) {//内层循环
System.out.print("*");//输出
}
System.out.print("\n");//换行
}
}
}
跳转语句(break、continue)
跳转语句用于实现循环执行过程中程序流程的跳转,在Java中的跳转语句有break语句和continue语句
1、break语句:用在switch条件语句和循环语句中,它的作用是终止某个case并跳出switch结构。
2、continue语句:用在循环语句中,它的作用是终止本次循环,执行下一次循环。可以立刻重新开始下一轮循环,而不在循环循环后面的语句。
案例代码
import java.util.Random;
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
//1、通过RANDOM类中的nextInt(n)方法,生成一个0-9之间的随机数
int randomNumber =new SecureRandom().nextInt(10);
System.out.println("随机数已生成!");
//2、输入猜的数字
System.out.println("----请输入您猜的数字:-----");
Scanner sc=new Scanner(System.in);
int enterNumber=sc.nextInt();
//3、通过while循环,进行猜数字对错判断
while(enterNumber!=randomNumber) {
//猜错了,根据结果,给出提示,接着猜数字,游戏继续
if(enterNumber>randomNumber) {
//如果猜大了,打印sorry,您猜大了!继续下一次循环
System.out.println("sorry,您猜大了!");
}
else {
//如果猜小了,打印sorry,您猜小了!继续下一次循环
System.out.println("打印sorry,您猜小了!");
}
//输入猜的数字
System.out.println("-----请输入您的数字:-------");
enterNumber=sc.nextInt();
}
System.out.print("恭喜您,答对了!");
}
}
2.6 方法
什么是方法
假如在一个程序里需要重复的编写100行代码,这样程序就会变得很臃肿,可读性也非常差。所以我们需要把这100行代码抽取出来放在一个地方,在Java里面可以放在一个大括号里面,规定一个范围在这个范围里取个名字就叫做“方法”,当你想运行的时候只要拿出来用就可以了,这个时候你的程序就会变得设计的很好,代码的重复问题也得到了解决,阅读性增强,需要的时候调用那个方法即可。方法可以看作是一个完成一个功能的,具有独立性的代码的一个小片段,片段的范围就是Java中大括号里的范围。
在Java中,声明一个方法的具体语法格式如下:
修饰符 返回值类型 方法名([参数类型 参数名1,参数类型 参数名2……]){
执行语句
……
return 返回值;
}
修饰符:是对访问权限的限定,例如,public、static都是修饰符
返回值类型:用于限定方法返回值的数据类型
参数类型:用于限定调用方法时传入参数的数据类型
参数名:是一个变量,用于接收调用方法时传入的数据
return关键字:用于结束方法以及返回方法指定类型的值
返回值:被return语句返回的值,该值会返回调用者
方法名首字母需大写
方法的重载
案例代码
/*
* 调用不同的方法
*/
public class Fangf {
public static void main(String[] args) {
// TODO Auto-generated method stub
//下面针对求和的方法调用
int sum1 = add01(1,2);
int sum2 = add02(1,2,3);
double sum3 = add03(1,2);
//下面的代码是打印求和的结果
System.out.println("sum1="+sum1);
System.out.println("sum2="+sum2);
System.out.println("sum3="+sum3);
}
//下面的方法实现两个小数相加
private static double add03(double i, double j) {
// TODO Auto-generated method stub
return i+j;
}
//下面方法实现了三个整数相加
private static int add02(int i, int j, int k) {
// TODO Auto-generated method stub
return i+j+k;
}
//下面的方法实现两个数整数相加
private static int add01(int i, int j) {
// TODO Auto-generated method stub
return i+j;
}
}
重载的特点: Java允许在一个程序中定义多个名称相同的方法,但是参数的类型或个数必须不同(个数不一样,类型不一样,顺序不一样也是重载),这就是方法的重载。(方法名相同,但是这个参数列表不一样)
重载和前面的内容没有关系,返回值没关系修饰符也没关系。只和方法名和参数列表有关系 。
2.7 数组
数组的定义
是用来存储一组或多组相同类型数据的数据类型
在程序中,可以通过“数组名.length”的方式来获取数组的长度,也就是元素的个数。
正在初始化数组时还有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式。
类型【】数组名=new类型【】{元素,元素,……};
类型【】数组名={元素,元素,….};
1、每个数组的索引都有一个范围,从0~length-1,在访问数组的元素时,索引不能超过这个范围,否则程序会报错
2、在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常。
数组的常见操作
数组遍历:在操作数组时,经常需要依次访问数组中的每个元素,这种操作叫做数字的遍历。
索引思想,操作数组中的元素,赋值还是获取值,都是依赖索引 arr[0]
索引思想:操作数组。arr[0]赋值,获取
循环:循环的变量,从0开始,每次递增。
数组排序:在操作数组时,经常需要对数组中的元素进行排序,其中冒泡排序是比较常见的一种算法。冒泡过程中,不断比较数组中相邻的两个元素,较小者向上浮,较大者往下沉,整个过程中水中气泡上升的原理相似。
从 第1个元素开始,将相邻的两个元素依次比较,直到最后两个元素完成比较,如果第1个元素比后一个大,则交换位置。整个过程完成后,触组中最后一个元素就是最大值。(相邻的两个元素进行比较换位 )(数组元素换位:临时变量)
/*
* 冒泡排序
*/
public class Maopao {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {9,4,5,3,7};//定义数组,赋值无序
System.out.println("冒泡排序前:");
pintArray(arr);//输出数组元素
bubbleSort(arr);//调用排序的方法
System.out.println("冒泡排序后:");
pintArray(arr);//输出数组元素
}
//定义打印数组的元素的方法
public static void pintArray(int[] arr) {
//循环遍历数组的元素
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i] + " ");//输出元素和空格
}
System.out.print("\n");
}
//定义对数组排序的方法
public static void bubbleSort(int[] arr) {
//定义外层循环
for(int i = 0;i < arr.length - 1;i++) {
//定义内层循环
for(int j = 0;j<arr.length -i -1;j++) {
if(arr[j]>arr[j+1]) {//比较相邻的元素
//
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1]=temp;
}
}
}
}
}
除最后一个元素,将剩下的元素继续进行两两比较,过程与第1步类似,这样数组中第二大的元素放在了倒数第2个位置。
以此类推,持续对越来越少的元素重复上面的步骤,直到没有任何一个元素需要比较为止。
多维数组
多维数组可以简单地理解为在数组中的嵌套数组。在程序中比较常见的就是二维数组。
二维数组的定义方式:
方式一:int【】【】arr=new int【n】【m】
特点:元素固定
方式二:int【】【】arr=new int【n】【】
特点:可以让一维数组储存的元素是可变的
方式三:int【】【】arr={{1,2},{3,4,5,6},{7,8,9}};
直接把里面的所有元素的都附上
二维数组的访问同样也是通过索引去访问的
案例代码
/*
* 随机点名器
* */
import java.security.SecureRandom;
import java.util.Scanner;
public class Bhs {
// 1、存储全班同学的姓名 创建一个存储多个同学的姓名的容器(数组)
// 键盘录入每个同学的姓名,存储到数组容器中
public static void addStudentName(String[]students) {
//键盘录入多个同学姓名存储到容器中
Scanner sc =new Scanner (System.in);
for(int i=0;i<students.length;i++){
System.out.println("存储第"+(i + 1)+"个姓名:");
students[i]=sc.next();
}
}
// 2、总览全班同学姓名
public static void printStudentName(String[]students) {
//遍历数组,得到每个同学姓名
for(int i=0;i<students.length;i++) {
String name =students[i];
System.out.println("第"+(i+1)+"个学生姓名:"+name);
}
}
// 3、随机点其中一人
public static String randomStudentName(String[] studrents) {
//根据数组产孤独,获取随机数
int index =new SecureRandom().nextInt(studrents.length);
//通过随机索引从数组中获取名字
String name =studrents[index];
return name;
}
public static void main(String[]args) {
System.out.println("-----随机点名器--------");
String[] students=new String[3];
addStudentName(students);
printStudentName(students);
String randomName=randomStudentName(students);
System.out.println("被点到名字的同学是:"+randomName);
}
}