java数组(一)

2014-11-23 22:59:06 · 作者: · 浏览: 3
如果对您有小小的帮助,是我莫大的荣幸!
ps:本文讨论范围为java
一:数组是什么呢?他是一个对象,一个神奇的对象
[java]
public class Test {
public static void main(String[] args) {
int[] array = new int[10];
System.out.println("array的父类是:" + array.getClass().getSuperclass());
System.out.println("array的类名是:" + array.getClass().getName());
}
}
-------Output:
array的父类是:class java.lang.Object
array的类名是:[I
噢,它的类名好奇怪诶:
[java
[I是个神马??它本身都不符合法,所以我认为一定是SUN那帮天才一定偷偷干了些什么,再看如下代码
[java]
public class Test {
public static void main(String[] args) {
int[] array_00 = new int[10];
System.out.println("一维数组:" + array_00.getClass().getName());
int[][] array_01 = new int[10][10];
System.out.println("二维数组:" + array_01.getClass().getName());
int[][][] array_02 = new int[10][10][10];
System.out.println("三维数组:" + array_02.getClass().getName());
}
}
-----------------Output:
一维数组:[I
二维数组:[[I
三维数组:[[[I
不能发现:[代表它的维度
暂时不管 [I 哪里来的,看下面代码
[java]
public class Test {
public static void main(String[] args) {
int[] array = new int[10];
Class clazz = array.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);
}
}
----------------Output:
0
0
0
0
0
这,数组类明显是个空类,奇怪的是length方法怎么来的??我们都知道,数组类是Object的子类,而Object也不含length方法,而数组类本身是个空类,由此可以猜测:
这个方法一定是JVM偷偷处理的
答案就在下面的代码中:
[java]
public class Main {
public static void main(String[] args) {
int a[] = new int[2];
int i = a.length;
}
}
观看编译后的class文件如下
[java]
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方法返回
总结下:数组是一个对象,数组名:[I ,数组对象:[Ljava.lang.Object
数组类是一个空对象,它的长度是JVM偷偷处理的
下面我们聊聊第二个问题:
二:为了性能,您还是优先考虑数组吧
在项目设计中数组使用的越来越少了,而且它确实是没有List、Set这些集合使用方便,但是在某些方面数组还是存在一些优势的,例如:速度,而且集合类的底层也都是通过数组来实现的
[java]
--------这是ArrayList的add()------
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
下面利用数组和list来做一些操作比较
[java]
Long time1 = System.currentTimeMillis();
for(int i = 0 ; i < 100000000 ;i++){
sum += arrays[i%10];
}
Long time2 = System.currentTimeMillis();
System.out.println("数组求和所花费时间:" + (time2 - time1) + "毫秒");
Long time3 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
sum += list.get(i%10);
}
Long time4 = System.currentTimeMillis();
System.out.println("List求和所花费时间:" + (time4 - time