本篇文章给大家带来了关于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;
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 [][]{};写法 不过我个人不习惯。。。
int arr0 [][] = {{1,2},{3,4},{5,6}};//正确:静态、自动类型推断 int arr1 [][] = new int [3][2]; int arr2 [][] = new int [3][ ];//正确:动态、可省列数[] int arr3 [][][] = new int [3][ ][ ];//正确:动态、可省后两个[]
默认值问题:动态[i][j]有默认值,静态{}没有默认值(末尾详解)
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]....... //都会报错
报错案例:
数组下标越界: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] ; //前面[ ]必须空
③ int [ ] arr3 = new int [5] {1,2,3,4,5} ; //动态不能带{ }
数组的内存分配是连续的,系统要为数组分配一个固定的空间,如果100个空间以后被其他内容占用内存,那么数组就只能用到前99个空间,如果长度可以改变,那么arr[100]就会更改其他内容产生bug
二维数组遍历,两层for循环:
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]);报错下标越界 } }
运行结果:
arr.length是第一维度长度
arr[i].length是第i行的第二维度长度
arr[i][j].length是第i行j列的第三维度的长度
以二维数组为例,分为内层和外层。形如arr[0] arr[1]的是外层,完整表达arr[1][2]的是内层
一、对于一个外层arr[1]来说,它就是一个一维数组,就会分为“初始化”和“未初始化”的两种情况:
例1:
int arr1[][] = new int [3][]; System.out.println( arr1[1] ); //运行结果:null
此时只知道外层行数,但内层没有初始化,没有分配地址,故结果为null
int arr1[][] = new int [3][5];//任意给定列数 System.out.println(arr1[1]); //运行结果:[I@15db9742
此时内层长度确定,初始化完成,arr1[1]指向一个首地址[I@15db9742
一个 [ 表示arr[1]的内层为一维数组,I是int的首字母,@后面是地址
例2:
String arr1[][] = new String [3][5]; System.out.println(arr1); //运行结果:[[Ljava.lang.String;@15db9742
因为完整定义了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中文网其他相关文章!