java初級編程——數(shù)組
數(shù)組的概述
/*
* 一、數(shù)組的概述
* 1.數(shù)組的理解:數(shù)組(Array)尾序,是多個相同類型數(shù)據(jù)按一定順序排列的集合抒巢,并使用一個名字命名,
* 并通過編號的方式對這些數(shù)據(jù)進行統(tǒng)一管理。
*
* 2.數(shù)組相關(guān)的概念:
* >數(shù)組名
* >元素
* >角標再来、下標鹰霍、索引
* >數(shù)組的長度:元素的個數(shù)
*
* 3.數(shù)組的特點:
* 1)數(shù)組是有序排列的
* 2)數(shù)組屬于引用數(shù)據(jù)類型的變量闻鉴。數(shù)組的元素,既可以是基本數(shù)據(jù)類型茂洒,也可以是引用數(shù)據(jù)類型
* (引用類型一般都是通過new關(guān)鍵字創(chuàng)建對象孟岛,然后把這個對象賦予給相應(yīng)的變量,最常用的引用類型是String類型)
* 3)創(chuàng)建數(shù)組對象會在內(nèi)存中開辟一整塊連續(xù)的空間
* 4)數(shù)組的長度一旦確定督勺,就不能修改渠羞。
*
* 4. 數(shù)組的分類:
* ① 按照維數(shù):一維數(shù)組、二維數(shù)組智哀、次询。。瓷叫。
* ② 按照數(shù)組元素的類型:基本數(shù)據(jù)類型元素的數(shù)組屯吊、引用數(shù)據(jù)類型元素的數(shù)組
*
* 5. 一維數(shù)組的使用
* ① 一維數(shù)組的聲明和初始化
* ② 如何調(diào)用數(shù)組的指定位置的元素
* ③ 如何獲取數(shù)組的長度
* ④ 如何遍歷數(shù)組
* ⑤ 數(shù)組元素的默認初始化值 :見ArrayTest1.java
* ⑥ 數(shù)組的內(nèi)存解析 :見ArrayTest1.java
*/
public class ArrayTest {
public static void main(String[] args) {
//1. 一維數(shù)組的聲明和初始化
int num;//聲明
num = 10;//初始化
int id = 1001;//聲明 + 初始化
int[] ids;//聲明
//1.1 靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時進行
ids = new int[]{1001,1002,1003,1004};
//1.2動態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作分開進行
//動態(tài)語句僅僅是指定數(shù)組內(nèi)元素個數(shù),未對數(shù)組元素的賦值
String[] names = new String[5];
//錯誤的寫法:
// int[] arr1 = new int[];
// int[5] arr2 = new int[5];
// int[] arr3 = new int[3]{1,2,3};
//前面的中括號應(yīng)該是空著的
//也是正確的寫法:
int[] arr4 = {1,2,3,4,5};//類型推斷
//總結(jié):數(shù)組一旦初始化完成赞辩,其長度就確定了雌芽。
//2.如何調(diào)用數(shù)組的指定位置的元素:通過角標的方式調(diào)用。
//數(shù)組的角標(或索引)從0開始的辨嗽,到數(shù)組的長度-1結(jié)束世落。
names[0] = "王銘";
names[1] = "王赫";
names[2] = "張學良";
names[3] = "孫居龍";
names[4] = "王宏志";//charAt(0)
// names[5] = "周揚";從語法上可以過
//3.如何獲取數(shù)組的長度。
//屬性:length
System.out.println(names.length);//5
System.out.println(ids.length);
//4.如何遍歷數(shù)組
/*System.out.println(names[0]);
System.out.println(names[1]);
System.out.println(names[2]);
System.out.println(names[3]);
System.out.println(names[4]);*/
for(int i = 0;i < names.length;i++){
System.out.println(names[i]);
}
}
}
數(shù)組的初始化
/*
* ⑤ 數(shù)組元素的默認初始化值
* > 數(shù)組元素是整型:0(int,short,byte,long)
* > 數(shù)組元素是浮點型:0.0(float,double)
* > 數(shù)組元素是char型:0或'\u0000',而非'0'
* > 數(shù)組元素是boolean型:false
*
* > 數(shù)組元素是引用數(shù)據(jù)類型(比如字符串):null
*
* ⑥ 數(shù)組的內(nèi)存解析
*/
public class ArrayTest1 {
public static void main(String[] args) {
//5.數(shù)組元素的默認初始化值
// 沒有輔助屉佳,是系統(tǒng)默認的值
// 默認初始化值肯定要動態(tài)賦值
int[] arr = new int[4];
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
System.out.println("**********");
short[] arr1 = new short[4];
for(int i = 0;i < arr1.length;i++){
System.out.println(arr1[i]);
}
System.out.println("**********");
float[] arr2 = new float[5];
for(int i = 0;i < arr2.length;i++){
System.out.println(arr2[i]);
}
System.out.println("**********");
char[] arr3 = new char[4];
for(int i = 0;i < arr3.length;i++){
System.out.println("----" + arr3[i] + "****");
}
// 此處結(jié)果的空格僅僅是效果谷朝,實際仍然是0
if(arr3[0] == 0){
System.out.println("你好!");
}
System.out.println("**********");
boolean[] arr4 = new boolean[5];
System.out.println(arr4[0]);
System.out.println("**********");
String[] arr5 = new String[5];
System.out.println(arr5[0]);
if(arr5[0] == null){
System.out.println("北京天氣不錯武花!");
}
}
}
簡單的內(nèi)存結(jié)構(gòu)
- 棧(stack):
- 線性圆凰,一維
- 存放局部變量
- 堆(heap)
- 存放new定義的結(jié)構(gòu):對象、數(shù)組
- 方法區(qū):
- 常量池
- 靜態(tài)域
內(nèi)存的簡化結(jié)構(gòu)
一維數(shù)組的內(nèi)存解析
//棧結(jié)構(gòu)和對結(jié)構(gòu)
//arr在main方法中体箕,放在方法中的變量都叫局部變量专钉,局部變量放在stack中
//new的結(jié)構(gòu)在heap里,有一個長度是3的結(jié)構(gòu)累铅,且在內(nèi)存中連續(xù)存儲
//heap空間中跃须,連續(xù)的元素有首地址值
//把heap空間中的首地址值賦給stack空間的arr
//stack空間的arr通過地址值可以找到堆空間的數(shù)組了
int[] arr = new int[]{1,2,3};
//new的結(jié)構(gòu)在heap里,有一個長度是4的結(jié)構(gòu)娃兽,且在內(nèi)存中連續(xù)存儲,默認值是null(空值)
//heap空間中菇民,連續(xù)的元素有首地址值
//把heap空間中的首地址值賦給stack空間的arr1
String[] arr1 = new String[4];
//德華賦給長度為4的第2個位置;學友賦給第3個位置
arr1[1] = "德華";
arr1[2] = "學友";
//將原來的首位置值改成新賦值的new的首位置值
arr1 = new String[3];
Syste.out.println(arr1[1]);//輸出null
//如果最后stack空間沒有變量調(diào)動heap空間投储,那么堆空間中的內(nèi)容就不會被調(diào)動第练,賦的值會被回收
//如果main方法中的變量全被執(zhí)行過了,那么heap中的變量就會全部沒用(回收)玛荞,arr1娇掏,2就會出stack==》相當于整個空間會被清空掉
一維數(shù)組使用練習
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[] { 8, 2, 1, 0, 3 };
int[] index = new int[] { 2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3 };
String tel = "";
for (int i = 0; i < index.length; i++) {
tel += arr[index[i]];
}
System.out.println("聯(lián)系方式:" + tel);//18...
}
}
成績練習
import java.util.Scanner;
/*
* 2. 從鍵盤讀入學生成績,找出最高分冲泥,并輸出學生成績等級驹碍。
成績>=最高分-10 等級為’A’
成績>=最高分-20 等級為’B’
成績>=最高分-30 等級為’C’
其余 等級為’D’
提示:先讀入學生人數(shù),根據(jù)人數(shù)創(chuàng)建int數(shù)組凡恍,存放學生成績志秃。
*
*/
public class ArrayExer1_1 {
public static void main(String[] args) {
//1.使用Scanner,讀取學生個數(shù)
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入學生人數(shù):");
int number = scanner.nextInt();
//2.創(chuàng)建數(shù)組嚼酝,存儲學生成績:動態(tài)初始化
int[] scores = new int[number];
//3.給數(shù)組中的元素賦值
System.out.println("請輸入" + number + "個學生成績:");
int maxScore = 0;
for(int i = 0;i < scores.length;i++){
scores[i] = scanner.nextInt();
//4.獲取數(shù)組中的元素的最大值:最高分
if(maxScore < scores[i]){
maxScore = scores[i];
}
}
// for(int i = 0;i < scores.length;i++){
// if(maxScore < scores[i]){
// maxScore = scores[i];
// }
// }
//5.根據(jù)每個學生成績與最高分的差值浮还,得到每個學生的等級,并輸出等級和成績
char level;
for(int i = 0;i < scores.length;i++){
if(maxScore - scores[i] <= 10){
level = 'A';
}else if(maxScore - scores[i] <= 20){
level = 'B';
}else if(maxScore - scores[i] <= 30){
level = 'C';
}else{
level = 'D';
}
System.out.println("student " + i +
" score is " + scores[i] + ",grade is " + level);
}
}
}
多維數(shù)組的使用
- 如果說可以把一維數(shù)組當成幾何中的線性圖形闽巩,那么二維數(shù)組就相當于是一個表格钧舌,如Excel一樣。
- 數(shù)組本身屬于引用數(shù)據(jù)類型涎跨,數(shù)組元素也可以是引用數(shù)據(jù)類型洼冻。---->數(shù)組元素也可以數(shù)數(shù)組
- 對于二維數(shù)組,可以看成是一維數(shù)組array1又作為另一個一維數(shù)組array2的元素而存在隅很。其實撞牢,==從數(shù)組底層的運行機制來看,其實沒有所謂的多維數(shù)組==。
/*
* 二維數(shù)組的使用
*
* 1.理解:
* 對于二維數(shù)組的理解屋彪,我們可以看成是一維數(shù)組array1又作為另一個一維數(shù)組array2的元素而存在所宰。
* 其實,從數(shù)組底層的運行機制來看畜挥,其實沒有多維數(shù)組仔粥。
*
* 2. 二維數(shù)組的使用:
* ① 二維數(shù)組的聲明和初始化
* ② 如何調(diào)用數(shù)組的指定位置的元素
* ③ 如何獲取數(shù)組的長度
* ④ 如何遍歷數(shù)組
* ⑤ 數(shù)組元素的默認初始化值 :見 ArrayTest3.java
* ⑥ 數(shù)組的內(nèi)存解析 :見 ArrayTest3.java
*
*
*/
public class ArrayTest2 {
public static void main(String[] args) {
//1.二維數(shù)組的聲明和初始化
int[] arr = new int[]{1,2,3};//一維數(shù)組
//靜態(tài)初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//動態(tài)初始化1
String[][] arr2 = new String[3][2];
//動態(tài)初始化2
String[][] arr3 = new String[3][];
//錯誤的情況
// String[][] arr4 = new String[][4];
// String[4][3] arr5 = new String[][];
// int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
// 有長度就不賦值,不賦值就有長度
//也是正確的寫法:
int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//類型推斷
//2.如何調(diào)用數(shù)組的指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
arr3[1] = new String[4];//arr3之前的定義僅僅空有三個元素蟹但,但每個元素內(nèi)沒有東西躯泰,調(diào)用會空指針報錯
// 此處定義String[4],是在原來arr3的第二個位置處定義4個元素
System.out.println(arr3[1][0]);
//3.獲取數(shù)組的長度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//4
//4.如何遍歷二維數(shù)組
for(int i = 0;i < arr4.length;i++){
for(int j = 0;j < arr4[i].length;j++){
System.out.print(arr4[i][j] + " ");
}
System.out.println();
}
}
}
/*
* 二維數(shù)組的使用:
* 規(guī)定:二維數(shù)組分為外層數(shù)組的元素,內(nèi)層數(shù)組的元素
* int[][] arr = new int[4][3];
* 外層元素:arr[0],arr[1]等
* 內(nèi)層元素:arr[0][0],arr[1][2]等
*
* ⑤ 數(shù)組元素的默認初始化值
* 針對于初始化方式一:比如:int[][] arr = new int[4][3];
* 外層元素的初始化值為:地址值
* 內(nèi)層元素的初始化值為:與一維數(shù)組初始化情況相同
*
* 針對于初始化方式二:比如:int[][] arr = new int[4][];
* 外層元素的初始化值為:null
* 內(nèi)層元素的初始化值為:不能調(diào)用矮湘,否則報錯斟冕。
*
* ⑥ 數(shù)組的內(nèi)存解析
*
*/
public class ArrayTest3 {
public static void main(String[] args) {
int[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@15db9742 地址
System.out.println(arr[0][0]);//0
// System.out.println(arr);//[[I@6d06d69c 兩個作中括號說明是int型
System.out.println("*****************");
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//地址值
System.out.println(arr1[0][0]);//0.0
System.out.println("*****************");
String[][] arr2 = new String[4][2];
System.out.println(arr2[1]);//地址值
System.out.println(arr2[1][1]);//null,因為是String型
System.out.println("*****************");
double[][] arr3 = new double[4][];
System.out.println(arr3[1]);//null缅阳,內(nèi)層沒有初始化過,但皆為數(shù)組景描,屬于引用類型十办,引用類型默認值都是null
// System.out.println(arr3[1][0]);//報錯
}
}
二維數(shù)組的內(nèi)存結(jié)構(gòu)
int[][]arr1 = new int[4][];
//內(nèi)層結(jié)構(gòu)沒寫,此時是int型的一維數(shù)組,未賦值超棺,外層結(jié)構(gòu)中顯示為null
arr1[1] = new int[]{1,2,3};
//定義第一個
內(nèi)層結(jié)構(gòu)(靜態(tài)賦值)向族,內(nèi)部為int型初始化,先為0棠绘,后賦值1,2,3
arr1[2] = new int[4];
//定義第二個內(nèi)層結(jié)構(gòu)(動態(tài)賦值)件相,內(nèi)部為int型初始化,為0氧苍,未賦值
arr1[2][1] = 30;
//定義第二個內(nèi)層結(jié)構(gòu)中第二個位置夜矗,賦值30
二維數(shù)組內(nèi)存解析
練習
1.寫出一維數(shù)組初始化的兩種方式
int[] arr = new int[5];//動態(tài)初始化
String[] arr1 = new String[]{"Tom","Jerry","Jim"};//靜態(tài)初始化
數(shù)組一旦初始化,其長度就是確定的让虐。arr.length
數(shù)組長度一旦確定紊撕,就不可修改。
2.寫出二維數(shù)組初始化的兩種方式
int[][] arr = new int[4][3];//動態(tài)初始化1
int[][] arr1 = new int[4][];//動態(tài)初始化2
int[][] arr2 = new int[][]{{1,2,3},{4,5,6},{7,8}};//靜態(tài)初始化
3.如何遍歷如下的二維數(shù)組
int[] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
4.不同類型的一維數(shù)組元素的默認初始化值各是多少
整型 : 0
浮點型:0.0
char:0
boolean :false
引用類型:null
5.一維數(shù)組的內(nèi)存解析:
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];
內(nèi)存解析