數(shù)組簡介
數(shù)組: 存儲相同類型的一組數(shù)據(jù),數(shù)組也是一種數(shù)據(jù)類型,是引用數(shù)據(jù)類型。
-
定義格式一
數(shù)據(jù)類型[] 數(shù)組名 =new 數(shù)據(jù)類型[數(shù)組的長度];如:int[] arr=new int[10];
new 是在內(nèi)存中分配空間,空間的大小由數(shù)組的長度和數(shù)據(jù)類型決定,在數(shù)組的內(nèi)存分配完成后,會將內(nèi)存的首地址返回給數(shù)組名,因此數(shù)組名是指向內(nèi)存空間首地址的引用。
-
定義格式二
int[] arr={9,1,4,6,9,10};
數(shù)組案例
圖解
重點,值傳遞還是引用傳遞
/***
* 基本數(shù)據(jù)類型與引用數(shù)據(jù)類型的區(qū)別
*/
public class Demo {
//顯示一個數(shù)
static void show(int a) {
a += 5;
}
static void show(int[] nums) {
nums[0] += 5;
}
public static void main(String[] args) {
int a = 10;
show(a);
System.out.println(a);//10 并不是15
int[] nums = {9, 5, 2};
show(nums); //將數(shù)組的首地址傳給了方法中的數(shù)組引用
System.out.println(nums[0]);//14 并不是9
//////////////////////////////////
//字符串的常量對象: 保存在常量池中
String str = "hihi";
String str2 = "hihi";
System.out.println(str == str2);//結(jié)果:true
show(str);//將str變量的內(nèi)容“hihi”傳給方法
System.out.println(str);//輸出:hihi
String str3 = new String("hihi");
String str4 = str3;
str3 = "hehe"; //hehe在常量池不存在,則會在常量池中創(chuàng)建對象,str3就指向這個對象
System.out.println(str4);//輸出: hihi
}
}
在Java中,變量分為以下兩類:
- 對于基本數(shù)據(jù)類型變量(int、long、double、float、byte、boolean、char),Java是傳值的副本。
- 對于一切對象型變量,Java都是傳引用的副本。其實傳引用副本的實質(zhì)就是復制指向地址的指針(對于對象參數(shù)變量則傳對象的地址)
需要注意的是:String類型也是對象型變量,所以它必然是傳引用副本。String類是final類型的,因此不可以繼承和修改這個類。
不管Java參數(shù)的類型是什么,一律傳遞參數(shù)的副本。
數(shù)據(jù)交換
/**
* 數(shù)據(jù)交換
*/
public class Demo{
public static void main(String[] args) {
int a = 10, b = 30;
System.out.println(a + "," + b);
swap(a, b);
int[] nums = {100, 200};
swap(nums);
}
//交換a和b的數(shù)值
static void swap(int a, int b) {
/*int c=a;
a=b;
b=c;
*/
a = a + b;
b = a - b;
a = a - b;
System.out.println(a + "," + b);
}
//方法參數(shù): 引用類型
static void swap(int[] nums) {
swap(nums[0], nums[1]);
System.out.println(nums[0] + "," + nums[1]); //此時數(shù)組中的數(shù)值不會改變
int c = nums[0];
nums[0] = nums[1];
nums[1] = c;
System.out.println(nums[0] + "," + nums[1]); //此時,兩個數(shù)值已交換
}
}
增強for循環(huán)
格式
for(數(shù)據(jù)類型 變量名:數(shù)組名){ 循環(huán)體 }
過程: 將數(shù)組中數(shù)從0的位置依次讀取, 不好之處在于在循環(huán)體中無法訪問 當前讀取的索引值。
增強for 循環(huán)舉例
public class Demo{
public static void main(String[] args) {
//動態(tài)生成10個隨機數(shù)(1~100),并讀?。ù蛴。? int[] nums = new int[10];
for (int i = 0; i < nums.length; i++) {
nums[i] = (int) (Math.random() * 100 + 1); //生成1~100之間的隨機數(shù)
}
//打印
for (int n : nums) {
System.out.print(n + "\t");
}
}
}
二維數(shù)組
定義格式:
數(shù)據(jù)類型[][] 數(shù)組名 = new 數(shù)據(jù)類型[行大小][列大小];
數(shù)據(jù)類型[][] 數(shù)組名 =new 數(shù)據(jù)類型[][]{{1,3,2},{2,3,4},{},{0,9,2}}
數(shù)據(jù)類型[][] 數(shù)組名 ={{1,3,2},{2,3,4},{},{0,9,2}}
二維數(shù)組案例
public class Demo{
public static void main(String[] args) {
int[][] scores = new int[][]{{90, 80, 100}, {92, 90, 100}, {91, 95, 96}, {95, 100, 100}, {97, 98, 100}};
//循環(huán)一維數(shù)組:行
for (int i = 0; i < scores.length; i++) {
System.out.print("第 " + (i + 1) + " 人的成績:");
//循環(huán)二維數(shù)組: 列
for (int j = 0; j < scores[i].length; j++) {
if (j != scores[i].length - 1)
System.out.print(scores[i][j] + ",");
else
System.out.print(scores[i][j] + "\n");
}
}
}
}
方法補充
遞歸方法
自己調(diào)用自己的方法,遞歸方法要求有兩個點,一是遞歸公式,另一個是遞歸條件。
-
例子一 遞歸求階乘
/** * 遞歸求階乘 * * @param n */ private static int fun(int n) { if (n == 0 || n == 1) { return 1; } return n * fun(n - 1); } -
例子二 兔子生兔子的問題
3個月起每個月都生一對兔子,小兔子長到第四個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數(shù)為多少?/** * 古典兔子 * * @param x * @return */ public static int getNums(int x) { int nums = 1; if (x == 1 || x == 2) { return nums; } return getNums(x - 1) + getNums(x - 2); }
考點
當一個對象被當作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?(值傳遞還是引用傳遞)
是值傳遞。Java語言的方法調(diào)用只支持參數(shù)的值傳遞。當一個對象實例作為一個參數(shù)被傳遞到方法中時,參數(shù)的值就是對該對象的引用。對象的屬性可以在被調(diào)用過程中被改變,但對對象引用的改變是不會影響到調(diào)用者的。