目录
Java语言的特点
Java转义字符
Java中的注释类型
常用的Dos命令
数据类型
整型类型
整型的使用细节
浮点类型
浮点类型的使用细节
字符类型
字符类型的使用细节
布尔类型
布尔类型的使用细节
基本数据类型转换
自动类型转换
自动类型转换的使用细节
强制类型转换
强制类型转换的使用细节
基本数据类型和String类型的转换
基本数据类型转String类型
String类型转基本数据类型
基本数据类型和String类型的转换的使用细节
运算符
算术运算符
++ or -- (均可参考)
关系运算符(比较运算符)
关系运算符的使用细节
逻辑运算符
赋值运算符
赋值运算符的使用细节
三元运算符
三元运算符的使用细节
运算符优先级
标识符
标识符的命名规则
标识符的命名规范
关键字
保留字
键盘输入语句
进制
进制的转换
二进制转十进制
八进制转十进制
十六进制转十进制
十进制转二进制
十进制转八进制
十进制转十六进制
二进制转八进制
二进制转十六进制
八进制转二进制
十六进制转二进制
二进制在运算中的说明
原码、反码和补码
位运算符
程序流程控制
顺序控制
分支控制
单分支
双分支
多分支
嵌套分支
switch
switch语句的使用细节
穿透
if语句和switch语句的比较
循环控制
for
for循环的使用细节
例题
while
while循环的使用细节
do...while循环
do...while循环的使用细节
while循环和do...while循环的区别
多重循环控制
例题
跳转控制语句
break
break语句的使用细节
例题
continue
break语句与continue语句的区别
return
例题
数组
数组的使用
动态初始化
静态初始化
数组的使用细节
例题
数组赋值机制
数组拷贝
数组反转
数组添加
数组缩减
排序
冒泡排序
分析冒泡排序
冒泡排序的特点
冒泡排序的实现
简单但复杂版
简单且易于理解版
最终版
查找
多维数组
二维数组
二维数组的使用
静态初始化
编辑
动态初始化
例题
程序:计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。
Java技术体系平台
Java虚拟机(JVM Java Virtual Machine)
Java开发工具包(JDK Java Development Kit)
Java运行环境(JRE Java Runtime Environment)
三者关系:JDK > JRE > JVM
如果只想运行开发好的.class文件,只需要JRE即可。
编写一个输出“Hello,World!”的程序
//public class HelloWorld 表示HelloWorld是一个类,是一个public的类。
//HelloWorld{} 表示一个类的开始和结束
//public static void main(String[] args) 表示一个主方法,是程序的入口。
//main(String[] args) {} 方法的开始和结束
//System.out.println("Hello,World!") 输出HelloWorld到屏幕上
//;表示一条语句的结束
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,World!");
}
}
.java文件是源文件,.class文件是字节码文件。
编译
运行
Java程序开发注意事项
/**
*
* @author 小焰
* @version 1.0
*
*/
使用如下Dos指令,可以对应生成文档。
javadoc -d 文件夹名 -author -version xx.java
Java代码规范
if () {
} else {
}
if ()
{
} else
{
}
相对路径:从当前目录开始定位,形成的一个路径。
绝对路径:从顶级目录开始定位,形成的一个路径。
变量是程序的基本组成单位。
变量三要素:类型、名称和值。
变量相当于内存中一个数据存储空间的表示。
变量使用注意事项
程序中“+”号的使用
byte(字节 1字节)short(短整型 2字节)int(整型 4字节)long(长整型 8字节)
float(单精度 4字节)双精度(double 8字节)
浮点数 = 符号位 + 指数位 + 尾数位
尾数部分可能丢失,造成精度损失(小数都是近似值)。
Java API文档
char(可以存放单个字符 2字节)
多个字符的字符类型用字符串String。
字符编码表:
ASCII:ASCII编码表,用一个字节表示,一共有128个字符,实际上一个字节可以表示256个字符,但是只用了128个字符。
Unicode:Unicode编码表,固定大小的编码,使用两个字节来表示字符,字母和汉字统一都是占用两个字节,浪费空间。
UTF-8:UTF-8编码表,大小可变的编码,字母使用一个字节,汉字使用三个字节。
GBK:GBK编码表,可以表示汉字并且范围广,字母使用一字节,汉字使用两个字节。
GB2312:GB2312编码表,可以表示汉字,使用较少。
BIG5:BIG5编码表,可以使用繁体中文,适用于台湾,香港。
Unicode编码兼容ASCII编码。
UTF-8是在互联网上使用最广的一种Unicode的实现方式(改进)。
不可以用0或非0的整数替代false和true,这点和C语言不同。
当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型。
(byte可以转换成short,short可以转换成int。。。)
byte = 10 //正确
int a = 10;
byte b = a; //错误
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。
使用时要加上强制转换符(),但可能造成精度降低或溢出,需要格外注意。
int n = (int)1.9; //输出值为1 无四舍五入
int a = (int)10 * 3.5 + 6 * 1.5; //错误
int a = (int)(10 * 3.5 + 6 * 1.5); //正确
char a1 = 100;
int b1 = 100;
char a2 = b1; //错误
char a3 = (char)b1; //正确
在程序开发中,经常需要将基本数据类型转换成String类型,或者将String类型转换成基本数据类型。
将基本数据类型的值+“”即可。
int n = 100;
String s = n + "";
通过基本数据类型的包装类调用parsexx方法即可。
在Java中每一个数据类型都对应一个包装类。
String n = "123";
int b = Integer.parseInt(n);
double c = Double.parseDouble(n);
boolean d = Boolean.parseBoolean("true");
...
运算符是一种特殊的符号,用以表示数据的运算,赋值和比较等。
算术运算符是对数值类型的变量进行运算。
运算符 | 运算 | 范例 | 结果 |
+ | 正号 | +7 | 7 |
- | 负号 | b = 11; -b; |
-11 |
+ | 加 | 9 + 9 | 18 |
- | 减 | 10 - 8 | 2 |
* | 乘 | 7 * 8 | 56 |
/ | 除 | 9 / 9 | 1 |
% | 取模(取余) | 11 % 9 | 2 |
++ ++ |
(前)自加:先运算后取值 (后)自加:先取值后运算 |
a = 2 ; b = ++a; a = 2 ; b = a++; |
a = 3 ; b = 3 a = 3 ; b = 2 |
-- -- |
(前)自减:先运算后取值 (后)自减:先取值后运算 |
a = 2 ; b = --a; a = 2 ; b = a--; |
a = 1 ; b = 1 a = 1 ; b = 2 |
+ | 字符串相加 | "huo"+"yan" | "huoyan" |
在Java中,取余的本质是 a % b = a - a / b * b,例如-10 % 3 = -1,10 % -3 = 1。
public class Example {
public static void main(String[] args) {
int a = 8;
int k = ++a;
//a = a + 1 = 9
//int k = a = 9
System.out.println("a = "+ a + ",k = "+ k);
}
//输出结果为:a = 9,k = 9
public class Example {
public static void main(String[] args) {
int a = 8;
int k = a++;
//int k = a = 8
//a = a + 1 = 9
System.out.println("a = "+ a + ",k = "+ k);
}
//输出结果为:a = 9,k = 8
关系运算符的结果都是Boolean型,也就是说要么是true,要么是false。
关系表达式经常用在if结构或者循环结构的条件中。
运算符 |
运算 | 范例 | 结果 |
== | 相等于 | 8 == 7 | false |
!= | 不等于 | 8 != 7 | true |
< | 小于 | 8 < 7 | false |
> | 大于 | 8 > 7 | true |
<= | 小于等于 | 8 <= 7 | false |
>= | 大于等于 | 8 >= 7 | true |
instanceof | 检查是否是类的对象 | "yan" instanceof String | true |
用于连接多个条件(多个关系表达式),最终的结果也是一个Boolean型。
短路与:&& 短路或:|| 取反:!
a | b | a && b | a || b | !a |
true | true | true | true | false |
true | false | false | true | false |
false | true | false | true | true |
false | false | tfalse | false | true |
短路与:当a,b同时为true时,结果才为true。
短路或:当a,b中只要有一个为true,结果就是true。
取反:当a为true,结果为false,当a为false,结果为true。
逻辑与:& 逻辑或:| 逻辑异或:^
a | b | a & b | a | b | a ^ b |
true | true | true | true | false |
true | false | false | true | true |
false | true | false | true | true |
false | false | false | false | false |
逻辑与:当a,b同时为true时,结果才为true。
逻辑或:当a,b中只要有一个为true,结果就是true。
逻辑异或:当a,b不同的时候,结果为true,否则就是false。
一个地址符为逻辑x,两个地址符为短路x。
短路与&&与逻辑与&的区别(其它类似)
赋值运算符就是将某个运算后的值,赋给指定的变量。
基本赋值运算符 =
复合赋值运算符 a + = b =====> a = a + b(简化的写法)
byte a = 3;
b += 2; //等价于b = (byte)(b + 2)
条件表达式?表达式1:表达式2
Java对各种变量、方法和类等命名时使用的字符序列称为标识符。
被Java语言赋予了特殊含义,用做专门用途的字符串。
现有Java版本尚未使用,但以后版本可能会作为关键字使用。
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。
步骤
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
//创建名为scanner的Scnaner对象
//new是创建一个Scanner对象的意思
//System.in为用户从键盘输入的意思
//整条语句的意思就是创建一个名为scanner的Scanner的对象,
//该对象为用户从键盘输入的Scanner对象
String name = scanner.next(); //接收用户的输入
int age = scanner.nextInt();
double salary = scanner.nextDouble();
//不同的数据类型有不同的scanner输入语句
//当程序执行到next方法时,会等待用户输入,倘若不输入,就会停留在此处
对于整数,有四种表示方式
从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
例如将0b1101转成十进制的数字。
0b1101 = 1 * 2的(1-1)次方 + 0 * 2的(2-1)次方 + 1 * 2的(3-1)次方 + 1 * 2的(4-1)次方 = 1 + 2 + 0 + 8 = 11
从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。
例如将0234转为十进制的数字。
0234 = 4 * 8的(1-1)次方 + 3 * 8的(2-1)次方 + 2 * 8的(3-1)次方 = 4 + 24 + 128 = 156
从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
例如将0x23A转成十进制的数字。
0x23A = 10(A) * 16的(1-1)次方 + 3 * 16的(2-1)次方 + 2 * 16(3-1)次方 = 10 + 48 + 512 = 570
将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制数。
例如将34转成二进制的数字。
就是0b100010,这是六位,要写成八位,所以写成0b00100010。(0b为二进制的代表表示)
将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制数。
例如将131转成八进制的数字。
就是0203(0为八进制的代表表示)
将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制数。
例如将237转成十六进制的数字。
就是0xed或者是0xED(0x为十六进制的代表表示)
从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
例如将0b11010101转成八进制的数字。
0b11010101 = 0325(0是八进制的代表表示)
从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
例如将0b11010101转成十六进制的数字。
0b11010101 = 0xD5(0x是十六进制的代表表示)
将八进制的每一位,转成对应的一个三位的二进制数即可。
例如将0237转成二进制的数字。
0237 = 0b010011111(0b是二进制的代表表示)
将八进制的每一位,转成对应的一个四位的二进制数即可。
例如将0x23B转成二进制的数字。
0x23B = 0b001000111011
二进制是逢2进位的进位制,0、1是基本算符。
现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便易于用电子方式实现。计算机内部处理的信息,都是采用二进制位数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
对于有符号的而言
Java中有7个位运算符,都是指的码值的运算,并不是直接的值。
public class Example{
public static void main(String[] args) {
//2的原码:00000000 00000000 00000000 00000010
//2的补码:00000000 00000000 00000000 00000010(正数三码合一)
//3的原码:00000000 00000000 00000000 00000011
//3的补码:00000000 00000000 00000000 00000011(正数三码合一)
//按位& 全为1才为1,否则为0
//则有
//00000000 00000000 00000000 00000010 &
//00000000 00000000 00000000 00000011 =
//00000000 00000000 00000000 00000010(此处为补码,要转换为原码)
//原码:00000000 00000000 00000000 00000010 (正0负1,三码合一)
//结果为:2
System.out.println(2&3);
}
在程序中,程序运行的流行控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。
程序从上到下逐行地执行,中间没有任何判断和跳转。
Java中定义变量时采用合法的前向引用。
让程序有选择的执行。
分支语句是可以嵌套使用的。
if(条件表达式){
代码块;(可以支持多条语句)
}
当条件表达式为true时,就会执行{}内的代码块。
当条件表达式为false时,就不执行{}内的代码块,执行该if语句之后的代码。
如果{}内只有一条语句,可以不用写{},但当有两条及以上语句时,则必须写{}。
if(条件表达式){
代码块1;
}
else {
代码块2;
}
当条件表达式成立时,就执行代码块1,否则执行代码块2。
如果{}内只有一条语句,可以不用写{},但当有两条及以上语句时,则必须写{}。
if(条件表达式1){
代码块1;
}else if(条件表达式2){
代码块2;
}
....
else{
代码块n;
}
当条件表达式1成立时,执行代码块1。
如果条件表示1不成立,才去判断条件表达式2是否成立。
条件表达式2成立,就执行代码块2。
以此类推,如果所有的条件表达式都不成立,就执行else语句里的代码块n。
只能有一个执行入口。
多分支语句可以没有else。
如果所有的条件表达式都不成立,则一个执行入口都没有。
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支,外面的分支结构称为外层分支,最好是不要超过三层,可读性不好。
if(){
if(){
}else{
}
} else{
}
switch (表达式){
case 常量1:
代码块1;
break;
case 常量2:
代码块2;
break;
...
case 常量n:
代码块n;
break;
default:
代码块;
break;
}
表达式对应一个值。
在Java中只要有值返回,就是一个表达式。
case 常量1:当表达式的值等于常量1,就执行代码块1。
break:表达退出swtich。
如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配case常量2。
如果一个都没有匹配上,就执行default。
根据指定月份,打印该月份所属的季节。3,4,5春季,6,7,8夏季,9,10,11秋季,12,1,2冬季。
import java.util.Scanner;
public class Example{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入月份:");
int mouth = scanner.nextInt();
switch (mouth){
case 3:
case 4:
case 5:
System.out.println(mouth + "月是春季");
break;
case 6:
case 7:
case 8:
System.out.println(mouth + "月是夏季");
break;
case 9:
case 10:
case 11:
System.out.println(mouth + "月是秋季");
break;
case 12:
case 1:
case 2:
System.out.println(mouth + "月是冬季");
break;
default:
System.out.println("请输入正确的月份!");
}
}
}
让代码可以循环的进行。
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(语句);
}
for的四要素
循环操作可以有多条语句,也就是我们要循环执行的代码。
如果循环操作语句只有一条,可以省略{},但是最好还是不要省略为好。
public class Example {
public static void main(String[] args) {
int i = 1;
for(;i <= 10;){
System.out.println("你好!小焰");
i++;
}
System.out.println(i);
}
}
//for(;;)表示无限循环
public class Example {
public static void main(String[] args) {
int count = 3;
for(int i = 0,j = 0;i < count;i++,j+=2){
System.out.println("i = " + i + " j = " + j);
}
}
}
//打印1-100之前所有是9的倍数的整数,统计个数及总和。
//(1)完成输出1-100的值
//(2)在输出过程中进行过滤,只输入9的倍数 i%9 == 0
//(3)统计个数,int count = 0,当条件满足时count++
//(4)总和,int sum = 0,当条件满足时sum += i
//为了更好的适应需求,可以对各个可以当成变量的值进行修改
public class Example {
public static void main(String[] args) {
int start = 1;
int end = 100;
int n = 9;
int count = 0;
int sum = 0;
for(int i = start;i <= end;i++){
if(i % n == 0){
System.out.println("i = " + i);
count++;
sum += i;
}
}
System.out.println("count = " + count);
System.out.println("sum = " + sum);
}
}
//(1)先输出0-5
//(2)后面的+是5-i
//为了使代码更加灵活,适当修改
public class Example {
public static void main(String[] args) {
int n = 5;
for(int i = 0;i <= n;i++){
System.out.println(i + " + " + (n - i) + " = " + n);
}
}
}
while(循环条件){
循环体;
循环变量迭代;
}
与for循环一样有四要素,但是四要素所处的位置不一样。
public class Example {
public static void main(String[] args) {
int i = 1;
while(i <= 10){
System.out.println("你好!小焰");
i++;
}
}
}
do{
循环体;
循环变量迭代;
}while(循环条件);
也有循环四要素,只是位置不一样。
先执行,再判断,也就是说,一定会执行一次。
一定要注意的是最后有一个;号。
public class Example {
public static void main(String[] args) {
int i = 1;
do{
System.out.println("你好!小焰");
i++;
}while(i <= 10);
}
}
while循环是先判断条件再执行。
do...while循环是先执行再判断。
将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do...while均可以作为外层循环和内层循环。
建议一般使用两层,最多不要超过三层,否则,代码的可读性很差。
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
//统计三个班的成绩情况,每个班有五名同学,求出各个班的平均分和所有班级的平均分
//学生信息从键盘输入
//统计三个班的及格人数,每个班有五名同学。
//先计算一个班,五个学生的成绩。使用一个for循环即可。
//创建Scanner对象然后接收用户的输入。
//得到该班级的平均分
//统计三个班(每个班五个学生)的平均分
//所有班级的平均分
//定义一个变量,double total累计所有学生的成绩
//当多重循环结束后,total / (3 * 5)
//定义一个变量,int passNum累计所有及格学生的人数
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //创建Scanner对象
double total = 0;
int passNum = 0;
for(int i = 1;i <= 3;i++){
double sum = 0;
for(int j = 1;j <= 5;j++){
System.out.println("请输入第" + i + "个班的第" + j + "个学生的成绩:");
double score = scanner.nextDouble();
if(score >= 60){
passNum++;
}
System.out.println("成绩为" + score);
sum += score;
}
System.out.println("sum = " + sum + " average = " + (sum / 5));
System.out.println("========================");
total += sum;
}
System.out.println("三个班的总分为:" + total + " 三个班的平均分为:" + total / (3 * 5));
System.out.println("三个班的及格人数有" + passNum + "人");
}
}
//打印一个九九乘法表
//*后的数字保持不变,故知道是循环外层->当内层循环结束后才可以进行外层循环,所以是for(int i = 1;i <= 9;i++)
//*前的数字即是内层循环,每次都要+1,for(int j = 1;j <= i;j++)
//将内层循环嵌套在外层循环内
//注意里面的输出语句不是println而是print,println带有换行,而print没有。
//每一行的最后一个乘法都是 i 和 j 相同,故嵌套if语句,当 i == j 时,换行
//注意:是每一行后使用if语句,所以if语句在内层循环内
public class Example {
public static void main(String[] args) {
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= i;j++){
System.out.print(j + " * " + i + " = " + j * i + "\t");
if(i == j){
System.out.println();
}
}
}
}
}
/*
打印一个空心金字塔
先打印一个矩形五行五列
*****
*****
*****
*****
*****
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= 5;j++){
System.out.print("*");
}
System.out.println();
打印半个金字塔,嵌套在内,结束每一行都需要换行
*
**
***
****
*****
for(int i = 1;i <= 5;i++){
for(int j = 1;j <= i;j++){
System.out.print("*");
}
System.out.println();
}
打印整个金字塔
*
***
*****
*******
*********
for(int k = 1;k <= 5 - i;k++){
System.out.print(" ");
}
打印空心金字塔
*
* *
* *
* *
*********
*/
public class Example {
public static void main(String[] args) {
for(int i = 1;i <= 5;i++){
for(int k = 1;k <= 5 - i;k++){
System.out.print(" ");
}
for(int j = 1;j <= 2 * i - 1;j++){
if(j == 1 || j == 2 * i - 1 || i == 5){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
}
当某个条件满足时,终止循环,通过该需求可以说明其它流程控制的必要性。
break语句用于种植某个语句块的执行,一般是用在switch或者循环中。
{
...
break;
...
}
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块。
public class Example {
public static void main(String[] args) {
lable1:
for(int j = 0;j <= 4;j++){
lable2:
for(int i = 0;i <= 4;i++){
if(i == 2){
break lable1;
}
System.out.println("i = " + i);
}
}
}
}
但是最好不要使用标签,可读性会变差,了解即可。
如果没有指定的break,默认退出最近的循环体。
/*
1-100以内的数求和,求出当和第一次大于20的当前数
循环1-100,求和为变量sum
当 sum > 20 时,记录当前数字,然后break
在for循环外部定义变量n,把当前的i赋给n
*/
public class Example {
public static void main(String[] args) {
int n = 0;
int sum = 0;
for(int i = 1;i <= 100;i++){
sum += i;
if(sum > 20){
n = i;
break;
}
}
System.out.println("i = " + n);
System.out.println("sum = " + sum);
}
}
/*
实现登录验证,一共有三次机会,如果用户名为“小焰”,密码为“666”提示登录成功,否则提示还有几次机会。
实现登录验证->用户登录->从用户进行输入->使用输入语句->分别键入用户名和密码。
比较使用的方法是String的equals方法,将equals前的与equals()内的数相比较
用户名为“小焰”,密码为“666”->两个变量的条件都要满足才能提示登录成功,即用&&,输出后进行break语句。
用一次机会少一次->i-1->当i=3时,有0次机会,输出还有0次机会,直接输出登录结束即可->用if...else语句。
*/
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
String username;
String password;
for(int i = 1;i <= 3;i++) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
username = scanner.next();
System.out.println("请输入密码");
password = scanner.next();
if ("小焰".equals(username) && "666".equals(password)) {
System.out.println("登录成功!");
break;
}
if(i == 3){
System.out.println("最后的机会已用完,登录失败!");
}else{
System.out.println("登录失败,还有" + (3 - i) + "次机会!");
}
}
}
}
continue语句用于结束本次循环,继续执行下一次循环。
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的标签的使用的规则是一样的。
{
...
continue;
...
}
break是直接退出该循环,continue是结束此次条件的循环,continue下面的语句不再执行,返回去执行该循环的下一个条件。
break退出此次循环。
public class Example {
public static void main(String[] args) {
int i = 1;
while(i <= 4){
i++;
if(i == 2){
break;
}
System.out.println("i = " + i);
}
System.out.println("循环结束");
}
}
/*
循环结束
*/
continue不退出此次循环。
public class Example {
public static void main(String[] args) {
int i = 1;
while(i <= 4){
i++;
if(i == 2){
continue;
}
System.out.println("i = " + i);
}
System.out.println("循环结束");
}
}
/*
i = 3
i = 4
i = 5
循环结束
*/
当return用在方法时,表示跳出方法,如果使用在main,则表示退出程序。
/*
某人有100000元,每经过一次路口,需要缴费,规则如下:
当现金>50000元时,每次需要缴费0.05,当现金<=50000时,每次需要缴费1000
编程计算该人可以经过多少次路口?(使用while break)
根据题目要求,得出三种情况
money > 50000
money >= 1000 && money <= 50000
money < 1000
使用多分支语句
money = money - money * 0.05 -> money *= 0.95
*/
public class Example {
public static void main(String[] args) {
double money = 100000;
int count = 0;
while (true){
if(money > 50000){
money *= 0.95;
count++;
}else if(money >= 1000 && money <= 50000){
money -= 1000;
count++;
}else{
break;
}
}
System.out.println("count = " + count);
}
}
/*
判断一个整数是否是水仙花数。
所谓水仙花数是指一个三位数,及其个位上的数字立方和等于其本身。
例如 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3
int n = 153
先得到n的百位、十位、个位的数字。
n的百位 n / 100
n的十位 n % 100 / 10
n的个位 n % 10
判断
*/
public class Example {
public static void main(String[] args) {
int n = 153;
int n1 = n / 100;
int n2 = n % 100 / 10;
int n3 = n % 10;
if(n1 * n1 * n1 + n2 * n2 * n2 + n3 * n3 * n3 == n){
System.out.println(n + "是水仙花数");
}else{
System.out.println("不是水仙花数");
}
}
}
/*
输出1-100间不能被5整除的数,每五个一行
先输出1-100的数字
在进行过滤出不能被5整除的数
每五个数字一行,用count计数,当count为5时,进行换行操作,再对count赋0。
*/
public class Example {
public static void main(String[] args) {
int count = 0;
for(int i = 1;i <= 100;i++){
if(i % 5 != 0){
System.out.print(i + "\t");
count++;
}
if(count == 5){
System.out.println();
count = 0;
}
}
}
}
/*
输出小写的a-z和大写的Z-A
考察了对于编码的认识
'b' = 'a' + 1
'c' = 'a' + 2
...
'Y' = 'Z' - 1
...
*/
public class Example {
public static void main(String[] args) {
for(char c1 = 'a';c1 <= 'z';c1++){
System.out.print(c1 + "\t");
}
System.out.println();
for(char c1 = 'Z';c1 >= 'A';c1--){
System.out.print(c1 + "\t");
}
}
}
可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型。
数据就是一种数据。
/*
一个养鸡场有六只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg。
请问这六只鸡的总体中是多少?平均体重是多少?
定义一个数组。
double[]是double类型的数组,数组名是hens。
数组可以通过for循环遍历。
可以通过hens[i]来访问数组的元素,i是下标,下标是从0开始编号的,之后依此类推。
通过for循环就可以循环的访问数组的元素。
使用一个变量total将各个元素累计。
*/
public class Example {
public static void main(String[] args) {
double[] hens = {3,5,1,3.4,2,50};
double total = 0;
for(int i = 0;i <= 5;i++){
total += hens[i];
}
System.out.println("总体重为" + total);
System.out.println("平均体重为" + (total / 6));
}
}
可以通过数组名.length来获取数据的大小/长度。
数组类型 数组名[] = new 数组类型[大小];
int a[] = new int[5];
//创建了一个名为a的数组,存放的有5个int。
数组类型[] 数组名;
数组名 = new 数组类型[大小]
int[] b;
b = new int[5];
//先声明数组,再分配内存空间用来存放数据。
数组元素的引用利用下标,下标是从0开始的。
/*
循环输入五个成绩,保存到double数组,并输出。
*/
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double[] scores = new double[5];
//double[] scores;
//scores = new double[5]
for(int i = 0;i < scores.length;i++){
System.out.println("请输入第" + (i + 1) + "个元素的值");
scores[i] = scanner.nextDouble();
}
System.out.println("===========================");
for(int i = 0;i < scores.length;i++){
System.out.println("第" + (i + 1) + "个元素的值为" + scores[i]);
}
}
}
数据类型 数组名[] = {元素值1,元素值2,元素值3,...};
int a[] = {1,2,3,4,5,6,7,8};
/*
请求出一个数组int[]的最大值{4,-1,9,10,23},并得到对应的下标。
定义一个int数组,int[] arr = {4,-1,9,10,23}。
假定arr[0]为最大值,即max = arr[0],maxIndex = 0。
从下标1开始遍历数组arr,如果max < 当前元素,说明max不是最大值,需要进行交换,max = 当前元素,maxIndex = 当前元素的下标
当我们遍历这个数组arr后,max就是真正的最大值,maxIndex就是最大值的下标。
*/
public class Example {
public static void main(String[] args) {
int[] arr = {4,-1,9,10,23};
int max = arr[0];
int maxIndex = 0;
for(int i = 1;i < arr.length;i++){
if(max < arr[i]){
max = arr[i];
maxIndex = i;
}
}
System.out.println("max = " + max + "\tmaxIndex = " + maxIndex);
}
}
基本数据类型赋值,赋值方式为值拷贝。
不会影响到原来的值。
数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用传达。
是一个地址,会影响到原来的。
/*
将 int[] arr1 = {10,20,30} 拷贝到arr2数组,要求数据空间是独立的
创建一个新的数组arr2,开辟新的数据空间。
大小为arr1.length
遍历arr1,把每个元素拷贝到对应的位置
*/
public class Example {
public static void main(String[] args) {
int[] arr1 = {10,20,30};
int[] arr2 = new int[arr1.length];
for(int i = 0;i < arr1.length;i++){
arr2[i] = arr1[i];
}
System.out.print("arr2的元素为");
for(int i = 0;i < arr2.length;i++){
System.out.print(arr2[i] + " ");
}
System.out.println();
}
}
/*
把数组int[] arr = {11,22,33,44,55,66}的内容反转
定义数组,int[] arr = {11,22,33,44,55,66}。
把arr[0]和arr[5]进行交换,{66,22,33,44,55,11}。
把arr[1]和arr[4]进行交换,{66,55,33,44,22,11}。
把arr[2]和arr[3]进行交换,{66,55,44,33,22,11}。
一共交换三次 = arr.length / 2。
下标 0->1->2 5->4->3。
即 arr[i]和arr[arr.length - 1 - i]进行交换。
temp变成了arr[arr.length - 1 - i]被赋给了arr[i]。
arr[arr.length - 1 - i]变为了arr[i]。
*/
public class Example {
public static void main(String[] args) {
int[] arr = {11,22,33,44,55,66};
for(int i = 0;i
/*
把数组int[] arr = {11,22,33,44,55,66}的内容反转
先创建一个新的数组arr2,大小arr1.length
逆序遍历arr1,将每个元素拷贝到arr2的元素中(顺序拷贝)
建议增加一个循环遍历 j->0->5
当for循环结束后,arr2就是一个逆序的数组
让arr1指向arr2的数据空间,arr1原来的数据空间就没有被引用,就被当做垃圾销毁
*/
public class Example {
public static void main(String[] args) {
int[] arr1 = {11,22,33,44,55,66};
int[] arr2 = new int[arr1.length];
for(int i = arr1.length - 1,j = 0;i >= 0;i--,j++){
arr2[j] = arr1[i];
}
arr1 = arr2;
System.out.println("arr2的元素为" );
for(int i = 0;i < arr1.length;i++){
System.out.print(arr1[i] + " ");
}
System.out.println();
}
}
/*
实现动态的给数组添加元素效果,实现对数组的扩容
原始数组使用静态分配 int[] arr = {1,2,3}
增加元素4,直接放在数组的最后arr = {1,2,3,4}
用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?Y\N
定义初始数组 int[] arr = {1,2,3}
定义一个新的数组 int[] arrnew = new int[arr.length + 1]
遍历arr数组,依次将arr的元素拷贝到arrnew数组
将4赋给arrnew[arr.length - 1] = 4,赋给arrnew的最后一个元素
让arr指向arrnew。原来的arr数组被销毁,成为垃圾
创建一个Scanner对象,接收用户想要添加的元素和回答。
因为用户什么时候退出不确定,需要一个循环,do...while和break。
*/
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = {1,2,3};
do {
int[] arrnew = new int[arr.length + 1];
for (int i = 0; i < arr.length; i++) {
arrnew[i] = arr[i];
}
System.out.println("请输入想要添加进入的元素:");
int add = scanner.nextInt();
arrnew[arrnew.length - 1] = add;
arr = arrnew;
System.out.println("arrnew数组的元素为");
for (int i = 0; i < arrnew.length; i++) {
System.out.print(arrnew[i] + " ");
}
System.out.println();
System.out.println("添加成功,是否继续?Y\\N");
char talk = scanner.next().charAt(0);
if(talk == 'n'){
break;
}
}while(true);
System.out.println("程序结束");
}
}
/*
有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户是否继续缩减,每次缩减最后那个元素。
当只剩下最后一个元素,提示,不能再进行缩减。
定义初始数组int[] arr = {1, 2, 3, 4, 5}
定义一个新的数组 int[] arrnew = new int[arr.length - 1]
遍历arr数组,依次将arr的元素拷贝到arrnew数组
用do...while循环,循环的是arr.length,每循环一次都会变少。
故arrnew的输出循环语句为for (int i = 0; i < arr.length - 1; i++)
所以一直到arr.length==1时,则不能再进行缩减。
*/
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = {1, 2, 3, 4, 5};
do {
int[] arrnew = new int[arr.length - 1];
for (int i = 0; i < arr.length - 1; i++) {
arrnew[i] = arr[i];
}
System.out.println("arrnew数组的元素为");
for (int i = 0; i < arr.length - 1; i++) {
System.out.print(arrnew[i] + " ");
}
System.out.println();
arr = arrnew;
System.out.println("缩减成功,是否继续?Y\\N");
char talk = scanner.next().charAt(0);
if (talk == 'n') {
break;
} else if (arr.length == 1) {
System.out.println("不能再继续缩减");
break;
}
}while(true);
System.out.println("程序结束");
}
}
排序是将多个数据,依指定的顺序进行排列的过程。
排序的分类
通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样网上冒。
冒泡排序是从小到大的顺序排列。
数组[24,69,80,57,13]
数组[24,69,80,57,13]
/*
将五个无序,24,69,80,57,13使用冒泡排序法将其排成一个从小到大的有序数列。
*/
public class Example {
public static void main(String[] args) {
int[] arr = {24,69,80,57,13};
int temp = 0; //用于交换
/*分析冒泡排序
数组[24,69,80,57,13]
1.第一轮排序:目标是把最大数放在最后
第一次比较[24,69,80,57,13]
第二次比较[24,69,80,57,13]
第三次比较[24,69,57,80,13]
第四次比较[24,69,57,13,80]
*/
for(int j = 0;j < 4;j++){ //第一轮排序进行了四次比较
//如果前面的数字大于后面的数字,就交换
if(arr[j] > arr[j + 1]){
temp = arr[j]; //前面的数字赋给前面的数字
arr[j] = arr[j + 1]; //将后面的数字赋给前面的数字
arr[j + 1] = temp; //temp赋给后面的数字->前面的数字被赋给后面的数字
}
}
System.out.println("第一轮排序后:");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
for(int j = 0;j < 3;j++){ //第二轮排序进行了四次比较
if(arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第二轮排序后:");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
for(int j = 0;j < 2;j++){ //第三轮排序进行了二次比较
if(arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第三轮排序后:");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
for(int j = 0;j < 1;j++){ //第四轮排序进行了1次比较
if(arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第四轮排序后:");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
/*
将五个无序,24,69,80,57,13使用冒泡排序法将其排成一个从小到大的有序数列。
*/
public class Example {
public static void main(String[] args) {
int[] arr = {24,69,80,57,13};
int temp = 0; //用于交换
//将多轮排序使用外层循环包括起来即可
for(int i = 0;i < 4;i++){ //一共进行了四轮比较
for(int j = 0;j < 4 - i;j++){ //第一轮排序进行了四次比较
//如果前面的数字大于后面的数字,就交换
if(arr[j] > arr[j + 1]){
temp = arr[j]; //前面的数字赋给前面的数字
arr[j] = arr[j + 1]; //将后面的数字赋给前面的数字
arr[j + 1] = temp; //temp赋给后面的数字->前面的数字被赋给后面的数字
}
}
System.out.println("第" + (i + 1) + "轮排序后:");
for(int k = 0;k < arr.length;k++){
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}
/*
将五个无序,24,69,80,57,13使用冒泡排序法将其排成一个从小到大的有序数列。
*/
public class Example {
public static void main(String[] args) {
int[] arr = {24,69,80,57,13};
int temp = 0; //用于交换
//将多轮排序使用外层循环包括起来即可
for(int i = 0;i < arr.length - 1;i++){ //一共进行了四轮比较 数组的长度-1
for(int j = 0;j < arr.length - 1 - i;j++){ //第一轮排序进行了四次比较
//如果前面的数字大于后面的数字,就交换
if(arr[j] > arr[j + 1]){
temp = arr[j]; //前面的数字赋给前面的数字
arr[j] = arr[j + 1]; //将后面的数字赋给前面的数字
arr[j + 1] = temp; //temp赋给后面的数字->前面的数字被赋给后面的数字
}
}
System.out.println("第" + (i + 1) + "轮排序后:");
for(int k = 0;k < arr.length;k++){
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}
在Java中,我们常用的查找方式有两种
/*
有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏。
从键盘中任意输入一个名称,判断数列中是否包含此名称(顺序查找)
要求:如果找到了,就提示找到,并且给出其下标。
定义一个数组
接收用户输入,遍历数组,逐一比较,如果有,则提示信息,并退出。
定义index = -1,找到后index定义为i,即index为i时找到,index为-1时则没有找到。
*/
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
String[] names = {"白眉鹰王","白眉鹰王","紫衫龙王","青翼蝠王"};
Scanner scanner = new Scanner(System.in);
System.out.println("请输入想要查找的名字:");
String findName = scanner.next();
int index = -1;
for(int i = 0;i < names.length;i++){
if(findName.equals(names[i])){
System.out.println("恭喜你!找到了" + findName);
System.out.println("下标为:" + i);
index = i;
break;
}
}
if(index == -1){
System.out.println("很遗憾,没有找到" + findName);
}
}
}
从定义形式上看 int[][]
原来的一堆数组的每个元素是一对数组,就构成二维数组。
/*
请用二维数组输出如下图形
000000
001000
020300
000000
*/
public class Example {
public static void main(String[] args) {
int[][] arr = {{0,0,0,0,0,0},{0,0,1,0,0,0},{0,2,0,3,0,0},{0,0,0,0,0,0}};
for(int i = 0;i < arr.length;i++){ //遍历二维数组的每个元素
for(int j = 0;j < arr[i].length;j++){ //arr[i].length得到对应的每个一维数组的长度
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
/*
int arr[][] = {{4,6},{1,4,5,7},{-2}},遍历该二维数组,并得到和。
遍历二维数组,并将各个值累计到int sum,遍历结束输出和
*/
public class Example {
public static void main(String[] args) {
int arr[][] = {{4,6},{1,4,5,7},{-2}};
int sum = 0;
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
sum += arr[i][j];
}
}
System.out.println(sum);
}
}
类型[][] 数组名 = new 类型[大小][大小];
int[][] arr = new int[3][4];
类型 数组名[][]; //先声明
数组名 = new 类型[大小][大小]; //再定义
int arr[][]; //先声明
arr = new int[3][4]; //再定义
Java的二维数组中允许一维数组的元素个数不一样。
/*
动态创建下面的数组,并输出
1
2 2
3 3 3
一共有三个一维数组,每个一维数组的元素是不一样的
因为第0个一维数组有1个元素,故arr[i] = new int[i + 1]。以此类推
因为第0个一维数组的元素是1,故arr[i][j] = i + 1。以此类推
*/
public class Example {
public static void main(String[] args) {
//创建一个二维数组,但是只是确定一维数组的个数
int[][] arr = new int[3][]; //因为一维数组的元素个数不同,所以这里没有定义后面的大小
for(int i = 0;i < arr.length;i++){ //遍历arr的每个一维数组
arr[i] = new int[i + 1]; //给每个一维数组开空间 new,如果没有给一维数组开空间,那么arr[i]就是null
for(int j = 0;j < arr[i].length;j++){ //遍历一维数组,并给一维数组的每个元素赋值
arr[i][j] = i + 1;
}
}
//遍历arr输出
for(int i = 0;i < arr.length;i++){
//输出arr的每个一维数组
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
/*
使用二维数组打印一个10行杨辉三角。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
第1行有1个元素,第n行有n个元素。
每一行的第1个元素和最后1个元素都是1。
从第3行开始,对于非第1个元素和最后1个元素的元素的值arr[i][j]
a[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]
*/
public class Example {
public static void main(String[] args) {
int[][] YangHui = new int[10][];
for(int i = 0;i < YangHui.length;i++){
YangHui[i] = new int[i + 1];
for(int j = 0;j < YangHui[i].length;j++){
if(j == 0 || j == YangHui[i].length - 1){
YangHui[i][j] = 1;
}else {
YangHui[i][j] = YangHui[i - 1][j] + YangHui[i - 1][j - 1];
}
}
}
for(int i = 0;i < YangHui.length;i++){
for(int j = 0;j < YangHui[i].length;j++){
System.out.print(YangHui[i][j] + "\t");
}
System.out.println();
}
}
}
/*
已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如{10,12,45,90},添加23后,数组为{10,12,23,45,90}
本质是数组扩容+定位
我们先确定 添加数应该插入到哪个索引 然后扩容
先定义原数组
*/
public class Example {
public static void main(String[] args) {
int[] arr = {10,12,45,90};
int insertNum = 23;
int index = -1; //index就是要插入的位置
//遍历arr数组
//如果发现 insertNum <= arr[i] 说明i就是要插入的位置
//使用index保留index = i
//如果遍历完后没有发现 insertNum <= arr[i] 则说明index = arr.length 即添加到arr的最后
for(int i = 0;i < arr.length;i++){
if(insertNum <= arr[i]){
index = i;
break;
}
}
if(index == -1){ //说明没有找到位置
index = arr.length;
}
//扩容 先创建一个新的数组 大小arr.length + 1
int[] arrNew = new int[arr.length + 1];
for(int i = 0,j = 0;i < arrNew.length;i++){
if(i != index){ //说明可以把arr的元素拷贝到arrNew
arrNew[i] = arr[j];
j++;
} else { //如果相等 就把这个位置的数替换成插入的数
arrNew[i] = insertNum;
}
}
for(int i = 0;i < arrNew.length;i++){
System.out.print(arrNew[i] + " ");
}
}
}
/*
随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及求平均值、求最大值和最大值的下标,并查找里面是否有8
(int)(Math.random() * 100) + 1 生产随机数 1-100
*/
public class Example {
public static void main(String[] args) {
int[] arr = new int[10];
for(int i = 0; i < arr.length;i++){
arr[i] = (int)(Math.random() * 100) + 1;
}
System.out.println("arr的元素情况");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println("===========================");
System.out.println("arr的元素情况(倒序)");
for(int i = arr.length - 1;i >= 0;i--){
System.out.print(arr[i] + " ");
}
System.out.println();
double sum = arr[0];
int max = arr[0];
int maxIndex = 0;
for(int i = 1;i < arr.length;i++){
if(max < arr[i]){
max = arr[i];
maxIndex = i;
}
sum += arr[i];
}
System.out.println("===========================");
System.out.println("arr的平均值");
System.out.println(sum / arr.length);
System.out.println("===========================");
System.out.println("arr的最大值");
System.out.println(max);
System.out.println("===========================");
System.out.println("arr的最大值下标");
System.out.println(maxIndex);
System.out.println("===========================");
//并查找里面是否有8
int findNum = 8;
int index = -1;
for(int i = 0;i < arr.length;i++){
if(findNum == arr[i]){
System.out.println("查找到含有" + findNum + "下标为" + i);
index = 1;
break;
}
}
if(index == -1){
System.out.println("没有找到" + findNum);
}
}
}
/*
写一个冒泡排序
*/
public class Example {
public static void main(String[] args) {
int[] arr = {20,-1,89,2,890,7};
int temp;
for(int i = 0; i < arr.length - 1;i++){ //外层循环
for(int j = 0;j < arr.length - 1 - i;j++){ //每轮的比较次数
//如果是从小到大arr[j] > arr[j + 1]
//如果是从大到小arr[j] < arr[j + 1]
if(arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for(int i = 0;i < arr.length;i ++){
System.out.print(arr[i] + " ");
}
}
}
【Java个人自学笔记·二】韩顺平零基础学Java