标签:htm 应该 log 特定 static getname targe ssl tcl
目录结构:
一维数组就是在内存连续分配的一段存储空间。
数据类型 [] 数组变量名称 ={初始值1,初始值2,初始值3,.......};
数据类型 [] 数据变量名 = new 数据类型[数组长度];
数据类型 数据变量名 [] =new 数据类型[数组长度];
二维数据就是使用一维数组组成的数据,其元素是一维数组。
数据类型 [][] 数据变量名 = {{初始值11,初始值12,初始值13,......},{初始值21,初始值22,初始值23,......},{初始值31,初始值32,初始值33,......},......};
数据类型 [][] 数据变量名 =new 数据类型 [行数][列数];
例如:int [][] arr=new int [3][2];//创建一个3行,2列的二维数组
数据类型 [][]数据变量名= new 数据类型 [行数][];
数据变量名 [行数] = new 数据类型[列数];
例如:
int [][] arr= new int[3][];//创建一个二维数组,指定为3行
arr[0]=new int[2];//第一行指定为2列
arr[1]=new int[3];//第二行指定为3列
arr[2]=new int[4];//第三行指定为4列
接下来我们来看一个遍历二维数组的代码:
int [][] arr=new int[4][];//声明一个二维数组,指定为4行 arr[0]=new int[2];//第1行,声明为2列 arr[1]=new int[3];//第2行,声明为3列 arr[2]=new int[4];//第3行,声明为4列 arr[3]=new int[5];//第4行,声明为5列 for(int row=0;row<arr.length;row++){//arr.length 代表总的行数 for(int column=0;column<arr[row].length;column++){// arr[row]代表第row+1行,因此 arr[row].length代表第row行的列数 System.out.print(arr[row][column]); } System.out.println(); }
从中我们可以看出其中:
arr -- 代表arr二维数组
arr[n] -- 代表二维数组的第n+1行,也就是1个一维数组
arr[n][m] -- 代表二维数组中某一个具体的元素
一位数组就是在内存中连续分配的一段内存空间,数组名称代表这个容器的地址。
二维数组就是一维数组组成的一维数组,所以二维数组的在内存中的表示方式应该是和一维数组类似:
上面图形的表示的二维数组可以声明为以下格式:
int [][] Arrays={{11,12,13},{14,15},{16}};
也就是一共三行,第一行三个数据,第二行两个数据,第三行一个数据。
我在Java中使用数组声明完毕后(如:int [] arr=new int[3];),会自动赋上默认值。数据类型一共分为两大类,基本数据类型和引用数据类型。
其中基本数据类型:
byte/short/int/long 的默认数组是0
float/double 的默认值是0.0
char 的默认值是空格
boolean 的默认值是false
这里需要注意char数组的默认值是空格而不是0,因为十进制0在ASCII中恰好对应空字符。
首先可以肯定java中的数组是对象,详见java中的数组是对象吗
我们通过以下程序找出数组对象的类:
int a[] = new int[10]; Class clazz = a.getClass(); System.out.println(clazz.getDeclaredFields().length); System.out.println(clazz.getDeclaredMethods().length); System.out.println(clazz.getDeclaredConstructors().length); System.out.println(clazz.getDeclaredAnnotations().length); System.out.println(clazz.getDeclaredClasses().length); System.out.println(clazz.getSuperclass());
System.out.println(clazz.getName());
以上代码的输出为:
0 0 0 0 0 class java.lang.Object
[I
从以上的代码我们可以看出,一维数组的数组类没有属性、没有方法、没有构造方法、没有注释,一维数组直接继承于java.lang.Object,一维数组的类名是[I(其实一个[字符代表一维数组的名称,两个[代表二维数组的名称,三个[字符代表三维数组的名称,.............)。
这就比较奇怪了,既然数组类没有属性和方法,那么为什么可以调用.length而不报错,在查阅了JVM技术文档后在5.3.3. Creating Array Classes得出了数据类的创建来源:
“The Java Virtual Machine creates a new array class with the indicated component type and number of dimensions”,大致意思就是“Java虚拟机会据元素类型和维度,创建相应的数组类。”。
JVM不把数组类放到任何包中,也不给他们起个合法的标识符名称,估计是为了避免和JDK、第三方及用户自定义的类发生冲突吧。
现在我们知道了数组类的来源,但是为什么数组类没有任何属性和方法,但是却可以调用.length却可以不报错,然后我们来看一看一个简单文件的字节码文件:
public class Main { public static void main(String[] args) { int a[] = new int[2]; int i = a.length; } }
用jclasslib打开我们可以得出:
0 iconst_2 //将int型常量2压入操作数栈 1 newarray 10 (int) //将2弹出操作数栈,作为长度,创建一个元素类型为int, 维度为1的数组,并将数组的引用压入操作数栈 3 astore_1 //将数组的引用从操作数栈中弹出,保存在索引为1的局部变量(即a)中 4 aload_1 //将索引为1的局部变量(即a)压入操作数栈 5 arraylength //从操作数栈弹出数组引用(即a),并获取其长度(JVM负责实现如何获取),并将长度压入操作数栈 6 istore_2 //将数组长度从操作数栈弹出,保存在索引为2的局部变量(即i)中 7 return //main方法返回
可见,在这段字节码中,根本就没有看见length这个成员变量,获取数组长度是由一条特定的指令arraylength实现。编译器对Array.length这样的语法做了特殊处理,直接编译成了arraylength指令。另外,JVM创建数组类,应该就是由newarray这条指令触发的了。
标签:htm 应该 log 特定 static getname targe ssl tcl
原文地址:http://www.cnblogs.com/HDK2016/p/6746610.html