來(lái)杯JAVA冷靜一下_03方法_04數(shù)組_230808
# 來(lái)杯JAVA冷靜一下_03方法_04數(shù)組_230807
失去獸性失去一切。時(shí)空轉(zhuǎn)換,不變的,是人性。
有意思
> 總覽
1、何謂方法
2、方法的定義及調(diào)用
3、方法重載
4、命令行傳參
5、可變參數(shù)
6、遞歸(自己調(diào)自己)
## 一、方法

### 1 方法
####? 何謂方法
方法=函數(shù),類(lèi)=結(jié)構(gòu)體
結(jié)構(gòu)體和函數(shù)的結(jié)合約等于類(lèi)?
**System.out.println();
類(lèi)+對(duì)象+方法**
調(diào)用系統(tǒng)類(lèi)里的? 標(biāo)準(zhǔn)輸出對(duì)象out? ?中的方法 ,叫做println方法
- 方法是解決一類(lèi)問(wèn)題的步驟的有序組合?
- 方法包含于類(lèi)或?qū)ο笾?
- 方法在程序中被創(chuàng)建 在其他地方被引用
- Java方法是語(yǔ)句的集合,它們?cè)谝黄饒?zhí)行一個(gè)功能。
- 方法是解決一類(lèi)問(wèn)題的步驟的有序組合;
- 方法包含于類(lèi)或?qū)ο笾校?/p>
方法在程序中被創(chuàng)建,在其他地方被引用。
設(shè)計(jì)方法的原則:方法的本意是功能塊,就是實(shí)現(xiàn)某個(gè)功能的語(yǔ)句塊的集合。我們?cè)O(shè)計(jì)方法的時(shí)候,最好保持方法的原子性,就是一個(gè)方法只完成1個(gè)功能,這樣利于我們后期的擴(kuò)展。
```java
package com.zhangyy.method;
import javax.xml.ws.soap.Addressing;
/**
?* @create 2023-08-08? 10:51
?*/
public class Demo01 {
? ? // main方法
? ? // public: 這是訪(fǎng)問(wèn)修飾符,表示該方法是公共的,可以從任何地方訪(fǎng)問(wèn)。
? ? //static: 這是一個(gè)靜態(tài)修飾符,表示該方法是靜態(tài)方法,可以通過(guò)類(lèi)名直接調(diào)用,而無(wú)需創(chuàng)建類(lèi)的實(shí)例。
? ? //void: 這是方法的返回類(lèi)型。在這里,void 表示該方法不返回任何值。
? ? //main: 這是方法的名稱(chēng),即 "main"。在 Java 中,程序從這個(gè)方法開(kāi)始執(zhí)行。
? ? //String[] args: 這是傳遞給 main 方法的參數(shù)。args 是一個(gè)字符串?dāng)?shù)組,它可以用來(lái)接收從命令行傳遞給程序的參數(shù)。
? ? //您可以在 main 方法中編寫(xiě)您的程序邏輯,例如處理數(shù)據(jù)、調(diào)用其他方法、打印輸出等。在程序運(yùn)行時(shí),從 main 方法開(kāi)始執(zhí)行,然后按照您編寫(xiě)的代碼邏輯繼續(xù)執(zhí)行。
? ? public static void main(String[] args) {
? ? ? ? int sum = add(1, 2);
? ? ? ? System.out.println(sum);
? ? }
? ? // 加法
? ? public static int add(int a, int b) {
? ? ? ? return a + b;
? ? }
}
```
### 2.方法的定義及調(diào)用
#### 1 方法的定義
實(shí)參:調(diào)用方法時(shí)實(shí)際傳給方法的數(shù)據(jù)。
方法體:方法體包含具體的語(yǔ)句,定義該方法的功能。
總覽:
**1 定義方法:**
****修飾符 返回值類(lèi)型 方法名(參數(shù)類(lèi)型 參數(shù)名){
? ? ...
? ? 方法體
? ? ...
? ? return 返回值;
}**
**2 調(diào)用方法:對(duì)象名.方法名(實(shí)參列表)**
***
>? - Java的方法類(lèi)似于其它語(yǔ)言的函數(shù),是一段用來(lái)完成特定功能的代碼片段,一般情況下,定義一個(gè)方法包含以下語(yǔ)法:
- 方法包含一個(gè)方法頭和一個(gè)方法體。下面是一個(gè)方法的所有部分:
#### 2 方法頭
##### 1. 關(guān)鍵字?
##### 2. 修飾符
修飾符,這是可選的,告訴編譯器如何調(diào)用該方法。定義了該方法的訪(fǎng)問(wèn)類(lèi)型。
###### - 修飾符和關(guān)鍵字 和標(biāo)識(shí)符的關(guān)系
修飾符、關(guān)鍵字和標(biāo)識(shí)符是Java編程中的三個(gè)重要概念,它們?cè)诖a中有不同的角色和用途。
###### 1 關(guān)鍵字(Keywords):
關(guān)鍵字是Java語(yǔ)言中預(yù)定義的一組具有特殊意義的單詞。這些關(guān)鍵字用于表示**語(yǔ)法結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、控制流等**。例如,public、class、if、while 等都是關(guān)鍵字。關(guān)鍵字不能用作標(biāo)識(shí)符,即不能用作類(lèi)名、方法名或變量名。
###### 2 修飾符(Modifiers):
**修飾符是用于修改類(lèi)、方法、字段、變量**等實(shí)體的特性或行為的關(guān)鍵字。它們可以控制訪(fǎng)問(wèn)權(quán)限、繼承性、多態(tài)性等。一些常見(jiàn)的修飾符包括 public、private、protected、static、final 等。修飾符不同于關(guān)鍵字,因?yàn)樗鼈兺ǔS脕?lái)描述標(biāo)識(shí)符的特性。
###### 3 標(biāo)識(shí)符(Identifiers):
標(biāo)識(shí)符是用來(lái)標(biāo)識(shí)類(lèi)、方法、變量等實(shí)體的名稱(chēng)。在Java中,標(biāo)識(shí)符由字母、數(shù)字、下劃線(xiàn)和美元符號(hào)組成,必須以字母、下劃線(xiàn)或美元符號(hào)開(kāi)頭。關(guān)鍵字(public、class、if、while)不能用作標(biāo)識(shí)符。標(biāo)識(shí)符的命名應(yīng)遵循一定的命名規(guī)范,如駝峰命名法(camelCase)。
**綜上所述,關(guān)鍵字(public、class、if、while)是Java語(yǔ)言的保留字,用于表示特殊意義的單詞;修飾符用于修飾實(shí)體的特性或行為,以控制其行為和訪(fǎng)問(wèn)權(quán)限;標(biāo)識(shí)符是用來(lái)命名類(lèi)、方法、變量等實(shí)體的名稱(chēng)。它們?cè)诖a中共同協(xié)作,用于定義和描述程序的結(jié)構(gòu)、行為和數(shù)據(jù)。**
###### ( ps 51個(gè)關(guān)鍵字)
Java 語(yǔ)言目前定義了 51 個(gè)關(guān)鍵字,這些關(guān)鍵字不能作為標(biāo)識(shí)符(變量名、類(lèi)名和方法名)來(lái)使用。
以下對(duì)這些關(guān)鍵字進(jìn)行了分類(lèi)。
``
1 數(shù)據(jù)類(lèi)型:boolean、int、long、short、byte、float、double、char、class、interface。
2 流程控制:if、else、do、while、for、switch、case、default、break、continue、return、try、catch、finally。
3 修飾符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native。
4 動(dòng)作:package、import、throw、throws、extends、implements、this、supper、instanceof、new。
5 保留字:true、false、null、goto、const。
##### 3 標(biāo)識(shí)符
**Java 所有的組成部分都需要名字。類(lèi)名、變量名、方法名都被稱(chēng)為標(biāo)識(shí)符
**
> 標(biāo)識(shí)符注意點(diǎn)
所有標(biāo)識(shí)符都應(yīng)該以 字母、 ( 美元符 ) 、 ( 下劃線(xiàn) ) 開(kāi)頭首字母之后可以是字母、 (美元符)、_(下劃線(xiàn)) 開(kāi)頭 首字母之后可以是 字母、 (美元符)、?
(
``
***
##### 4 . 返回值類(lèi)型
:方法可能會(huì)返回值。 returnValueType是方法返回值的數(shù)據(jù)類(lèi)型。有些方法執(zhí)行所需的操作,但沒(méi)有返回值。在這種情況下, returnValueType是關(guān)鍵字void。
##### 5. 方法名:
是方法的實(shí)際名稱(chēng)。方法名和參數(shù)表共同構(gòu)成方法簽名。
參數(shù)類(lèi)型:參數(shù)像是一個(gè)占位符。當(dāng)方法被調(diào)用時(shí),傳遞值給參數(shù)。這個(gè)值被稱(chēng)為實(shí)參或變量。參數(shù)列表是指方法的參數(shù)類(lèi)型、順序和參數(shù)的個(gè)數(shù)。參數(shù)是可選的,方法可以不包含任何參數(shù)。
形式參數(shù):在方法被調(diào)用時(shí)用于接收外界輸入的數(shù)據(jù)。
實(shí)參:調(diào)用方法時(shí)實(shí)際傳給方法的數(shù)據(jù)。
#### 3 方法體:方法體包含具體的語(yǔ)句,定義該方法的功能。
#### 4 總結(jié)方法的定義
修飾符 返回值類(lèi)型 方法名(參數(shù)類(lèi)型 參數(shù)名){
? ? ...
? ? 方法體
? ? ...
? ? return 返回值;
}
```java
public class Demo01 {
? ? // main方法
? ? // public: 這是訪(fǎng)問(wèn)修飾符,表示該方法是公共的,可以從任何地方訪(fǎng)問(wèn)。
? ? //static: 這是一個(gè)靜態(tài)修飾符,表示該方法是靜態(tài)方法,可以通過(guò)類(lèi)名直接調(diào)用,而無(wú)需創(chuàng)建類(lèi)的實(shí)例。
? ? //void: 這是方法的返回類(lèi)型。在這里,void 表示該方法不返回任何值。
? ? //main: 這是方法的名稱(chēng),即 "main"。在 Java 中,程序從這個(gè)方法開(kāi)始執(zhí)行。
? ? //String[] args: 這是傳遞給 main 方法的參數(shù)。args 是一個(gè)字符串?dāng)?shù)組,它可以用來(lái)接收從命令行傳遞給程序的參數(shù)。
? ? //您可以在 main 方法中編寫(xiě)您的程序邏輯,例如處理數(shù)據(jù)、調(diào)用其他方法、打印輸出等。在程序運(yùn)行時(shí),從 main 方法開(kāi)始執(zhí)行,然后按照您編寫(xiě)的代碼邏輯繼續(xù)執(zhí)行。
? ? public static void main(String[] args) {
? ? ? ? int maxResult = max(10, 10);
? ? ? ? System.out.println( maxResult);
? ? }
? ? //比大小
? ? public static int max(int num1, int num2) {
? ? ? ? int result = -1;
? ? ? ? if (num1 == num2) {
? ? ? ? ? ? System.out.println("num1== num2");
? ? ? ? ? ? return 0;//終止方法
? ? ? ? } else if (num1 > num2) {
? ? ? ? ? ? result = num1;
? ? ? ? } else if (num2 > num1) {
? ? ? ? ? ? result = num2;
? ? ? ? }
? ? ? ? return result;
? ? }
}
```
#### 5 調(diào)用方法:對(duì)象名.方法名(實(shí)參列表)
Java支持兩種調(diào)用方法的方式,根據(jù)方法是否返回值來(lái)選擇,當(dāng)方法返回一個(gè)值的時(shí)候,方法調(diào)用通常被當(dāng)做一個(gè)值。
##### 介紹 Java的方法調(diào)用有幾種方式
chatGPT回答:
在Java中,方法調(diào)用可以通過(guò)以下幾種方式進(jìn)行:
###### 1 直接方法調(diào)用(Static Method Invocation)
:這是最常見(jiàn)的方法調(diào)用方式。通過(guò)類(lèi)名直接調(diào)用靜態(tài)方法,不需要?jiǎng)?chuàng)建類(lèi)的實(shí)例。例如:
java
Copy code
int result = MyClass.staticMethod(arg1, arg2);
###### 2 實(shí)例方法調(diào)用(Instance Method Invocation):
通過(guò)對(duì)象實(shí)例調(diào)用方法。首先,需要?jiǎng)?chuàng)建一個(gè)類(lèi)的實(shí)例,然后使用實(shí)例調(diào)用方法。例如:
java
Copy code
MyClass obj = new MyClass();
int result = obj.instanceMethod(arg1, arg2);
###### 3 構(gòu)造方法調(diào)用(Constructor Invocation):
用于創(chuàng)建對(duì)象實(shí)例,通過(guò) new 關(guān)鍵字調(diào)用類(lèi)的構(gòu)造方法。例如:
java
Copy code
MyClass obj = new MyClass();
###### 4 遞歸方法調(diào)用(Recursive Method Invocation)
:在方法內(nèi)部調(diào)用自身的方法,用于解決需要重復(fù)執(zhí)行相似操作的問(wèn)題,例如遞歸算法。例如:
java
Copy code
public int factorial(int n) {
? ? if (n == 0 || n == 1) {
? ? ? ? return 1;
? ? } else {
? ? ? ? return n * factorial(n - 1);
? ? }
}
###### 5 鏈?zhǔn)椒椒ㄕ{(diào)用(Method Chaining)
:在同一個(gè)對(duì)象上連續(xù)調(diào)用多個(gè)方法,每個(gè)方法都返回對(duì)象本身(或新對(duì)象),以便進(jìn)行連續(xù)的操作。例如:
java
Copy code
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" ").append("world").append("!");
###### 6 匿名內(nèi)部類(lèi)中的方法調(diào)用
:在匿名內(nèi)部類(lèi)中,可以調(diào)用外部類(lèi)的方法。例如:
java
Copy code
ActionListener listener = new ActionListener() {
? ? public void actionPerformed(ActionEvent e) {
? ? ? ? // 調(diào)用外部類(lèi)的方法
? ? ? ? myMethod();
? ? }
};
###### 7 方法引用(Method Reference):Java 8 引入的功能,允許您直接引用現(xiàn)有方法作為 Lambda 表達(dá)式的參數(shù)。例如:
java
Copy code
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // 使用方法引用
這些是 Java 中常見(jiàn)的方法調(diào)用方式。每種方式都有其特定的應(yīng)用場(chǎng)景,根據(jù)您的需要選擇合適的方法調(diào)用方式。
######? 比大小
```java
public class Demo01 {
? ? // main方法
? ? // public: 這是訪(fǎng)問(wèn)修飾符,表示該方法是公共的,可以從任何地方訪(fǎng)問(wèn)。
? ? //static: 這是一個(gè)靜態(tài)修飾符,表示該方法是靜態(tài)方法,可以通過(guò)類(lèi)名直接調(diào)用,而無(wú)需創(chuàng)建類(lèi)的實(shí)例。
? ? //void: 這是方法的返回類(lèi)型。在這里,void 表示該方法不返回任何值。
? ? //main: 這是方法的名稱(chēng),即 "main"。在 Java 中,程序從這個(gè)方法開(kāi)始執(zhí)行。
? ? //String[] args: 這是傳遞給 main 方法的參數(shù)。args 是一個(gè)字符串?dāng)?shù)組,它可以用來(lái)接收從命令行傳遞給程序的參數(shù)。
? ? //您可以在 main 方法中編寫(xiě)您的程序邏輯,例如處理數(shù)據(jù)、調(diào)用其他方法、打印輸出等。在程序運(yùn)行時(shí),從 main 方法開(kāi)始執(zhí)行,然后按照您編寫(xiě)的代碼邏輯繼續(xù)執(zhí)行。
? ? public static void main(String[] args) {
? ? ? ? int maxResult = max(10, 10);
? ? ? ? System.out.println( maxResult);
? ? }
? ? //比大小
? ? public static int max(int num1, int num2) {
? ? ? ? int result = -1;
? ? ? ? if (num1 == num2) {
? ? ? ? ? ? System.out.println("num1== num2");
? ? ? ? ? ? return 0;//終止方法
? ? ? ? } else if (num1 > num2) {
? ? ? ? ? ? result = num1;
? ? ? ? } else if (num2 > num1) {
? ? ? ? ? ? result = num2;
? ? ? ? }
? ? ? ? return result;
? ? }
}
```
###### 課后作業(yè):值傳遞和引用傳遞
方法可以修改傳遞引用所對(duì)應(yīng)的變量值,而不能修改傳遞值調(diào)用所對(duì)應(yīng)的變量值,這句話(huà)相當(dāng)重要,這是按值調(diào)用與引用調(diào)用的根本區(qū)別,以下為分析:
按值調(diào)用(call by value)表示方法接受的時(shí)調(diào)用者提供的值。
package github.method;
/**
?*/
public class HomeWork01 {
? ? private static int x = 10;
? ? public static void updataeValue(int value){
? ? ? ? value = 3 * value;
? ? ? ? System.out.println("value的值:" + value);
? ? }
? ? public static void main(String[] args) {
? ? ? ? System.out.println("調(diào)用前的值:" + x);
? ? ? ? updataeValue(x);
? ? ? ? System.out.println("調(diào)用后的值:" + x);
? ? }
}
分析:
1)value被初始化為x值的一個(gè)拷貝(也就是10)
2)value被乘以3后等于30,但注意此時(shí)x的值仍為10!
3)這個(gè)方法結(jié)束后,參數(shù)變量value不再使用,被回收。
**結(jié)論:**當(dāng)傳遞方法參數(shù)類(lèi)型為基本數(shù)據(jù)類(lèi)型(數(shù)字以及布爾值)時(shí),一個(gè)方法是不可能修改一個(gè)基本數(shù)據(jù)類(lèi)型的參數(shù)。
按引用調(diào)用(call by reference)
按引用調(diào)用則表示方法接收的是調(diào)用者提供的變量地址(如果是C語(yǔ)言的話(huà)來(lái)說(shuō)就是指針啦,當(dāng)然java并沒(méi)有指針的概念)
當(dāng)然java中除了基本數(shù)據(jù)類(lèi)型還有引用數(shù)據(jù)類(lèi)型,也就是對(duì)象引用,那么對(duì)于這種數(shù)據(jù)類(lèi)型又是怎么樣的情況呢?我們還是一樣先來(lái)看一個(gè)例子:
先聲明一個(gè)User對(duì)象類(lèi)型:
package github.method;
/**
?*/
public class User {
? ? private String name;
? ? private int age;
? ? public User(String name, int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
}
執(zhí)行class
package github.method;
/**
?*/
public class HomeWork02 {
? ? public static void updateUser(User student){
? ? ? ? student.setName("subeiLY");
? ? ? ? student.setAge(22);
? ? }
? ? public static void main(String[] args) {
? ? ? ? User user = new User("SUBEI",20);
? ? ? ? System.out.println("調(diào)用user前的值:" + user.getName() + "," + user.getAge());
? ? ? ? updateUser(user);
? ? ? ? System.out.println("調(diào)用user后的值:" + user.getName() + "," + user.getAge());
? ? }
}
在這里插入圖片描述
分析一下這個(gè)過(guò)程:
在這里插入圖片描述
分析:
1)student變量被初始化為user值的拷貝,這里是一個(gè)對(duì)象的引用。
2)調(diào)用student變量的set方法作用在這個(gè)引用對(duì)象上,user和student同時(shí)引用的User對(duì)象內(nèi)部值被修改。
3)方法結(jié)束后,student變量不再使用,被釋放,而user還是沒(méi)有變,依然指向User對(duì)象。
**結(jié)論:**顯然,User的值被改變了,但是這是將最開(kāi)始所對(duì)應(yīng)得值改變了,把User的本身屬性改變了,才會(huì)進(jìn)行值得變化,雖然看似是按引用傳遞值,但是實(shí)際上是將值改變了。
到這里估計(jì)不少人都蒙逼了,下面我們通過(guò)一個(gè)反例來(lái)說(shuō)明。
package github.method;
/**
?*/
public class HomeWork03 {
? ? /**
? ? ?* 交換兩個(gè)對(duì)象
? ? ?* @param x
? ? ?* @param y
? ? ?*/
? ? public static void swap(User x,User y){
? ? ? ? User temp = x;
? ? ? ? x = y;
? ? ? ? y = temp;
? ? }
? ? public static void main(String[] args) {
? ? ? ? User user = new User("user", 26);
? ? ? ? User stu = new User("stu", 18);
? ? ? ? System.out.println("調(diào)用前user的值:"+ user.getName()+","+user.getAge());
? ? ? ? System.out.println("調(diào)用前stu的值:"+ stu.getName()+","+stu.getAge());
? ? ? ? swap(user, stu);
? ? ? ? System.out.println("調(diào)用后user的值:"+ user.getName()+","+user.getAge());
? ? ? ? System.out.println("調(diào)用后stu的值:"+? stu.getName()+","+stu.getAge());
? ? }
}
通過(guò)程序,會(huì)發(fā)現(xiàn)user和stu的值并沒(méi)有發(fā)生變化,也就是方法并沒(méi)有改變存儲(chǔ)在變量user和stu中的對(duì)象引用。swap方法的參數(shù)x和y被初始化為兩個(gè)對(duì)象引用的拷貝,這個(gè)方法交換的是這兩個(gè)拷貝的值而已,最終,所做的事都是白費(fèi)力氣罷了。在方法結(jié)束后x,y將被丟棄,而原來(lái)的變量user和stu仍然引用這個(gè)方法調(diào)用之前所引用的對(duì)象。
在這里插入圖片描述
這個(gè)過(guò)程也充分說(shuō)明了java程序設(shè)計(jì)語(yǔ)言對(duì)對(duì)象采用的不是引用調(diào)用,實(shí)際上是對(duì)象引用進(jìn)行的是值傳遞,當(dāng)然在這里我們可以簡(jiǎn)單理解為這就是按值調(diào)用和引用調(diào)用的區(qū)別,而且必須明白即使java函數(shù)在傳遞引用數(shù)據(jù)類(lèi)型時(shí),也只是拷貝了引用的值罷了,之所以能修改引用數(shù)據(jù)是因?yàn)樗鼈兺瑫r(shí)指向了一個(gè)對(duì)象,但這仍然是按值調(diào)用而不是引用調(diào)用。
總結(jié)
一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類(lèi)型的參數(shù)(數(shù)值型和布爾型)。
一個(gè)方法可以修改一個(gè)引用所指向的對(duì)象狀態(tài),但這仍然是按值調(diào)用而非引用調(diào)用。
上面兩種傳遞都進(jìn)行了值拷貝的過(guò)程。
以上分析借鑒了zejian_的博文
### 3.方法重載
#### 重載 是什么?
重載(Overloading)是一種編程概念,指的是在同一個(gè)作用域內(nèi)為同一個(gè)函數(shù)或方法定義多個(gè)不同的實(shí)現(xiàn),**以處理不同的參數(shù)類(lèi)型或參數(shù)個(gè)數(shù)**。
#### 重載的作用:
重載使得同一個(gè)函數(shù)名可以根據(jù)不同的上下文和參數(shù)來(lái)執(zhí)行不同的操作,提高了代碼的靈活性和可讀性。
#### 重載的實(shí)現(xiàn)方式:
通過(guò)函數(shù)名相同但參數(shù)列表不同的函數(shù)來(lái)實(shí)現(xiàn),這些函數(shù)被稱(chēng)為重載函數(shù)。編程語(yǔ)言會(huì)根據(jù)函數(shù)調(diào)用時(shí)傳遞的參數(shù)類(lèi)型和個(gè)數(shù)來(lái)選擇合適的重載函數(shù)進(jìn)行調(diào)用。
例如,考慮一個(gè)計(jì)算兩個(gè)數(shù)字之和的
#### 例子:函數(shù) add,可以實(shí)現(xiàn)以下幾種重載:
##### - int add(int a, int b):計(jì)算兩個(gè)整數(shù)之和。
##### - double add(double a, double b):計(jì)算兩個(gè)浮點(diǎn)數(shù)之和。
##### - int add(int a, int b, int c):計(jì)算三個(gè)整數(shù)之和。
重載(overloading) 是在一個(gè)類(lèi)里面,方法名字相同,而參數(shù)不同。返回類(lèi)型可以相同也可以不同。?
重載就算方法名一樣,參數(shù)不一樣。
###### 代碼例子:
比大小,int變double ,
其實(shí)就是一個(gè)類(lèi)里面,定義了兩個(gè)方法,方法名字相同,但是參數(shù)不同。?
```java
public class Demo01 {
? ? // main方法
? ? public static void main(String[] args) {
? ? ? ? double maxResult = max(10, 20);
? ? ? ? System.out.println( maxResult);
? ? }
? ? //比大小
? ? public static double max(double num1, double num2) {//
? ? ? ? double result = -1;//
? ? ? ? if (num1 == num2) {
? ? ? ? ? ? System.out.println("num1== num2");
? ? ? ? ? ? return 0;//終止方法
? ? ? ? } else if (num1 > num2) {
? ? ? ? ? ? result = num1;
? ? ? ? } else if (num2 > num1) {
? ? ? ? ? ? result = num2;
? ? ? ? }
? ? ? ? return result;
? ? }
}
```
重載就是在一個(gè)類(lèi)中,有相同的函數(shù)名稱(chēng),但形參不同(數(shù)量、質(zhì)量 )的函數(shù)。
#### 總結(jié):方法的重載的規(guī)則
###### 方法名稱(chēng)必須相同。
###### 參數(shù)列表必須不同(個(gè)數(shù)不同、或類(lèi)型不同、參數(shù)排列順序不同等)
方法的返回類(lèi)型可以相同也可以不相同。
僅僅返回類(lèi)型不同不足以成為方法的重載。
#### 底層實(shí)現(xiàn)理論:
方法名稱(chēng)相同時(shí),編譯器會(huì)根據(jù)調(diào)用方法的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型等去逐個(gè)匹配,以選擇對(duì)應(yīng)的方法,如果匹配失敗,則編譯器報(bào)錯(cuò)。
```java
public class Demo02 {
? ? public static void main(String[] args) {
? ? ? ? int max = max(10, 20);
? ? ? ? System.out.println(max);
? ? ? ? double max2 = max2(10.0, 20.0);
? ? ? ? System.out.println(max);
? ? }
? ? // 比大小
? ? public static int max(int num1,int num2){
? ? ? ? int result = 0;
? ? ? ? if(num1==num2){
? ? ? ? ? ? System.out.println("num1==num2");
? ? ? ? ? ? return 0;? ?// 終止方法
? ? ? ? }
? ? ? ? if(num1>num2){
? ? ? ? ? ? result = num1;
? ? ? ? } else {
? ? ? ? ? ? result = num2;
? ? ? ? }
? ? ? ? return result;
? ? }
? ? // 比大小
? ? public static double max2(double num1,double num2){
? ? ? ? double result = 0;
? ? ? ? if(num1==num2){
? ? ? ? ? ? System.out.println("num1==num2");
? ? ? ? ? ? return 0;? ?// 終止方法
? ? ? ? }
? ? ? ? if(num1>num2){
? ? ? ? ? ? result = num1;
? ? ? ? } else {
? ? ? ? ? ? result = num2;
? ? ? ? }
? ? ? ? return result;
? ? }
}
```
```java
public class Demo01 {
? ? // main方法
? ? public static void main(String[] args) {
? ? ? ? int sum = add(1, 2);
? ? ? ? System.out.println(sum);
? ? ? ? int sum2 = add2(1, 2, 3);
? ? ? ? System.out.println(sum2);
? ? }
? ? // 加法
? ? public static int add(int a,int b){
? ? ? ? return a+b;
? ? }
? ? public static int add2(int a,int b,int c){
? ? ? ? return a+b+c;
? ? }
}
```
### 4.命令行傳參
命令行傳參
有時(shí)候希望運(yùn)行一個(gè)程序時(shí)再傳遞給它消息。這要靠傳遞命令行參數(shù)給main()函數(shù)實(shí)現(xiàn)
```java
public static void main(String[] args) {? ??
? ? //args.length 數(shù)組長(zhǎng)度? ??
? ? for (int i = 0; i < args.length; i++) {
? ? ? ? System.out.println("args["+i+"]: "+args[i]);? ??
? ? }
}
```
找到當(dāng)前類(lèi)的文件夾,打開(kāi)cmd
img
### 5 可變參數(shù)
##### 1. 出生:Jdk1.5開(kāi)始,Java支持傳遞**同類(lèi)型**的可變參數(shù)給一個(gè)方法。
##### 2. 功能:在方法聲明中,在指定參數(shù)類(lèi)型后加一個(gè)省略號(hào) (…)。則可以為所欲為、傳參放題。多余的參數(shù)自動(dòng)打包成數(shù)組
##### 3.? 位置:一個(gè)方法中只能指定一個(gè)可變參數(shù),它必須是方法的最后一個(gè)參數(shù)。
###### 1. 原始代碼1.0
```java
package github.method;
public class Demo03 {
? ? public static void main(String[] args) {
? ? ? ? // args.length 數(shù)組長(zhǎng)度
? ? ? ? for(int i=0;i < args.length;i++){
? ? ? ? ? ? System.out.println("args[" + i + "]:" + args[i]);
? ? ? ? }
? ? }
}
```
###### 2. 可變傳參代碼2.0 多余的參數(shù) 自動(dòng)打包為數(shù)組?
```java
public class Demo04 {
? ? public static void main(String[] args) {
? ? ? ? Demo04 demo04 = new Demo04();
? ? ? ? demo04.test(1,2,3,4,5);
? ? }
? ? public void test(int... i){
? ? ? ? System.out.println(i[0]);
? ? ? ? System.out.println(i[1]);
? ? ? ? System.out.println(i[2]);
? ? ? ? System.out.println(i[3]);
? ? ? ? System.out.println(i[4]);
? ? }
}
```
###### 3. 賦予意義:可變傳參代碼3.0?
######? ?輸出不定量數(shù)字的最大值
```java
public class Demo04 {
? ? public static void main(String[] args) {
? ? ? ? // 調(diào)用可變參數(shù)的方法
? ? ? ? printMax(34,3,3,2,56.5);
? ? ? ? printMax(new double[]{1,2,3});
? ? }
? ? public static void printMax(double... numbers){
? ? ? ? if(numbers.length==0){
? ? ? ? ? ? System.out.println("沒(méi)有數(shù)據(jù)!");
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? double result = numbers[0];
? ? ? ? // 排序
? ? ? ? for(int i=1;i<numbers.length;i++){
? ? ? ? ? ? if(numbers[i] > result){
? ? ? ? ? ? ? ? result = numbers[i];
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println("The max Value is " + result);
? ? }
}
```
### 6.遞歸 自調(diào)用 棧機(jī)制 先定義出口(能不用就不用)
#### 遞歸是什么
A方法調(diào)用B方法,我們很容易理解!
遞歸就是:A方法調(diào)用A方法!就是自己調(diào)用自己。
***
#### 遞歸來(lái)解決什么
利用遞歸可以用簡(jiǎn)單的程序來(lái)解決一些復(fù)雜的問(wèn)題。它通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解,遞歸策略只需少量的程序就可描述岀解題過(guò)程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語(yǔ)句來(lái)定義對(duì)象的無(wú)限集合。
#### 遞歸的構(gòu)成
遞歸結(jié)構(gòu)包括兩個(gè)部分:
遞歸頭:什么時(shí)候不調(diào)用自身方法。如果沒(méi)有頭,將陷入死循環(huán);
遞歸體:什么時(shí)候需要調(diào)用自身方法。
```java
package com.zhangyy.method;
import javax.xml.ws.soap.Addressing;
/**
?* @author iehmltym
?* @create 2023-08-08? 10:51
?*/
public class Demo01 {
? ? public static void main(String[] args) {
? ? ? ? Demo01 test = new Demo01();
? ? ? ? test.test();
? ? }
? ? public void test() {
? ? ? ? test();
? ? }
}
```
#### 例-遞歸實(shí)現(xiàn)階乘 5! 5*4*3*2*1
```java
public class Demo05 {
? ? // 5! 5*4*3*2*1
?// main-f-f4-f3-f2-f1:? 大事化小,小事化了
?//f1 產(chǎn)生一個(gè)結(jié)果?
? ? public static void main(String[] args) {
? ? ? ? Scanner scanner = new Scanner(System.in);
? ? ? ? System.out.println("請(qǐng)輸入一個(gè)數(shù):");
? ? ? ? int number = scanner.nextInt();
? ? ? ? int test = test(number);
? ? ? ? System.out.println(number + "的階乘:" + test);
? ? }
? ? public static int test(int n){
? ? ? ? if(n==1){
? ? ? ? ? ? return 1;
? ? ? ? }else{
? ? ? ? ? ? return n*test(n-1);
? ? ? ? }
? ? }
}
```
```java
public class Demo01 {
? ? public static void main(String[] args) {
? ? ? ? System.out.println(f(4));
? ? }
? ? public static int f(int n) {
? ? ? ? if (n == 1) {
? ? ? ? ? ? return 1;
? ? ? ? } else {
? ? ? ? ? ? System.out.println(n);
? ? ? ? ? ? return n * f(n - 1);
? ? ? ? }
? ? }
}
```
#### 例-寫(xiě)一個(gè)計(jì)算器,要求實(shí)現(xiàn)加減乘除功能,井且能夠循環(huán)接收新的數(shù)據(jù),通過(guò)用戶(hù)交互實(shí)現(xiàn)。
?
?```java
public class HomeWork04 {
? ? public static void main(String[] args) {
? ? ? ? Scanner scanner = new Scanner(System.in);
? ? ? ? double sum = 0;
? ? ? ? while(true){
? ? ? ? ? ? System.out.println("請(qǐng)輸入第一個(gè)整數(shù):");
? ? ? ? ? ? double a = scanner.nextDouble();
? ? ? ? ? ? System.out.println("請(qǐng)輸入第二個(gè)整數(shù):");
? ? ? ? ? ? double b = scanner.nextDouble();
? ? ? ? ? ? System.out.println("請(qǐng)輸入要運(yùn)算的字符(+:表示加法,-:表示減法,*:表示乘法,/:表示除法)");
? ? ? ? ? ? String temp = scanner.next();
? ? ? ? ? ? switch (temp){
? ? ? ? ? ? ? ? case "+":
? ? ? ? ? ? ? ? ? ? sum = a + b;
? ? ? ? ? ? ? ? ? ? System.out.println("結(jié)果是:" + sum);
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? case "-":
? ? ? ? ? ? ? ? ? ? sum = a - b;
? ? ? ? ? ? ? ? ? ? System.out.println("結(jié)果是:" + sum);
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? case "*":
? ? ? ? ? ? ? ? ? ? sum = a * b;
? ? ? ? ? ? ? ? ? ? System.out.println("結(jié)果是:" + sum);
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? case "/":
? ? ? ? ? ? ? ? ? ? sum = a / b;
? ? ? ? ? ? ? ? ? ? System.out.println("結(jié)果是:" + sum);
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? System.out.println("請(qǐng)輸入正確的運(yùn)算符號(hào)!!");
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
```
## 二、數(shù)組
##### 總覽:
##### 1、數(shù)組概述
##### 2、數(shù)組聲明創(chuàng)建
##### 3、數(shù)組使用
##### 4、多維數(shù)組
##### 5、Arrays 類(lèi)
##### 6、稀疏數(shù)組
### 1 數(shù)組概述
#### 數(shù)組的定義
- 數(shù)組是相同類(lèi)型數(shù)據(jù)的有序集合
- 數(shù)組描述的是相同類(lèi)型的若干個(gè)數(shù)據(jù),按照一定的先后次序排列組合而成
- 其中,每一數(shù)據(jù)稱(chēng)作一個(gè)數(shù)組元素,每個(gè)數(shù)組元素可以通過(guò)一個(gè)下標(biāo)來(lái)訪(fǎng)問(wèn)它們
### 2 數(shù)組聲明創(chuàng)建
數(shù)組的簡(jiǎn)單實(shí)現(xiàn)? ?
#### 1 首先必須聲明數(shù)組變量?
,才能在程序中使用數(shù)組。下面是聲明數(shù)組變量的語(yǔ)法:
//變量的類(lèi)型? 變量的名字 = 變量的值
datatype[] arrayRefvar; 首選方法。
int? ? num;
int[] num1;//首選 定義一個(gè)int 型的數(shù)組【】 命名為num1(尚未賦值)
datatype[] arrayRefvar;?
Java語(yǔ)言使用new操作符來(lái)創(chuàng)建數(shù)組,語(yǔ)法如下:
datatype[] arrayRevVar=new dataType[arraySize];
數(shù)組的元素是通過(guò)索引訪(fǎng)問(wèn)的,數(shù)組索引從0開(kāi)始
#### 獲取數(shù)組長(zhǎng)度:array.length
```java
int[] nums ;//1 聲明數(shù)組(定義數(shù)組?
nums = new int[10] ; //2 創(chuàng)建數(shù)組。開(kāi)辟10個(gè)int的內(nèi)存空間 空間的命名為nums, 開(kāi)辟一個(gè)可以存放10個(gè)int類(lèi)型的數(shù)字的大小的空間。【0】代表每一塊空間?
//總:數(shù)組的聲明和創(chuàng)建可以放在一起
int[] nums= new int [10];
?
```
```java
//變量的類(lèi)型 變量的名字=變量的值;
//數(shù)組類(lèi)型
public static void main(String[] args){
? ? int[] nums;//1.聲明一個(gè)數(shù)組
? ? nums=new int[10];//2.創(chuàng)建一個(gè)數(shù)組
? ??
? ??
? ? int[] nums2=new int[10];//聲明和創(chuàng)建可以放在一起
? ? //3.給數(shù)組元素賦值 int 默認(rèn)0 string 默認(rèn) null
? ? nums[0]=1;
? ? nums[1]=2;
? ? nums[2]=3;
? ? nums[3]=4;
? ? nums[4]=5;? ? ? ??
? ? nums[5]=6;? ? ? ??
? ? nums[6]=7;? ? ? ??
? ? nums[7]=8;? ? ? ??
? ? nums[8]=9;? ? ? ??
? ? nums[9]=10;
? ? //計(jì)算所有元素的和
? ? int sum=0;
? ? for(int i=0;i<nums.length;i++){
? ? ? ? sum += nums[i];
? ? }
? ? System.out.println(sum)
}
```
##### 數(shù)組的四個(gè)基本特點(diǎn)
- 其長(zhǎng)度是確定的。數(shù)組一旦被創(chuàng)建,它的大小就是不可改變的
- 其元素必須是相同類(lèi)型,不允許出現(xiàn)混合類(lèi)型
- **數(shù)組中的元素可以是任何數(shù)據(jù)類(lèi)型,包括基本類(lèi)型和引用類(lèi)型**
- 數(shù)組變量引用類(lèi)型,數(shù)組也可以看成是對(duì)象,數(shù)組中的每個(gè)元素相當(dāng)于該對(duì)象的成員變量。數(shù)組本身就是對(duì)象,Java中對(duì)象是在堆中的,因此數(shù)組無(wú)論原始類(lèi)型還是其他對(duì)象類(lèi)型,數(shù)組對(duì)象本身是在堆中。
ArrayIndexOutOfBoundsException:數(shù)組下標(biāo)越界異常
### 3 三種初始化及內(nèi)存分析?
#### Java內(nèi)存
#### 堆
存放new的對(duì)象和數(shù)組
可以被所有線(xiàn)程共享,不會(huì)存放別的對(duì)象引用
#### 棧
存放基本變量類(lèi)型(會(huì)包含這個(gè)基本類(lèi)型的具體數(shù)值)
引用對(duì)象的變量(會(huì)存放這個(gè)引用在堆里面的具體地址
#### 方法區(qū)
可以被所有的線(xiàn)程共享
包含了所有的class和static變量
#### 內(nèi)存分析

因此,直接輸出數(shù)組只會(huì)輸出一個(gè)數(shù)組的名字而不會(huì)輸出數(shù)組內(nèi)容
#### 三種初始化
##### 1 靜態(tài)初始化
int[] a = f1, 2,3};
Man[] mans = {new Man(1, 1), new Man(2,2)};
##### 2 動(dòng)態(tài)初始化
int[] a = new int[2];
a[0]=1;
a[1]=2;
##### 3 數(shù)組的默認(rèn)初始化
數(shù)組是引用類(lèi)型,它的元素相當(dāng)于類(lèi)的實(shí)例變量,因此數(shù)組一經(jīng)分配空間,其中的每個(gè)元素也被按照實(shí)例變量同樣的方式被隱式初始化。?
###### 靜態(tài)初始化 : 創(chuàng)建 + 賦值
###### 動(dòng)態(tài)初始化
```java
public class ArrayDemo02 {
? ? public static void main(String[] args) {
? ? ? ? // 靜態(tài)初始化 : 創(chuàng)建 + 賦值
? ? ? ? int[] a = {1,2,3,4,5,6,7,8};
? ? ? ? System.out.println(a[0]);
? ? ? ? // 動(dòng)態(tài)初始化
? ? ? ? int[] b = new int[2];
? ? ? ? b[0]=10;
? ? ? ? System.out.println(b[0]);
? ? }
}
```
### 4 下標(biāo)越界及小結(jié):ArraylndexOutofBounds Exception:數(shù)組下標(biāo)越界異常!
下標(biāo)的合法區(qū)間:[0, length-1],如果越界就會(huì)報(bào)錯(cuò):
?
public class ArrayDemo03 {
? ? public static void main(String[] args) {
? ? ? ? int[] a = new int[2];
? ? ? ? System.out.println(a[2]);
? ? }
}
**ArraylndexOutofBounds Exception:數(shù)組下標(biāo)越界異常!**
數(shù)組是相同數(shù)據(jù)類(lèi)型(數(shù)據(jù)類(lèi)型可以為任意類(lèi)型)的有序集合數(shù)組也是對(duì)象。
數(shù)組元素相當(dāng)于對(duì)象的成員變量。
數(shù)組長(zhǎng)度的確定的,不可變的。如果越界,則報(bào):ArrayIndexOutofBounds。
### 5 數(shù)組使用
1 普通的for循環(huán)
2 For-Each循環(huán)
3 數(shù)組作方法入?yún)?/p>
4 數(shù)組作返回值
#### PS array 數(shù)組的使用 方法(總)
數(shù)組(Array)是一種用于存儲(chǔ)多個(gè)相同類(lèi)型元素的數(shù)據(jù)結(jié)構(gòu)。在Java中,數(shù)組具有固定長(zhǎng)度,一旦創(chuàng)建,其長(zhǎng)度不能更改。以下是在Java中使用數(shù)組的基本方法:
##### 1 聲明數(shù)組:
在聲明數(shù)組時(shí),您需要指定數(shù)組的類(lèi)型和長(zhǎng)度。例如,以下代碼聲明了一個(gè)整數(shù)數(shù)組:
java
Copy code
int[] numbers = new int[5]; // 聲明一個(gè)包含5個(gè)整數(shù)的數(shù)組
##### 2 初始化數(shù)組:
數(shù)組可以在聲明時(shí)進(jìn)行初始化,也可以在之后分配值。以下是初始化數(shù)組的幾種方式:
java
Copy code
int[] numbers = {1, 2, 3, 4, 5}; // 初始化數(shù)組并指定值
##### 3 訪(fǎng)問(wèn)數(shù)組元素:
數(shù)組的元素可以通過(guò)索引來(lái)訪(fǎng)問(wèn),索引從0開(kāi)始。例如:
java
Copy code
int thirdNumber = numbers[2]; // 獲取第三個(gè)元素(索引為2)的值
數(shù)組長(zhǎng)度:
##### 4 使用 length 屬性可以獲取數(shù)組的長(zhǎng)度:
java
Copy code
int arrayLength = numbers.length; // 獲取數(shù)組的長(zhǎng)度
##### 5 遍歷數(shù)組:
使用循環(huán)可以遍歷數(shù)組的所有元素,執(zhí)行特定操作。例如,使用 for 循環(huán):
java
Copy code
for (int i = 0; i < numbers.length; i++) {
? ? System.out.println(numbers[i]);
}
##### 6 多維數(shù)組:
Java支持多維數(shù)組,例如二維數(shù)組、三維數(shù)組等。聲明和訪(fǎng)問(wèn)多維數(shù)組的方式類(lèi)似于一維數(shù)組。
java
Copy code
int[][] matrix = {
? ? {1, 2, 3},
? ? {4, 5, 6},
? ? {7, 8, 9}
};
int element = matrix[1][2]; // 獲取第二行第三列的元素值 6。
##### 7 數(shù)組作為方法參數(shù):
您可以將數(shù)組作為方法的參數(shù)傳遞。方法內(nèi)部可以使用數(shù)組來(lái)執(zhí)行特定的操作。
java
Copy code
void printArray(int[] arr) {
? ? for (int num : arr) {
? ? ? ? System.out.println(num);
? ? }
}
這些是使用數(shù)組的一些基本方法。數(shù)組在Java中是常用的數(shù)據(jù)結(jié)構(gòu),可以用于存儲(chǔ)和處理多個(gè)相同類(lèi)型的數(shù)據(jù)。如果您有更具體的問(wèn)題,歡迎繼續(xù)提問(wèn)!
#### 普通的for循環(huán)
普通的for循環(huán)
int[] arrays={1,2,3,45,5};
int sum=0;
for(int i=0;i<arrays.length;i++){
? ? sum += arrays[i];
? ? System.out.println(arrays[i]);
}
#### For-Each循環(huán)
for—Each循環(huán)(增強(qiáng)for循環(huán))
int[] arrays={1,2,3,45,5};
for(int array:arrays){
? ? System.out.println(array);
}
#### 數(shù)組作方法入?yún)?/p>
數(shù)組做方法入?yún)ⅲ╲oid作為方法入?yún)?,可以沒(méi)有返回值)
int[] arrays={1,2,3,45,5};
printArray(arrays);
//打印數(shù)組元素
public static void printArray(arrays){
? ? for(int i=0;i<arrays.length;i++){
? ? ? ? System.out.print(arrays[i] + "");
? ? }
}
#### //反轉(zhuǎn)數(shù)組
```java
public static int[] reverse(int[] arrays){
? ? int[] result=new int[arrays.length];
? ??
? ? //反轉(zhuǎn)操作
? ? //把j最大的和i最小的賦值,當(dāng)然直接找i最大的賦值給j也可以
? ? //不 開(kāi)辟新的數(shù)組空間,直接用中間變量temp就行了
? ? for(int i=0;j=result.length-1;i<arrays.length;i++;j--){
? ? ? ? ?result[j]=arrays[i];??
? ? }
? ? return result;
}
```
#### 數(shù)組作返回值
數(shù)組作返回值(反轉(zhuǎn)數(shù)組)
int[] arrays={1,2,3,45,5};
int[] reverse=reverse(arrays);
for(int i=0;.i<reverse.length;i++){
? ? System.out.println(reverse[i]);
}
```java
public class ArrayDemo04 {
? ? public static void main(String[] args) {
? ? ? ? int[] arrays = {1,2,3,4,5,6};
? ? ? ? // JDK1.5,沒(méi)有下標(biāo)
//? ? ? ? for(int array:arrays){
//? ? ? ? ? ? System.out.println(array);
//? ? ? ? }
//? ? ? ? printArray(arrays);
? ? ? ? int[] reverse = reverse(arrays);
? ? ? ? printArray(reverse);
? ? }
? ? // 打印數(shù)組元素
? ? public static void printArray(int[] arrays){
? ? ? ? for(int i=0;i< arrays.length;i++){
? ? ? ? ? ? System.out.println(arrays[i]+"");
? ? ? ? }
? ? }
? ? // 反轉(zhuǎn)數(shù)組
? ? public static int[] reverse(int[] arrays){
? ? ? ? int[] result = new int[arrays.length];
? ? ? ? // 反轉(zhuǎn)的操作
? ? ? ? for (int i = 0,j= result.length-1; i < arrays.length; i++,j--) {
//? ? ? ? ? ? result[] = arrays[i];
? ? ? ? ? ? result[j] = arrays[i];
? ? ? ? }
? ? ? ? return result;
? ? }
}
```
### 6 多維數(shù)組
多維數(shù)組可以看成是數(shù)組的數(shù)組,比如二維數(shù)組就是一個(gè)特殊的一維數(shù)組,其每一個(gè)元素都是一個(gè)一維數(shù)組。
#### 二維數(shù)組 int a[][] = new int[2][5];兩行五列
//可以理解為一維數(shù)組是一個(gè)線(xiàn),每個(gè)元素是線(xiàn)上的一個(gè)點(diǎn),二維數(shù)組是一個(gè)面,此時(shí),每個(gè)元素依舊是面上的一個(gè)點(diǎn),相對(duì)于線(xiàn),你就需要有兩個(gè)坐標(biāo)去確定它
// 解析:以上二維數(shù)組a可以看成一個(gè)兩行五列的數(shù)組
package github.array;
/**
?* @author subeiLY
?* @create 2021-05-29 17:31
?*/
public class ArrayDemo05 {
? ? public static void main(String[] args) {
? ? ? ? // [4][2] 四行兩列 的數(shù)組? 瘦長(zhǎng)
? ? ? ? /*
? ? ? ? 1,2? ? ?array[0] 存 【1,2】這個(gè)數(shù)組?
? ? ? ? 2,3? ? ?array[1] 存 【2,3】這個(gè)數(shù)組?
? ? ? ? 3,4? ? ?array[2] 存 【3,4】這個(gè)數(shù)組
? ? ? ? 5,6? ? ?array[3] 存 【5,6】這個(gè)數(shù)組
? ? ? ? ?*/
? ? ? ? int[][] array = {{1,2},{3,4},{5,6},{7,8}};
? ? ? ? // 輸出單個(gè)元素
? ? ? ? printArray(array[0]);
? ? ? ? System.out.println(array[0][0]);
? ? ? ? System.out.println("----------------");
? ? ? ??
? ? ? ? for (int i = 0; i < array.length; i++) {
? ? ? ? ? ? for (int j = 0; j < array[i].length; j++){
? ? ? ? ? ? ? ? System.out.println(array[i][j]);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? // 打印數(shù)組元素
? ? public static void printArray(int[] arrays){
? ? ? ? for(int i=0;i< arrays.length;i++){
? ? ? ? ? ? System.out.println(arrays[i]+"");
? ? ? ? }
? ? }
}
### 7 Arrays類(lèi)
數(shù)組的工具類(lèi) javautil. Arrays
由于數(shù)組對(duì)象本身并沒(méi)有什么方法可以供我們調(diào)用但AP中提供了一個(gè)工具類(lèi) Arrays供我們使用從而可以對(duì)數(shù)據(jù)對(duì)象進(jìn)行一些基本的操作。
查看JDK幫助文檔。
Arrays類(lèi)中的方法都是 static 修飾的靜態(tài)方法在使用的時(shí)候可以直接使用類(lèi)名進(jìn)行調(diào)用,而"不用"使用對(duì)象來(lái)調(diào)用(注意:是“不用”而不是“不能”)。
#### 狂神版本:Arrays具有以下常用功能:
###### 給數(shù)組賦值:通過(guò)fill方法。
###### 對(duì)數(shù)組排序:通過(guò)sort方法按升序。
###### 比較數(shù)組:通過(guò) equals方法比較數(shù)組中元素值是否相等。
###### 查找數(shù)組元素:通過(guò) binarySearch方法能對(duì)排序好的數(shù)組進(jìn)行二分查找法操作。
```java
package github.array;
import java.util.Arrays;
public class ArrayDemo06 {
? ? public static void main(String[] args) {
? ? ? ? int[] a = {1,2,3,4,9090,543,21,3,23};
? ? ? ? System.out.println(a);? // 地址值:[I@14ae5a5
? ? ? ? // 打印數(shù)組元素Arrays.toString
? ? ? ? System.out.print("系統(tǒng)打印數(shù)組方法:");
? ? ? ? System.out.println(Arrays.toString(a));
? ? ? ? System.out.print("自定義打印數(shù)組方法:");
? ? ? ? printfArray(a);
? ? ? ? // 數(shù)組排序
? ? ? ? Arrays.sort(a);
? ? ? ? System.out.println(Arrays.toString(a));
? ? ? ? // 數(shù)組填充
? ? ? ? Arrays.fill(a,2,4,12);? // 數(shù)組2~4之間填充12
? ? ? ? System.out.println("數(shù)組填充:" + Arrays.toString(a));
? ? ? ? // 數(shù)組查找
? ? ? ? int i = Arrays.binarySearch(a, 23);
? ? ? ? System.out.println("查找的元素在數(shù)組中的位置:" + i);
? ? }
? ? public? static void printfArray(int[] a){
? ? ? ? for (int i = 0; i < a.length; i++) {
? ? ? ? ? ? if(i==0){
? ? ? ? ? ? ? ? System.out.print("[");
? ? ? ? ? ? }
? ? ? ? ? ? if(i==a.length-1){
? ? ? ? ? ? ? ? System.out.print(a[i] + "]");
? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? System.out.print(a[i] + ", ");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println();
? ? }
}
```
#### chatGPT版:Arrays 工具類(lèi)的常用方法:
在 Java 中,數(shù)組是一種基本數(shù)據(jù)結(jié)構(gòu),但它也有一個(gè)名為 Arrays 的工具類(lèi),提供了許多有用的方法來(lái)操作數(shù)組。這個(gè)工具類(lèi)位于 java.util 包中,您可以通過(guò)導(dǎo)入該包來(lái)使用這些方法。以下是一些常用的 Arrays 類(lèi)方法:
###### 排序(Sorting):
Arrays 類(lèi)提供了排序數(shù)組的方法。您可以使用 sort() 方法對(duì)數(shù)組進(jìn)行升序排序:
java
Copy code
int[] numbers = {4, 2, 7, 1, 5};
Arrays.sort(numbers); // 對(duì)數(shù)組進(jìn)行升序排序
###### 查找(Searching):
您可以使用 binarySearch() 方法在已排序的數(shù)組中查找特定元素的索引:
java
Copy code
int[] numbers = {1, 2, 4, 5, 7};
int index = Arrays.binarySearch(numbers, 4); // 查找元素4的索引
###### 填充(Filling):
fill() 方法允許您將數(shù)組的**所有元素**設(shè)置為特定值:
java
Copy code
int[] numbers = new int[5];
Arrays.fill(numbers, 0); // 將數(shù)組的所有元素設(shè)置為0
比較(Comparing):
equals() 方法用于比較兩個(gè)數(shù)組是否相等。deepEquals() 方法還可以用于比較多維數(shù)組。
java
Copy code
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
boolean areEqual = Arrays.equals(arr1, arr2); // 比較數(shù)組是否相等
復(fù)制(Copying):
使用 copyOf() 或 copyOfRange() 方法可以復(fù)制數(shù)組的一部分或全部?jī)?nèi)容:
java
Copy code
int[] sourceArray = {1, 2, 3, 4, 5};
int[] copyArray = Arrays.copyOf(sourceArray, sourceArray.length); // 復(fù)制整個(gè)數(shù)組
int[] subArray = Arrays.copyOfRange(sourceArray, 1, 4); // 復(fù)制部分?jǐn)?shù)組
轉(zhuǎn)換為字符串(Converting to String):
toString() 方法可以將數(shù)組轉(zhuǎn)換為字符串形式,便于打印輸出:
java
Copy code
int[] numbers = {1, 2, 3};
String arrayAsString = Arrays.toString(numbers); // 轉(zhuǎn)換為字符串
這些是 java.util.Arrays 類(lèi)中的一些常見(jiàn)方法。
### 8 冒泡排序
冒泡排序無(wú)疑是最為出名的排序算法之一,總共有八大排序!
兩層循環(huán),外層冒泡輪數(shù),里層依次比較。
這個(gè)算法的時(shí)間復(fù)雜度為O(n2)。
public class ArrayDemo07 {
? ? public static void main(String[] args) {
? ? ? ? // 調(diào)用排序
? ? ? ? int[] array = {12,63,1,95,44,62,78};
? ? ? ? System.out.println("排序前:" + Arrays.toString(array));
? ? ? ? int[] sort = sort(array);? ?// 調(diào)用自定義冒泡排序函數(shù)
? ? ? ? System.out.println("排序后:" + Arrays.toString(sort));
? ? }
? ? // 冒泡排序
? ? /*
? ? 1.比較數(shù)組中,兩個(gè)相鄰的元素,如果第一個(gè)數(shù)比第二個(gè)數(shù)大,我們就交換他們的位置。
? ? 2.每一次比較,都會(huì)產(chǎn)生出一個(gè)最大或最小的數(shù)。
? ? 3.下一輪則可以少一次排序!
? ? 4.依次循環(huán),直到結(jié)束。
? ? ?*/
? ? public static int[] sort(int[] array){
? ? ? ? // 臨時(shí)變量
? ? ? ? int temp = 0;
? ? ? ? // 外層循環(huán),判斷要走多少次;
? ? ? ? for (int i = 0; i < array.length-1; i++) {
? ? ? ? ? ? boolean flag = false;? ?// 通過(guò)flag標(biāo)識(shí)位減少?zèng)]有意義的比較
? ? ? ? ? ? // 內(nèi)層循環(huán),比較大小,如果第一個(gè)數(shù)比第二個(gè)數(shù)大,交換位置
? ? ? ? ? ? for (int j = 0; j < array.length-1-i; j++) {
? ? ? ? ? ? ? ? if (array[j] > array[j+1]) {
? ? ? ? ? ? ? ? ? ? temp = array[j];
? ? ? ? ? ? ? ? ? ? array[j] = array[j + 1];
? ? ? ? ? ? ? ? ? ? array[j + 1] = temp;
? ? ? ? ? ? ? ? ? ? flag = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(flag==false){
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return array;
? ? }
}
在這里插入圖片描述
### 9 稀疏數(shù)組
當(dāng)一個(gè)數(shù)組中大部分元素為0,或者為同一值的數(shù)組時(shí),可以使用稀疏數(shù)組來(lái)保存該數(shù)組。
稀疏數(shù)組的處理方式是:
記錄數(shù)組一共有幾行幾列,有多少個(gè)不同值。
把具有不同值的元素和行列及值記錄在一個(gè)小規(guī)模的數(shù)組中,從而縮小程序的規(guī)模。
如下圖:左邊是原始數(shù)組,右邊是稀疏數(shù)組。
public class ArrayDemo08 {
? ? public static void main(String[] args) {
? ? ? ? // 1.創(chuàng)建一個(gè)二維數(shù)組
? ? ? ? int[][] array1 = new int[11][11];
? ? ? ? array1[1][2] = 1;
? ? ? ? array1[2][3] = 2;
? ? ? ? // 輸出原始數(shù)組
? ? ? ? System.out.println("輸出原始的數(shù)組");
? ? ? ? for(int[] ints:array1){
? ? ? ? ? ? for(int anInt : ints){
? ? ? ? ? ? ? ? System.out.print(anInt + "\t");
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println();
? ? ? ? }
? ? ? ? System.out.println("====================");
? ? ? ? // 轉(zhuǎn)換為稀疏數(shù)組保存
? ? ? ? // 獲取有效值的個(gè)數(shù)
? ? ? ? int sum = 0;
? ? ? ? for(int i = 0;i < 11;i++){
? ? ? ? ? ? for (int j = 0; j < 11; j++) {
? ? ? ? ? ? ? ? if(array1[i][j]!=0){
? ? ? ? ? ? ? ? ? ? sum++;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println("有效值的個(gè)數(shù):" + sum);
? ? ? ? // 2.創(chuàng)建一個(gè)稀疏數(shù)組的數(shù)組
? ? ? ? int[][] array2 = new int[sum+1][3];
? ? ? ? array2[0][0] = 11;
? ? ? ? array2[0][1] = 11;
? ? ? ? array2[0][2] = sum;
? ? ? ? // 遍歷二維數(shù)組,將非零的值,存放到稀疏數(shù)組
? ? ? ? int count = 0;
? ? ? ? for (int i = 0; i < array1.length; i++) {
? ? ? ? ? ? for (int j = 0; j < array1[i].length; j++) {
? ? ? ? ? ? ? ? if(array1[i][j]!=0){
? ? ? ? ? ? ? ? ? ? count++;
? ? ? ? ? ? ? ? ? ? array2[count][0] = i;
? ? ? ? ? ? ? ? ? ? array2[count][1] = j;
? ? ? ? ? ? ? ? ? ? array2[count][2] = array1[i][j];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 輸出稀疏數(shù)組
? ? ? ? System.out.println("稀疏數(shù)組:");
? ? ? ? for (int i = 0; i < array2.length; i++) {
? ? ? ? ? ? System.out.println(array2[i][0] + "\t"
? ? ? ? ? ? ? ? ? ? ? ? + array2[i][1] + "\t"
? ? ? ? ? ? ? ? ? ? ? ? + array2[i][2] + "\t");
? ? ? ? }
? ? ? ? System.out.println("===========");
? ? ? ? System.out.println("還原");
? ? ? ? // 1.讀取稀疏數(shù)組
? ? ? ? int[][] array3 = new int[array2[0][0]][array2[0][1]];
? ? ? ? // 2.給元素還原值
? ? ? ? for (int i = 1; i < array2.length; i++) {
? ? ? ? ? ? array3[array2[i][0]][array2[i][1]] = array2[i][2];
? ? ? ? }
? ? ? ? // 3.打印
? ? ? ? System.out.println("輸出原始的數(shù)組:");
? ? ? ? for(int[] ints:array3){
? ? ? ? ? ? for(int anInt : ints){
? ? ? ? ? ? ? ? System.out.print(anInt + "\t");
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println();
? ? ? ? }
? ? }
}