目 录
1. 关键字
2. 数据类型
3. 运算符
4. 流程控制语句
6. 面向对象(Obiect Oriented Programming)
1.关键字
用于定义数据类型的关键字:
class | interface | enum | byte | short |
---|---|---|---|---|
int | long | float | double | char |
boolean | void |
用于定义流程控制的关键字:
if | else | switch | case | default |
---|---|---|---|---|
while | do | for | break | continue |
return |
用于定义访问权限修饰符的关键字:
private | protected | public |
用于定义类,函数,变量修饰符的关键字:
abstract | final | static | synchronized |
用于定义类与类之间关系的关键字:
extends | implements |
用于定义建立实例及引用实例,判断实例的关键字:
new | this | super | instanceof |
用于异常处理的关键字:
try | catch | finally | throw | throws |
用于包的关键字:
package | import |
其他修饰符关键字:
native | strictfp | transient | volatile | assert |
const | goto |
用于定义数据类型值得字面值:
true | false | null |
2.数据类型
2.1基本数据类型
整形数据类型
类型 | 占用存储空间 | 范围 | 注意点 |
---|---|---|---|
byte | 1字节(8bit) | -128~127 | |
short | 2字节 | -215~215-1 | |
int | 4字节 | -231~231-1(大约21亿) | |
long | 8字节 | -263~263-1 | 赋值时需要以l或L作为后缀 |
浮点类型
类型 | 占用存储空间 | 范围 | 注意点 |
---|---|---|---|
单精度float | 4字节 | -3.403e38~3.403e38 | 赋值时需要以f或F作为后缀 |
双精度double | 8字节 | -1.798e308~1.798308 |
字符类型
类型 | 占用存储空间 | 范围 | 注意点 |
---|---|---|---|
char | 2字节 |
布尔类型
类型 | 占用存储空间 | 取值 | 注意点 |
---|---|---|---|
boolean | 1字节 | true false |
自动类型提升:
byte 、 short 、char ---> int ---> long ---> float ---> double
强制类型转换:
格式:数据类型1 变量名 = (数据类型1)被强制转换的数据
2.2引用数据类型
类(class) 、 数组(array) 、 接口(interface) 、 枚举(enum) 、 注解(annotation) 、 记录(record)
3.运算符
按照功能分类
算术运算符(7个)
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 加(正号) | 5+5 ; +5 | 10 ; 5 |
- | 减(负号) | 6-4 ; -5 | 2 ; -5 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取余(取模) | 7%5 | 2 |
++ | 自增 | a=1; b=1; a++ ; ++b; | a=1 ; b=2 |
-- | 自减 | a=1; b=1; a-- ; --a; | a=1 ; b=0 |
+ | 字符串连接符 | "Hell"+"o" | "Hello" |
赋值运算符(12个)
赋值运算符 | 符号解释 |
---|---|
+= | 将符号左边的值和右边的值做相加操作,最后将结果赋值给左边的变量 |
-= | 将符号左边的值和右边的值做相减操作,最后将结果赋值给左边的变量 |
*= | 将符号左边的值和右边的值做相乘操作,最后将结果赋值给左边的变量 |
/= | 将符号左边的值和右边的值做相除操作,最后将结果赋值给左边的变量 |
%= | 将符号左边的值和右边的值做取余操作,最后将结果赋值给左边的变量 |
比较运算符(6个)
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
instanceof | 检查是否是类的对象 | "Hello" instanceof String | true |
逻辑运算符(6个)
位运算符(7个)
条件运算符(1个)
三元运算符:格式:(条件表达式) ? true 表达式1 : false 表达式2
Lambda运算符(1个)
->
4.流程控制语句
程序设计中规定三种流程结构
- 顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转
- 分支结构
- 根据条件,选择性地执行某行代码。
- if-ellse 和 switch-case两种分支语句
- 循环结构
- 根据循环条件,重复性的执行某段代码
- 有for 、 while 、do-while三种循环语句
- 补充:JDK1.5提供了foreach循环,方便的变量集合、数组元素
4.1 if else
1. 格式1
if(条件表达式){
语句块1;
}
2. 格式2
if(条件表达式){
语句块1;
}else{
语句块2;
}
3. 格式3
if(条件表达式){
语句块1;
}else if(条件表达式2){
语句块2;
}
. . .
}else if(条件表达式n){
语句块n;
}else{
语句块n+1;
}
案例:
public class IfElseTest {
public static void main(String[] args){
//案例1:判断心跳是否正常
int heart = 89;
if ((heart >= 60) & (heart<= 100) ){
System.out.println("心跳属于正常!");
}else{
System.out.println("心跳不正常!");
}
//案例2:判断一个数是奇数还是偶数
int num = 10;
if (num % 2 == 0){
System.out.println(num+"是偶数!");
}else{
System.out.println(num+"奇数");
}
//案例3:考试成绩打分
int grade = 60;
if (grade ==100 ){
System.out.println("奖励一辆跑车");
}else if (grade > 80 && grade <= 99){
System.out.println("奖励一辆山地自行车");
}else if (grade > 60){
System.out.println("奖励环球影城一日游");
}else{
System.out.println("胖揍一顿");
}
//案例4:三个数排序
int num1 = 123;
int num2 = 234;
int num3 = 235;
if (num1>num2){
if (num3 > num1) {
System.out.println(+num2+num1+num3);
}else if (num3 < num2){
System.out.println(num1+","+num2+","+num3);
}else{
System.out.println(num2+","+num3+","+num1);
}
}else{
if (num3 >num2 ){
System.out.println(num1+","+num2+","+num3);
}else if (num3 <= num1){
System.out.println(num3+","+num1+","+num2);
}else{
System.out.println(num1+","+num3+","+num2);
}
//案例5:交换大小
int small = 10;
int big = 9;
if (small > big){
int temp = small;
small = big;
big = temp;
}
System.out.println(big+","+small);
//案例6:判断两数之和
int num4 = 22,num5 = 32;
if ((num4+num5)>50){
System.out.println("hello world");
}
}
}
}
4.2 Scanner类从键盘获取数据
- 使用Scanner从键盘上获取不同类型的变量步骤:
-
- 导包 import java.util.Scanner
-
- 提供(或创建)一个Scanner类的实例
-
- 调用Scanner类中的方法,获取指定类型的变量
-
- 关闭资源,调用Scanner类的close()
//导包
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args){
System.out.println("hello!欢迎来到交友网站!");
//提供一个Scanner类的实例
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的网名:");
//调用Scanner类中的方法,获取指定的类型的变量
String name = scanner.next();
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.print("请输入你的体重:");
double weight = scanner.nextDouble();
System.out.print("请输入你的是否单身?true:单身 false:不单身:");
boolean single = scanner.nextBoolean();
System.out.print("请输入你的性别:(男\\女)");
char gender = scanner.next().charAt(0);
System.out.println("网名:"+name+"年龄:"+age+"体重:"+"是否单身:"+single+"性别:"+gender);
System.out.println("注册完成欢迎!来到交友网站.");
scanner.close(); //关闭资源
}
}
4.3 获取一个随机数
random()调用后会返回一个[0.0,1.0)范围的double型的随机数
公式:(int)(Math.random() * (b - a -1)) + a
//获取一个[a,b]范围的随机整数
// (int)(Math.random() * (b - a -1)) + a
public class RandomTest {
public static void main(String[] args){
double d1 = Math.random(); //0.0到1.0
System.out.println("d1 ="+d1);
int b1 = (int) (Math.random()*101); //0到100
System.out.println("b1:"+b1);
int b2 =(int) (Math.random()*100)+1; //1到100
System.out.println("b2:"+b2);
int b3 = (int)(Math.random()*(70+1))+10; //10到80
System.out.print("b3:"+b3);
}
}
4.4 switch-case
语法格式
/*
语法格式:
switch(表达式){
case 常量1:
执行语句1;
break;
case 常量2:
执行语句3;
break;
. . .
default:
执行语句2;
break;
}
*/
import java.util.Scanner;
public class SwitchCaseExpr {
public static void main(String[] args){
int score1 = (int)(Math.random()*6)+1;
int score2 = (int)(Math.random()*6)+1;
int score3 = (int)(Math.random()*6)+1;
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的选择:豹子,大,小:");
String a = scan.next();
boolean result = false;
switch (a){
case "豹子" -> result = (score1==score2) && (score2==score3);
case "大" -> result = (score1 + score2 + score3 > 9);
case "小" -> result = (score1+score2+score3 <=9);
default -> System.out.println("输入有误请重新输入!");
}
System.out.printf("%d,%d,%d" ,score1,score2,score3);
System.out.println("结果:"+(result?"猜对了!":"猜错了!"));
}
}
说明:switch中的表达式只能是特定类型的数据类型。如下:byte 、 short 、 char 、 int 、 枚举 (JDK5.0新增)、String(JDK7.0)
public class SwitchCaseTest {
public static void main(String[] args){
int num = 4;
switch(num){
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
break;
case 2:
System.out.println("two");
break;
case 3:
System.out.println("three");
break;
default:
System.out.println("other");
}
String season = "summer";
switch (season){
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎");
break;
case "winter":
System.out.println("冬雪皑皑");
break;
case "autumn":
System.out.println("秋高气爽");
break;
default:
System.out.println("季节输入有误");
break;
}
}
}
4.5 for循环
/*
格式:
for(初始化条件;循环条件;迭代部分){
循环体
}
*/
public class ForTest1_shuixianhua {
public static void main(String[] args){
for(int i = 100;i<=999;i++){
int m = i %10;
int n = (i % 100) / 10;
int a = i / 100;
if (m*m*m+n*n*n+a*a*a==i){
System.out.print(i+" ");
}
}
}
}
4.6 while循环
//计算一张纸折多少次可以超过珠峰的高度
/*
格式:
初始化条件
while(循环条件){
循环体
迭代部分
}
*/
public class WhileTest2 {
public static void main(String[] args){
double paper = 0.1;
double zf = 8848860;
int count = 0;
while (paper<=zf){
paper *=2;
count++;
}
System.out.println("折纸的厚度为"+paper/1000+"米");
System.out.println("一共折纸"+count+"次");
}
}
//猜数字
import java.util.Scanner;
public class WhileTest1 {
public static void main(String[] args){
//1. 生成一个[1,100]的随机整数
int random = (int)(Math.random()*100)+1;
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个100以内的数:");
//2. 使用Scanner,从键盘获取数据
int guess = scan.nextInt();
int count= 1;
//3.使用循环结构,进行多次循环的对比和获取数据
while (guess != random ){
if (guess>random){
System.out.println("你输入的数偏大!");
}else{
System.out.println("你输入的数偏小!");
}
count++;
System.out.print("请输入一个100以内的数:");
guess = scan.nextInt();
}
System.out.println("猜的数为:"+random);
System.out.println("一共猜了"+count+"次");
}
}
4.7 do-while循环
说明:do-while循环至少执行一次循环体
/*
格式:
初始化部分;
do{
循环体部分
迭代部分
}while(循环条件部分)
*/
//模拟ATM取款
import java.util.Scanner;
public class DoWhileTest1 {
public static void main(String[] args){
int balance = 0; //用户余额,显示用户余额
boolean flag= true; //用于判断是否结束
Scanner scan = new Scanner(System.in);
do{
System.out.println("========ATM=======");
System.out.println("1.存款");
System.out.println("2.取款");
System.out.println("3.显示余额");
System.out.println("4.退出");
System.out.print("请选择(1-4):");
int choice = scan.nextInt();
switch(choice) {
case 1:
System.out.println("请输入存款金额:");
int put = scan.nextInt(); //从键盘获取存储的金额
if (put>0){
balance += put;
}
break;
case 2:
System.out.println("请输入取款金额:");
int get = scan.nextInt(); //从键盘获取取款金额
if (get>0 && balance>get){
balance -= get;
}else{
System.out.println("您输入的信息有误或余额不足!");
}
break;
case 3:
System.out.println("您当前的余额为:"+balance);
break;
case 4:
flag = false;
break;
default:
System.out.println("输入有误请重新输入!");
}
}while(flag);
}
}
5. 数组
数组的特点:
- 数组本身是引用数据类型,但是数组中的元素可以是任何数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小取决于数组的长度和数组中的元素的类型。
- 数组中的元素在内存中是依次紧密排列的,有序的。
- 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定就不能修改。
- 可以通过数组的下标(或索引)的方式调用指定位置的元素,速度很快。
- 数组名中引用的是这块连续空间的首地址。
案例:杨辉三角形的构造
public class YangHui {
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];
//给数组的元素赋值
//给每行首末元素为1
yanghui[i][0]=1;
yanghui[i][i] = 1;
//给非首行末赋值
for (int j = 1; j < yanghui[i].length-1; j++) {
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();
}
}
}
5.1 一维数组的基本使用
public class Basic_use {
public static void main(String[] args) {
//1. 数组的声明与初始化
//1.1 声明数组
double[] prices;
//1.2 初始化数组
//静态初始化:数组变量与数组元素赋值同时进行
prices = new double[]{20,23,24,25,26};
String[] foods;
//动态初始化:分开进行
foods = new String[5];
//其他正确的写法
int arr[] = new int[4];
int[] arr1 = {1,2,3,4}; //类型推断
//2. 数组元素的调用
//通过角标的方式来获取
System.out.println(prices[0]);
System.out.println(prices[1]);
System.out.println(prices[2]);
System.out.println(prices[3]);
System.out.println(prices[4]);
// System.out.println(prices[5]); 报异常: ArrayIndexOutOfBoundsException
foods[0] = "拌海蜇";
foods[1] = "龙须菜";
foods[2] = "炝冬笋";
foods[3] = "玉米片";
foods[4] = "酱茄子";
// foods[5] = "酱茄子"; 报异常: ArrayIndexOutOfBoundsException
//3. 数组的长度:用来描述数组中容量的大小
System.out.println(foods.length);
//4. 遍历数组
for(int i =0;i<foods.length;i++)
System.out.println(foods[i]);
for (int i = 0; i < prices.length; i++) {
System.out.println(prices[i]);
}
}
}
案例:
import java.util.Scanner;
public class ArrayTest {
public static void main(String[] args) {
String arr1[] = {"Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday","Sunday"};
Scanner scan= new Scanner(System.in);
boolean isOut = true;
do{
System.out.print("请输入1-7(代表星期数)0代表退出:");
int choice = scan.nextInt();
switch(choice){
case 0:
System.out.println("退出!");
isOut = false;
break;
case 1:
System.out.println(arr1[0]);
break;
case 2:
System.out.println(arr1[1]);
break;
case 3:
System.out.println(arr1[2]);
break;
case 4:
System.out.println(arr1[3]);
break;
case 5:
System.out.println(arr1[4]);
break;
case 6:
System.out.println(arr1[5]);
break;
case 7:
System.out.println(arr1[6]);
break;
}
}
while(isOut);
System.out.print("请输入1-7的数值:");
int choice = scan.nextInt();
if (choice >7 ||choice<1){
System.out.println("输入有误!");
}else{
System.out.println(arr1[choice-1]);
}
scan.close();
}
}
//随机赋值,要求数各不相同
public class ArrayTest4 {
public static void main(String[] args) {
int[] arr = new int[6];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*30)+1;
boolean flag = false;
while(true){
for (int j = 0; j < i; j++) {
if(arr[j]==arr[i]){
flag = true;
break;
}
}
if (flag){
arr[i] =(int) (Math.random()*30)+1;
flag= false;
// continue;
}
break;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}
5.2 二维数组的基本使用
public class TwoArrayBasic {
public static void main(String[] args) {
//1. 数组的声明与初始化
//静态初始化
int[][] arr1 = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8, 9}};
//动态初始化
String[][] arr3 = new String[3][4];
double[][] arr4 = new double[3][];
//其他正确写法
int arr5[][] = new int[][]{{1,2,3},{3,4},{5,6,7}};
int[] arr6[] = new int[][]{{1,2,3},{3,4},{5,6,7}};
int arr7[][] = {{1,2,3},{3,4},{5,6,7}}; //类型推断
//2. 数组元素调用
//调用内层元素
System.out.println(arr1[1][1]);
System.out.println(arr1[0][0]);
System.out.println(arr1[2][1]);
//调用外层元素
System.out.println(arr1[0]);
System.out.println(arr1[1]);
arr3[0][1] = "Tom";
System.out.println(arr3[0][1]);
//3. 数组的长度
System.out.println(arr1.length);
System.out.println(arr1[1].length);
//4. 遍历数组
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j]);
}
System.out.println();
}
System.out.println(Arrays.toString(arr1[1]));
//5. 初始化值
int[][] arr8 = new int[3][2];
System.out.println(arr8[0]); //地址
System.out.println(arr8[0][0]); //0
}
}
案例:
//遍历二维数组中的元素,求和
public class TwoArrayTest {
public static void main(String[] args) {
//静态初始化
int[][] arr1 = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
int sum =0; //记录总和
for (int i=0;i<arr1.length;i++) {
for (int j = 0; j < arr1[i].length; j++) {
sum += arr1[i][j];
}
}
System.out.println("总和为:"+sum);
}
}
5.3 数组的常见操作(特征值统计、复制、反转、扩容与缩容、查找、排序)
5.3.1 数组的常见操作之特征值统计
//数组常见命令
public class ArrayCommonOperation {
public static void main(String[] args) {
//1. 动态初始化方式创建数组
int[] arr1 = new int[10];
//2. 通过循环给数组元素赋值
for (int i=0;i<arr1.length;i++){
arr1[i] = (int) (Math.random()*(99-10+1))+10;
System.out.print(arr1[i]+" ");
}
System.out.println();
//3. 求最大值
int max = arr1[0];
for (int i=1;i<arr1.length;i++){
if (max<arr1[i]){
max = arr1[i];
}
}
System.out.println("最大值"+max);
//4.求最小值
int min =arr1[0];
for (int i = 1; i < arr1.length; i++) {
if (min > arr1[i]){
min = arr1[i];
}
}
System.out.println("最小值"+min);
//5. 求和
int sum =0;
for (int i = 0; i < arr1.length; i++) {
sum += arr1[i];
}
System.out.println("总和为:"+sum);
//6. 求平均值
int avgValue = sum / arr1.length;
System.out.println("平均值为:"+avgValue);
}
}
5.3.2 数组的常见操作之复制
//数组的复制
public class ArrayCopy {
public static void main(String[] args) {
//创建两个数组
int[] arr1,arr2;
//初始化数组
arr1 = new int[]{2,3,5,7,11,13,17,19};
//显示arr1
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
System.out.println();
//复制arr2等于arr1,修改偶索引使得值与下标相同
// arr2 = arr1; 赋值
arr2 = new int[arr1.length]; //通过遍历去复制
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
//偶下标修改下标
for (int i = 0; i < arr2.length; i++) {
if(i%2==0){
arr2[i] =i;
}
System.out.print(arr2[i]+"\t");
}
System.out.println();
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
}
}
5.3.3 数组的常见操作之反转
//数组反转
public class ArrayRe {
public static void main(String[] args) {
// 定义一个arr数组
int[] arr = new int[]{34,54,3,2,65,34,76};
//遍历
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
//反转操作
//方法1
for(int i=0;i<arr.length/2;i++){
int temp = arr[i];
arr[i] = arr[arr.length-i-1];
arr[arr.length-i-1] = temp;
}
//遍历
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
System.out.println();
//方法2
int[] arr2 = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[arr.length-i-1];
System.out.print(arr2[i]+"\t");
}
//方式3
for (int i = 0,j =arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
System.out.println();
//遍历
for (int i = 0; i <arr.length ; i++) {
System.out.print(arr[i]+"\t");
}
}
}
5.3.4 数组的常见操作之扩容与缩容
//数组扩缩容
public class ArrayExpandReduce {
public static void main(String[] args) {
int[] arr1= new int[]{1,2,3,4,5};
//扩容arr1
int[] arr2 = new int[arr1.length<<1];
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
//将10,20,30三个数据添加到新数组中
arr2[arr1.length] = 10;
arr2[arr1.length+1] = 20;
arr2[arr1.length+2] = 30;
String[] arr6 = new String[arr1.length<<1];
String[] arr7 = new String[]{"1","3","9","f"};
for (int i = 0; i < arr7.length; i++) {
arr6[i] = arr7[i];
System.out.print(arr6[i]+"\t");
}
System.out.println();
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]+"\t");
}
//将新的地址赋值给arr1
arr1 = arr2;
System.out.println();
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
System.out.println();
//缩容
int[] arr3= new int[]{1,2,3,4,5,6,7};
int deleteIndex = 4;
//复制一个arr3
int[] arr5 = new int[arr3.length];
for (int i = 0; i < arr3.length; i++) {
System.out.print(arr3[i]+"\t");
arr5[i] = arr3[i];
}
System.out.println();
//缩 方式1
for (int i = deleteIndex; i < arr3.length-1; i++) {
arr3[i] = arr3[i+1];
}
//修改最后元素,设置默认值
arr3[arr3.length-1] = 0;
for (int i = 0; i < arr3.length; i++) {
System.out.print(arr3[i]+"\t");
}
//缩 方式2
//创建一个长度少一个的数组
int[] arr4 = new int[arr5.length-1];
for (int i = 0; i < deleteIndex; i++) {
arr4[i] = arr5[i];
}
for (int i = deleteIndex; i < arr5.length-1; i++) {
arr4[i] = arr5[i+1];
}
System.out.println();
for (int i = 0; i < arr4.length; i++) {
System.out.print(arr4[i]+"\t");
}
}
}
5.3.5 数组的常见操作之查找
//数组查找
public class ArraySearch {
public static void main(String[] args) {
int[] arr1 = new int[]{34,54,3,2,65,7,34,5,76,34,67};
int target = 1;
// target = 34;
//方式1
//查找方式:线性查找 执行效率低
boolean isFlag = true;
for (int i = 0; i < arr1.length; i++) {
if(target == arr1[i]){
System.out.println("找到了"+target+",对应位置:"+i);
isFlag = false;
break;
}
}
if(isFlag){
System.out.println("不好意思没有找到此元素!");
}
//方式2
int i = 0;
for (; i < arr1.length; i++) {
if(target == arr1[i]){
System.out.println("找到了"+target+",对应位置:"+i);
// isFlag = false;
break;
}
}
if(i == arr1.length){
System.out.println("不好意思没有找到此元素!");
}
//方式3
//查找方式:二分法
int[] arr2 = new int[]{2,4,5,8,12,15,19,26,37,49,51,66,89,100};
target = 99;
// target = 5;
int head = 0; //默认首索引
int end = arr2.length-1; //默认尾索引
boolean isFlag1 =false; //默认没有找到
while(head<=end){
int middle = (head +end)/2;
if(target ==arr2[middle]){
System.out.println("找到了"+arr2[middle]+",位置为:"+middle);
isFlag1 = true;
break;
}else if (target>arr2[middle]){
head = middle +1;
}else{
end = middle-1;
}
}
if(!isFlag1){
System.out.println("不好意思,未找到!");
}
}
}
5.3.6 数组的常见操作之排序
public class ArraySort {
public static void main(String[] args) {
//冒泡排序 bubble sort
//遍历原数组
int[] arr1 = new int[]{34,54,3,2,65,7,34,67};
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]+"\t");
}
System.out.println();
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1.length-1-i; j++) {
if(arr1[j]>arr1[j+1]){
int temp = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1] = temp;
}
}
}
System.out.println();
for (int j = 0; j < arr1.length; j++) {
System.out.print(arr1[j]+"\t");
}
}
}
6. 面向对象(Obiect Oriented Programming)
学习面向对象的三条主线
- java类及类的成员:属性、方法、构造器;代码块、内部类
- 面向对象的特征:封装、继承、多态、(抽象)
- 其他关键字的使用:this、super、package、import、static、final、abstract等
面向对象编程有两个核心的概念:类(Class)、对象(Object)
- 类:具有相同特征的事物的抽象描述,是'抽象的'、概念上的定义。
- 对象:实际存在的该类事物的'每个个体',是'具体的',因而也称为'实例(instance)'。
6.1 类的成员概述
面向对象程序设计的重点是类的设计
类的设计,其实就是类的成员的设计
类,是一组相关属性和行为的集合,也是类最基本的两个成员。
- 属性:该类事物的状态信息。对应类中的成员变量
- 成员变量<=>属性<=>Field
- 行为:该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
- 成员方法<=>函数<=> Method
面向对象完成具体功能的操作:
- 步骤1:创建类,并设计类的内部成员(属性、方法)
- 步骤2:创建类的对象。比如: Phone p1 = new Phone();
- 格式:类类型 对象名 = new 对象实体;
- 步骤3:通过对象,调用其内部声明的属性和方法,完成相关的功能
案例:
public class Phone{
//属性
double price ; //价格
String name; //品牌
//方法
public void call(){
System.out.println("手机能够拨打电话!");
}
public void sendMessage(String message){
System.out.println("发送信息"+message);
}
public void playGame(){
System.out.println("手机可以玩游戏");
}
}
//面向对象 Object-Oriented Programming
//步骤 1.创建类,并设计类的内部成员(属性、方法)
// 2.创建类的对象 如:Phone p1 = new Phone[];
// 3.通过Phone的对象,调用其内部的属性何方法,完成相应的功能
public class BasicKnowledge {
public static void main(String[] args){
//创建Phone对象
Phone p1 = new Phone();
//通过Phone的对象,调用其内部声明的属性何方法
//格式:”对象.属性“ ”对象.方法“
p1.name = "huawei mate50";
p1.price = 6999;
System.out.println("name="+p1.name+",price="+p1.price);
//调用方法
p1.call();
p1.sendMessage("有内鬼终止交易!");
p1.playGame();
//创建对象(类的实例化)
Person p2 = new Person();
// 显示默认值
// System.out.println("name = "+p2.name+",age = "+p2.age+",gender = "+ p2.gender);
//通过对象去调用属性方法
p2.name = "Tom";
p2.age = 18;
p2.gender = '男';
System.out.println("name = "+p2.name+",age = "+p2.age+",gender = "+ p2.gender);
//方法
p2.eat();
p2.sleep(8);
p2.interests("画画");
//在创建一个Person对象
Person p3 = new Person();
p3.name = "露丝";
p3.age = 19;
p3.gender = '女';
System.out.println("name = "+p3.name+",age = "+p3.age+",gender = "+ p3.gender);
}
}
6.1.1 类的成员之属性
属性的其他称谓:成员变量、属性、field、字段域
成员变量和局部变量的区别:
相同点:
- 声明变量的格式相同:数据类型 变量名 = 变量值
- 有作用域
- 先声明再使用
不同点:
- 类中声明的位置不同
- 属性:声明在类内,方法外的变量
- 局部变量:声明方法、构造器内部的变量
- 在内存中的分配的位置不同
- 属性:随着对象的创建,存储在堆空间中
- 局部变量:存储在栈空间中
- 生命周期
- 属性:随着对象的创建而创建,随着对象的消亡而消亡
- 局部变量:随着方法对应的栈帧,随着方法对应的栈帧出栈而消亡
- 作用域
- 属性:在整个类的内部有效
- 局部变量:仅限于声明此局部变量所在的方法(或构造器、代码块)中
- 是否可以有权修饰符进行修饰
- 权限修饰符:public、protected、缺省、private
- 属性:可以使用权限修饰符进行修饰
- 局部变量:不能使用任何权限修饰符
- 是否有默认值
- 属性:都有默认初始化值
- 局部变量:没有默认初始化值
- 注意:针对方法的形参而言,在调用方法时,给此形参赋值即可。
举例
public class Field {
public static void main(String[] args) {
Person1 p1 = new Person1();
p1.age = 21;
System.out.println(p1.age);
p1.eat();
p1.sleep(19);
}
}
class Person1{
//属性(成员变量)
String name;
int age;
char gender;
//方法
public void eat(){
String food = "宫保鸡丁"; //局部变量
System.out.println("我喜欢吃"+food);
System.out.println("name="+name);
}
public void sleep(int hour){ //形参:属于局部变量
System.out.println("人不能小于"+hour+"小时的睡眠");
}
}
public class Employee {
//属性
int id; //编号
String name; //姓名
int age; //年龄
double salary; //薪资
}
//声明一个员工类Employee,包括属性:编号id,姓名name,年龄age,薪资salary
//声明一个EmployeeTest测试类,并在main方法中,创建两个员工对象,并为属性赋值,并打印两个员工信息
public class EmployeeTest {
public static void main(String[] args) {
//创建类的对象(创建类的实例,类的实例化)
Employee emp1 = new Employee();
System.out.println(emp1); //类型@地址值
emp1.id = 1001;
emp1.age = 19;
emp1.name = "小熙";
emp1.salary = 2000;
System.out.println("id="+emp1.id+"\tname="+emp1.name+"\tage ="+emp1.age+"\tsalary="+emp1.salary);
//在创建一个Employee对象
Employee emp2 = new Employee();
emp2.id = 1002;
emp2.age = 20;
emp2.name = "小罗";
emp2.salary = 2000;
System.out.println("id = "+emp2.id+"\tname = "+emp2.name+"\tage = "+emp2.age+"\tsalary="+emp2.salary);
}
}
6.1.2 类的成员之方法
方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也被称为'函数'或'过程'。
方法的好处:实现代码的重用,减少冗余,简化代码
方法必须先声明再使用,定义在类的内部
方法中可以调用类中的方法或属性,不可以在方法内部定义方法
注意:
- Java里的方法'不能独立存在',所有的方法必须定义在类里
- Java中的方法不能调用,不执行。每调用一次,就执行一次
- 方法内可以调用本类中的(其他)方法或属性
- 方法内不能定义方法
//类成员之一:方法
/*
* 方法声明的格式:
* 权限修饰符 [其他修饰符] 返回值类型 方法名(形参列表)[throws 异常类型]{ //方法头
* 方法体
* }
* 权限修饰符:private 缺省 protected public (权限从小到大)
* 返回值类型:描述当调用完方式后,是否需要返回一个结果
* 分类:
* 无返回值类型:用void表示即可。比如:System.out.println(x)的println()方法
* 有返回值类型:基本数据类型 引用类型
* 方法名:见明知意,属于标识符
* 形参列表:属于局部变量,且可以声明多个。
* 格式:方法名(形参1,形参2...)
*return作用:1.结束方法的同时,用于返回数据给调用的者 2.结束方法
*
* 方法调用解析:
* 形参:方法在声明时,一对()内声明的一个或多个形式参数
* 实参:方法在被调用,实际传递给形参的变量或常量
* */
public class Method {
public static void main(String[] args) {
//好处:是类或对象行为特征的抽象,用来完成某个功能操作。
//减少了代码冗余,简化代码,代码重用。
Person p1 = new Person();
p1.name = "荼茶";
System.out.println(p1.name);
System.out.println(p1.interests("羽毛球"));
}
}
class Person{
//属性
String name;
int age;
//方法
public void eat(){
System.out.println("人吃饭");
}
public void sleep(int hour){
System.out.println("人至少每天睡眠"+hour+"小时");
}
public String interests(String hobby){
String info = "我的爱好是:"+hobby;
System.out.println(info);
return info;
}
public int getAge(){
int age = 19;
return age;
}
}
public class Employee {
//属性
int id; //编号
String name; //姓名
int age; //年龄
double salary; //薪资
//定义一个方法,用于显示员工的属性信息
public void show(){
System.out.println("id="+id+"\tname="+name+"\tage ="+age+"\tsalary="+salary);
}
}
//声明一个员工类Employee,包括属性:编号id,姓名name,年龄age,薪资salary
//声明一个EmployeeTest测试类,并在main方法中,创建两个员工对象,并为属性赋值,并打印两个员工信息
public class EmployeeTest {
public static void main(String[] args) {
//创建类的对象(创建类的实例,类的实例化)
Employee emp1 = new Employee();
System.out.println(emp1); //类型@地址值
emp1.id = 1001;
emp1.age = 19;
emp1.name = "小熙";
emp1.salary = 2000;
emp1.show();
//在创建一个Employee对象
Employee emp2 = new Employee();
emp2.id = 1002;
emp2.age = 20;
emp2.name = "小罗";
emp2.salary = 2000;
// System.out.println("id = "+emp2.id+"\tname = "+emp2.name+"\tage = "+emp2.age+"\tsalary="+emp2.salary);
emp2.show();
}
}
封装了方法的例子
数组的常用算法,使用了类的方法
import java.util.Arrays;
/**
* ClassName:CommonArrayOperations
* Package:Method.Test
* Description:
*
* @Author: pluto
*/
public class CommonArrayOperations {
/**
* 数组的常见操作
* @param args
*/
public static void main(String[] args) {
CommonArrayOperations arrs = new CommonArrayOperations();
int[] arr = new int[]{34,253,2354,87,98,64,2344,134,90};
//求最大值
System.out.println("最大值:"+arrs.getMax(arr));
//求最小值
System.out.println("最小值:"+arrs.getMin(arr));
//求和
System.out.println("求和:"+arrs.getSum(arr));
//求平均值
System.out.println("平均值:"+arrs.getAvg(arr));
//打印
arrs.print(arr);
//排序
arrs.sort(arr);
System.out.println();
System.out.println(Arrays.toString(arr));
//查找
System.out.println(arrs.search(arr, 90));
}
/**
* 获取int[]数组的最大值
* @param arr 要获取最大值的数组
* @return 数组的最大值
*/
public int getMax(int[] arr){
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if(max<arr[i]){
max = arr[i];
}
}
return max;
}
/**
* 获取int[]数组的最小值
* @param arr 要获取最小值的数组
* @return 数组的最小值
*/
public int getMin(int[] arr){
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
if(min>arr[i]){
min = arr[i];
}
}
return min;
}
/**
* 获取数据的和
* @param arr 要获取和的数组
* @return 数组的和
*/
public int getSum(int[] arr){
int sum =0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
/**
* 获取数组的平均值
* @param arr 要获取平均值的数组
* @return 数组的平均值
*/
public int getAvg(int[] arr){
int avg = 0;
avg = getSum(arr)/arr.length;
return avg;
}
/**
* 打印输出数组
* @param arr 要打印的数组
*/
public void print(int[] arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i ==0){
System.out.print(arr[i]);
}else{
System.out.print(","+arr[i]);
}
}
System.out.print("]");
}
/**
* 复制数组
* @param arr 要复制的数组
* @return 数组的复制值
*/
public int[] copy(int[] arr){
int[] arr1 = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr1[i] = arr[i];
}
return arr1;
}
/**
* 获取数组的反转值
* @param arr 要反转的数组
*/
public void reverse(int[] arr){
for (int i =0,j=arr.length-1; i <j; i++,j--) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
/**
* 重新排序数组
* @param arr 要排序的数组
*/
public void sort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]>arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
/**
* 使用线性查找指定元素
* @param arr 要查找的数组
* @param choice 要查早的元素
* @return choice在数组中的位置。若为找到,则返回-1
*/
public int search(int[] arr,int choice){
boolean isFlag = false;
for (int i = 0; i < arr.length; i++) {
if(choice ==arr[i]){
isFlag = true;
return i;
}
}
//没有找到
return -1;
}
}
案例
public class Student {
//属性
int number; //学号
int state; //年纪
int score; //成绩
//声明一个方法,显示学生的属性信息
public String show(){
return "学号:"+number+"年级:"+state+"分数:"+score;
}
}
public class StudentUtil {
/**
* 根据指定年级打印学生信息
* @param students 要打印的学生数组
* @param state 指定的年级
*/
public void printStudentWithState(Student[] students,int state){
for (int i = 0; i < students.length; i++) {
if(students[i].state==state){
Student stu = students[i];
System.out.println(stu.show());
}
}
}
/**
* 打印学生数组
* @param students 要打印的学生数组
*/
public void printStudents(Student[] students){
for (int i = 0; i < students.length; i++) {
System.out.println(students[i].show());
}
}
/**
* 针对学生数组的成绩按照冒泡排序
* @param students 要排序的数组
*/
public void sortStudents(Student[] students){
for (int i = 0; i < students.length-1; i++) {
for (int j = 0; j < students.length-1-i; j++) {
if(students[j].score>students[j+1].score){
Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
}
public class StudentTest {
public static void main(String[] args) {
//创建一个Student[]对象
Student[] students = new Student[20];
//循环,为数组赋值
for (int i = 0; i < students.length; i++) {
students[i] = new Student();
//给每个学生对象的numder,state,score赋值
students[i].number = i+1;
students[i].state = (int) (Math.random()*6)+1;
students[i].score = (int) (Math.random()*101);
}
//打印年纪为3的学生信息
StudentUtil util = new StudentUtil();
util.printStudentWithState(students,3);
//使用冒泡排序按学生成绩排序,并遍历所有学生信息
//排序前遍历
util.printStudents(students);
System.out.println("---------------------------");
util.sortStudents(students);
//排序后的遍历
util.printStudents(students);
}
}
6.1.2.1 方法的应用之重载
方法重载:在同一个类中,允许存在一个以上的同名方法,只要他们的参数列表不同即可
参数列表不同,意味着参数个数或参数类型的不同(包括顺序不同)。 两同一不同:同一类,相同方法名。参数列表不同。
public class OverLoad {
//定义三个重载方法,方法名为mOL
public void mOL(int num){
System.out.println(num*num);
}
public void mOL(int num1,int num2){
System.out.println(num1*num2);
}
public void mOL(String message){
System.out.println(message);
}
//定义三个重载方法
public int max(int num1,int num2){
return (num1>num2)?num1:num2;
}
public double max(double d1,double d2){
return (d1>d2)?d1:d2;
}
public double max(double d1,double d2,double d3){
double tempMax = max(d1,d2);
return max(tempMax,d3);
}
}
6.1.2.2 方法的应用之可变个数形参
可变个数形参的方法在调用时,针对于可变的形参的实参的个数可以为:0个、1个或多个
可变个数形参的方法与同一类中,同名的方法之间可以构成重载
特例:可变个数形参的方法与同一类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载
格式:
+ (参数类型 ... 参数名)
public class VaribleArgument {
public static void main(String[] args) {
VaribleArgument test = new VaribleArgument();
String info = test.concat("-","hello","男","World");
System.out.println(info);
System.out.println(test.concat("/"));
System.out.println(test.concat("*"));
System.out.println(test.concat("-"));
System.out.println(test.concat("/","Hello"));
}
public String concat(String operator,String ... strs){
String result = "";
for (int i = 0; i < strs.length; i++) {
if(i==0){
result +=strs[i];
}else{
result +=(operator+strs[i]);
}
}
return result;
}
}
6.1.2.3 方法的应用之方法值传递机制的剖析
基本数据类型的变量,将变量保存的值传递出去
引用数据类型的变量,将变量保存的地址值传递出去
public class ValueTransferTest {
public static void main(String[] args) {
//1. 基本数据类型的局部变量
int m = 10;
int n = m;
System.out.println("m = "+m+"\t"+"n = "+n); // m=10 n =10
m++;
System.out.println("m = "+m+"\t"+"n = "+n); // m=11 n =10
//2. 引用数据类型的局部变量
//2.1 数组类型
int[] arr1 = new int[]{1,2,3,4,5};
int[] arr2 = arr1;
arr2[0] = 10;
System.out.println(arr1[0]); //10
//2.2 对象类型
Order order1 = new Order();
order1.orderID = 1001;
Order order2 = order1;
order2.orderID = 1002;
System.out.println(order1.orderID); //1002
}
}
class Order{
int orderID;
}
案例
public class ValueTransferTest1 {
public static void main(String[] args) {
ValueTransferTest1 test = new ValueTransferTest1();
//1. 对于基本数据类型的变量来说
int m = 10;
test.method1(m);
System.out.println("m = "+m); //10
//2. 对于引用数据类型的变量
Person p = new Person();
p.age = 10;
test.method2(p);
System.out.println(p.age); //11
}
public void method1(int m){
m++;
}
public void method2(Person p){
p.age++;
}
}
public class ValueTransferTest2 {
public static void main(String[] args) {
int m = 10;
int n = 20;
ValueTransferTest2 test = new ValueTransferTest2();
System.out.println("m = "+m+",n = "+n);
// //交换两个变量的值
// int temp = m;
// m = n;
// n = temp;
//调用方法
test.swap(m,n);
System.out.println("m = "+m+",n = "+n); // m=10 n=20
}
public void swap(int m,int n){
int temp = m;
m = n;
n = temp;
}
}
public class ValueTransferTest3 {
public static void main(String[] args) {
sort test = new sort();
int[] arr = new int[]{34,12,67,99,87,54,32};
System.out.println(test.sort(arr,"asc")); //升序
System.out.println(test.sort(arr,"desc")); //降序
}
}
class sort{
public String sort(int[] arr,String sortMethod){
if(sortMethod.equals("asc")){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return "升序后的数组"+ Arrays.toString(arr);
}else if(sortMethod.equals(("desc"))){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]<arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return "降序后的数组"+ Arrays.toString(arr);
}else{
return "你输入的数组有误!";
}
}
}
import java.util.Arrays;
/**
* ClassName:ValueTransferTest3
* Package:Method
* Description:
*
* @Author: pluto
*/
public class ValueTransferTest3 {
public static void main(String[] args) {
sort test = new sort();
int[] arr = new int[]{34,12,67,99,87,54,32};
System.out.println(test.sort(arr,"asc")); //升序
System.out.println(test.sort(arr,"desc")); //降序
System.out.println(test.sort(arr,"null")); //空指针解决办法
}
}
class sort{
public String sort(int[] arr,String sortMethod){
if("asc".equals(sortMethod)){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]>arr[j+1]){
// int temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
swap(arr,j,j+1);
}
}
}
return "升序后的数组"+ Arrays.toString(arr);
}else if("desc".equals((sortMethod))){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]<arr[j+1]){
// int temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
swap(arr,j,j+1);
}
}
}
return "降序后的数组"+ Arrays.toString(arr);
}else{
return "你输入的数组有误!";
}
}
public void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
6.1.2.4 方法的应用之递归方法
递归方法调用:方法自己调用自己的现象称为递归
分类:
- 直接递归:方法自身调用自己
public void methodA(){
methodA();
}
- 间接递归:理解为A()方法调用B()方法,B()调用C()方法,C()调用A()方法
public void A(){
B();
}
public void B(){
C();
}
public void C(){
A();
}
public class RecursionTest {
public static void main(String[] args) {
RecursionTest test = new RecursionTest();
// test.method1();
System.out.println(test.getSum(100));
System.out.println(test.getSum1(100));
System.out.println(test.getMul(5));
}
/**
* 举例1:计算1-100内的自然数的总和
*/
public int getSum(int num){
int sum =0;
for (int i = 0; i <= num; i++) {
sum +=i;
}
return sum;
}
//使用递归
public int getSum1(int num){
if(num ==1){
return 1;
}else{
return num + getSum1(num-1);
}
}
/**
* 举例2:计算n!
*/
public int getMul(int n){
if(n ==1){
return 1;
}else{
return n * getMul(n-1);
}
}
/**
* 如下递归方法的调用,会导致StackOverflowError
*/
// public void method1(){
// System.out.println("method1()...");
// method1();
// }
}
案例:汉诺塔游戏
import java.util.Scanner;
public class HanoiTower {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入汉诺塔的层数:");
int n = scanner.nextInt();
hanoi(n, 'A', 'B', 'C');
}
public static void hanoi(int n, char from, char to, char aux) {
if (n == 1) {
System.out.println("将第1个盘子从 " + from + " 移动到 " + to);
} else {
hanoi(n - 1, from, aux, to);
System.out.println("将第" + n + "个盘子从 " + from + " 移动到 " + to);
hanoi(n - 1, aux, to, from);
}
}
}
这个程序会要求用户输入汉诺塔的层数,然后调用 hanoi 方法进行求解。hanoi 方法是一个递归函数,它接受三个参数:盘子数量 n、起始柱子 from 和目标柱子 to,以及辅助柱子 aux。当 n 等于 1 时,直接将第一个盘子从起始柱子移动到目标柱子;否则,先将 n - 1 个盘子从起始柱子移动到辅助柱子,然后将第 n 个盘子从起始柱子移动到目标柱子,最后将 n - 1 个盘子从辅助柱子移动到目标柱子。在移动盘子时,程序会输出移动的过程,例如将第1个盘子从 A 移动到 B。
案例:快速排序
public class QuickSort {
public static void main(String[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
public static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
}
这个程序会对一个整数数组进行快速排序,并输出排序后的结果。快速排序使用分治法的思想,将数组分成两个子数组,然后递归地对这两个子数组进行排序。具体实现中,使用 partition 方法将数组分成两个部分,然后将枢轴元素(pivot)放到它的最终位置上,使得左边的元素都小于枢轴元素,右边的元素都大于枢轴元素。然后对左右两个子数组分别进行递归排序。
斐波那契数列
public class Fibonacci {
public static void main(String[] args) {
int n = 10;
for (int i = 0; i < n; i++) {
System.out.print(fibonacci(i) + " ");
}
}
public static int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
}
这个程序会输出斐波那契数列的前 n 个数。斐波那契数列中,第 0 个数为 0,第 1 个数为 1,后续的每个数都是前两个数之和。在实现中,使用递归函数 fibonacci 计算第 n 个数的值。如果 n 小于等于 1,直接返回 n;否则,返回 fibonacci(n - 1) + fibonacci(n - 2)。递归结束条件是 n 小于等于 1,因为此时已经到达了斐波那契数列的起始位置。
标签:总结,知识点,arr,JAVA,int,System,println,public,out From: https://www.cnblogs.com/Pluto-Love-Learn/p/17382093.html