首頁  >  文章  >  Java  >  Java歸納總結之數組詳解

Java歸納總結之數組詳解

WBOY
WBOY轉載
2022-04-25 16:08:222003瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於數組的相關問題,包括了命名規則、自動類型推斷、靜態動態初始化、多維數組的其他寫法、常見錯誤寫法等等內容,以下一起來看一下,希望對大家有幫助。

Java歸納總結之數組詳解

推薦學習:《java影片教學

索引:命名規則、自動類型推論、靜態動態初始化、多維數組的其他寫法、常見錯誤寫法、數組下標越界、預設值問題、數組長度問題、數組記憶體解析

正確寫法:

1.步驟分類:(以下int可替換為char String double等等)
#        ①一步寫法:

#
int [] ids = new int []{1001,1002,1003};// 声明+初始化

int ids [] = new int []{1001,1002,1003}; // [ ]位置有两种放法


int ids [] = {1001,1002,1003};//自动类型推断,new int []可省


/**********错误示范***错误示范***错误示范***错误示范************/

int ids [] = new [] int{1001,1002,1003};//只有定义时的[]可以乱动

    :僅在一步寫法中適用,可省略=右邊的new int [ ]

#         ②兩步驟寫法:

int ids [] ;   //声明

ids = new int [ ] {1001,1002,1003} ;   //初始化

/**********错误示范***错误示范***错误示范***错误示范************/

int ids [];
ids [] = new int {1001,1002,1003};//分两步时,左边不加[]


int ids [];
ids = {1001,1002,1003};//分两步时,没有类型推断

# 2.狀態分類:靜態動態必須二選一,給長度不加{},給{}不加長度

        ①靜態初始化:

两个[ ]均为空
String [] name = new String [] {"张三","李四"} ;
//也可写为String [] name = {"张三","李四"};

        ②動態初始化:

后面的[ ]必须带数字规定长度,并且不能{}赋值

String [ ] name ;
name = new String [2] ;
//可以合为一步写String name [] = new String [2];

/**********错误示范****错误示范****错误示范********/
int ids [3][4] = XXXXXXXXX;
int ids [3][ ] = XXXXXXXXX;
int ids [ ][4] = XXXXXXXXX;

多維數組

# 預設值問題:動態[i][j]有預設值,靜態{}沒有預設值(結尾詳解)

int arr1 [][] =XXXXXXXXXXX;
int [] arr2 []=XXXXXXXXXXX;
int [][] arr3 =XXXXXXXXXXX;
//都是正确写法
Java主张 int [] arr = new int []{}; 写法



//多维数组同理
int [] arr[][] =XXXXXXXX;
int [][] arr[] =XXXXXXXX;
随便瞎基8放都是正确的
Java主张 int [][] arr = new int [][]{};写法

不过我个人不习惯。。。
 報錯誤案例:


#陣列下標越界:

arr[1][1]在靜態初始化的時候沒有給值,所以沒有分配記憶體空間,編譯能通過,但是存取的時候會報錯。此靜態初始化的陣列範圍僅限於arr[0][0]  arr[0][1]  到arr[1][0]

深入記憶體理解:(最後詳解)# String cod [][] = new String [3][ ];//只定義了行,列數未知 System.out.println(cod[1][1]);//未定義列,不給預設值。執行報錯

正確寫法:加一步cod[1]=new String [2\3\4....];分配列內存,給定預設值null

 常見錯誤寫法

 ① int [ ] arr1 = new int [ ] ;

             

# ② int [3] arr2 = new int [3] ;                  地# [5] {1,2,3,4,5} ;     //動態不能帶{ }

#陣列一旦確定(宣告初始化),長度就固定了,不能改變

#數組的記憶體分配是連續的,系統要為數組分配一個固定的空間,如果100個空間以後被其他內容佔用內存,那麼數組就只能用到前99個空間,如果長度可以改變,那麼arr [100]就會更改其他內容產生bug

一個例子說明數組長度問題:

二維數組遍歷,兩層for循環:

int arr0 [][] = {{1,2},{3,4},{5,6}};//正确:静态、自动类型推断
int arr1 [][] = new int [3][2];
int arr2 [][] = new int [3][ ];//正确:动态、可省列数[]
int arr3 [][][] = new int [3][ ][ ];//正确:动态、可省后两个[]

運行結果:

arr.length是第一個維度長度

arr[i].length是第i行的第二個維度長度

arr [i][j].length是第i行j列的第三個維度的長度

數組記憶體解析:

以二維數組為例,分為內層和外層。形如arr[0] arr[1]的是外層,完整表達arr[1][2]的是內層

一、對一個外層arr[1]來說,它就是一個一維數組,就會分為「初始化」與「未初始化」的兩種情況:

例1:

int arr0 [][] = new int [2][2];//动态初始化,分配内存
//数组内的4个成员全部默认为0,编译运行都不会报错


int arr0 [][] = new int [][]{ {1,2},{3} };
//静态初始化,编译能通过,arr0[1][1]没有默认值(未分配空间)
//编译能通过,运行到arr[1][1]会报错



int arr0[][] = new int [3][] ;
// 输出arr0[3][0]  arr0[3][1]  arr0[3][2]  arr0[3][3].......
//都会报错
 此時只知道外層行數,但內層沒有初始化,沒有分配位址,故結果為null###
public class Test2 {
	public static void main(String args[]) {
	int arr[][] = { {1,2,3},{4,5,6,7},{8,9},{10}};
		
		for(int i = 0 ; i <arr.length ; i++){//arr.length
			for(int j = 0 ; j<arr[i].length ;j++){//arr[i].length
				System.out.println(arr[i][j]+"    ");
				}
                        System.out.println();		
}
		//System.out.println(arr[2][2]);报错下标越界
                }
}
###此時內層長度確定,初始化完成,arr1[1]指向一個首位址[I@15db9742######一個[ 表示arr[ 1]的內層為一維數組,I是int的首字母,@後面是地址######例2:###
int arr1[][] = new int [3][];
System.out.println( arr1[1] );
//运行结果:null
###因為完整定義了String數組,故分配了空間,arr1指向arr1[0][0]的位址(整個陣列的首位址)###

两个[[表示里面有二维数组,java.lang.String;是包名

例3:

float arr1[][] = new float  [3][5];
System.out.println(arr1[0]);
//结果:[F@15db9742

外层元素初始化值为:地址值

内层元素初始化值为:与一维数组初始化情况相同

一维数组初始化:

1.数组元素是整形int long short :  0

2.数组元素是浮点型float double : 0.0

3.数组元素是boolean型:false

4.数组元素是引用类型  : null

5.数组元素是char型 :0 或 '\u0000' 而非‘0’

数字0,而不是字符0,对应的ASCII码不一样

'\u0000'是Unicode码第0000号位,是一个空格符,但是不是键盘上的空格

验证如下:

經典例題:

 

解:b e可以,acdf都不行

推荐学习:《java视频教程

以上是Java歸納總結之數組詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除