您的位置:首页 > 编程语言 > Java开发

Java中的数组

2015-08-24 08:35 381 查看

Java中的数组
--模范青蛙

数组可以理解为同一种类型数据的集合,说的简单一些,他就是一个只能存放同一类型东西的容器。一维数组是多个相同数据类型的集合,二维数组是多个相同数据类型的一维数组的集合。因此操作数组的时候可以把数组中的每个元素当成普通变量进行操作。
使用数组的一个好处是:可以自动给数组中的元素从0开始编号,方便操作这些元素。
往往有利也有弊,使用数组做查询,更改信息操作是比较快的,但是做插入,删除操作可就太麻烦了,你需要在插入或删除数组元素的位置之后,移动所有的剩下的元素
Java语言是典型的静态语言,所以Java数组也是静态的,在使用Java数组之前必须先对数组对象进行初始化,当所有的数组元素都被分配了合适的内存空间,并指定了初始值,数组的初始化才算完成,数组一旦初始化完成后,程序将不能改变数组对象在内存中的位置和大小。
数组的初始化分为静态初始化和动态初始化两种:
1>静态初始化也有两种初始化的方式
第一种如:int[] a={1,2,3};
第二种如:int[] a=new int[]{1,2,3};
直接向数组中添加元素,让系统决定数组的长度
个人比较倾向于第一种方式。
前不久还有个童鞋拿了个二维数组来问我,代码如下:
int[][] a=new int[][]{{1,2},{1,2,3}};其实这种初始化二维数组的方法也是正确的,只是很少见,属于纯屌丝的做法
2>动态初始化:程序猿指定数组的长度,系统为数组赋初始值。
如:int a=new int[2];
那么这个数组就只能存放两个元素,并且系统为他们默认赋初始值0。
注意了,我这里定义的是int类型的数组,系统才会为他们赋默认值0,如果是其他类型的数组呢?
每种类型的数据都有他们的默认初始值
byte,short,int,long默认初始值都为0
字符类型char默认初始值为'\u0000'
boolean类型的是false;
引用类型(类,接口,数组)都是null
java的数组变量是一种引用类型的变量,并不是数组本身,他只是指向堆内存中的数组对象,因此可以改变一个数组变量所引用的数组,来造成数组长度可变的假象。

数组是一定要初始化后才可以使用的
int[] a=new int[]{1,2,3};
int[] b;
b=a;
System.out.print(b.length);
看到这个程序的输出结果,可能有的童鞋会问,数组b并没有初始化,怎么可以使用呢?
在这里我只想说,学习数组的时候千万不能把数组变量和数组对象搞混了。数组变量只是一个引用,而数组对象是保存在堆内存中的连续内存空间。对数组的初始化指的是在堆内存中创建对象也就是为该数组对象分配一块连续的内存空间。int[] b;虽然没有初始化,但是经过b=a;后,把数组a在堆内存中的地址赋给了b,b的引用就指向了a在堆内存中的数组对象,也就是说此时的a和b共用堆内存中的同一个对象。
所有的局部变量都是放在栈内存中保存的,不管他是基本类型的变量还是引用类型的变量,都是存储在各自的方法栈内存中的;而引用类型的变量所引用的对象则是存储在堆内存中的。
说到这里可能有的童鞋会有疑问?
什么是栈内存?什么是堆内存?他们到底是做什么的?
想详细了解这个问题请下载收看我的另一个资源《免费的》
http://download.csdn.net/detail/mo_fan_qing_wa/8990107
在Java中,堆内存中的对象是不允许被直接访问的,为了访问堆内存中的对象,通常只能通过引用变量。说到这儿可能有的童鞋会问:同一个变量,我们怎么才能知道他什么时候指的是栈内存中变量的本身?什么时候指的是堆内存中的对象呢?
其实这个也很容易分辨,引用变量本质上就是一个地址指针,只要我们的程序通过这个引用变量访问属性或者方法了,这个引用变量就会被他所引用的对象代替。
可能有人会问:Java中不是没有指针吗?
个人认为,Java官方声称没有指针,其实它底层的好多功能都是通过指针来实现的,拿最简单的一个类来说吧,迭代器(Iterator)中的next()方法是怎么实现的,这里就是用的指针。Java只是把用指针的地方封装成了方法,需要时我们拿来用就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: