前言:数组 是所有编程语言中都会涉及的基础数据类型,但往往在实际开发的时候数组的直接使用还是比较少的,使用的比较多的就是数组的遍历思想,更简单的说对数组对象的for / while 循环。
数组也和类对象都是引用数据类型,这里引用数据类型的根本就是:同一块堆,被不同的栈所指向。
A: 什么叫数组?
这个问题看似简单,但是能把数组的基本含义讲清楚的人并不多。
来自百度的解释:所谓数组,是无序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。
我的理解是:数组就是具有相同数据类型的数据的有序集合。
相同的数据类型、有序(数组索引)、集合
B:数组的创建
数组的创建方法
1》简单的方法: 数据类型 数组名称 [] = new 数据类型 [数组长度]; 或者 数据类型 [] 数组名称 = new 数据类型 [数组长度];
然后再给数组中的变量赋值;数组名称 [数组索引号] = 被赋值的对象;
Demo:
说明:1、如果只是简单的声明数组而不赋值,那么这里的所有变量都是该变量类型的默认值;例如 int date[] = new int [2]; 那么 date中的 所有变量都是 int 的默认值 0;
由于数组是引用数据类型,所以随意给相应的对象赋值。2、数组的索引范围是 0 -----数组的长度 -1 ;
1 package top.ankermaker; 2 /* 3 * administrators :ankermaker 4 */ 5 public class Datatest01 { 6 7 public static void main(String[] args) { 8 int[] data = null; 9 data = new int [3]; 10 data[0] = 10; 11 data[1] = 20; 12 data[2] = 30; 13 //数组的遍历,需要获取 数组的长度,这里采用动态的方法去获取 数组的长度 14 for(int i = 0 ; i < data.length;i++) { 15 System.out.println(data[i]); 16 } 17 } 18 19 }
输出结果:10 20 30
数组的实例化过程如下截图:
大家从上面的实例化图就可以很容易明白数组的实例化过程和对象的实例化过程是相似的,也可以这样说所有的引用数据类型的创建都与此如出一辙。
下面 我们针对数组的引用单独用一个列子说明数值之间的引用使用:
我们还是先记住这句话:所有的引用数据类型对象的实例化映射在内存中都是:同一块堆被不同栈的引用;
代码如下:
1 package top.ankermaker; 2 /* 3 * administrators :ankermaker 4 */ 5 public class Datatest01 { 6 public static void main(String[] args) { 7 int[] data = null; 8 data = new int [3]; 9 data[0] = 10; 10 data[1] = 20; 11 data[2] = 30; 12 //测试数组对象之间的引用 13 int temp[] = null;//在下面我对此添加一个小说明; 14 temp = data; 15 temp[0] = 99; 16 //数组的遍历,需要获取 数组的长度,这里采用动态的方法去获取 数组的长度 17 for(int i = 0 ; i < temp.length;i++) { 18 System.out.println(temp[i]); 19 } 20 } 21 22 }
输出结果:99 20 30
首先对 int temp [] = null;这里的神明如果没有进行 数组之间的引用,那么就不能再程序中调用,一旦调用就会抛异常;【结尾对常见的数组异常简单的描述一下】
回到这个Demo代码 结合下面的图片我们可以简单的明白数组之间的引用是什么回事了 !
过程如下:
同一块堆,被不同的栈指向,数组的引用就是,两个数组名称变量指向同一个堆对象;
C:静态数组的初始化
静态数组初始化其实就是:在数组声明地址的时候就对数组中的变量进行了赋值操作;
创建方法:
1》简单方法:数组类型 数组名称 [] = {1,2,3};
2》完整方法(推荐这个方法):数组类型 数组名称 [] = new 数组类型 [] {1,2,3};
为什么推荐完整得方法,大家还记得匿名对象的有关知识吗?使用匿名数组的时候就必须要new 数组类型 [] {1,2,3};
所以减少不必要的区分问题,推荐使用 完整方法;
同样用一个 Demo 去认识:
1 //简单方法 2 int[] statedate = {1,3,4}; 3 4 for(int i = 0 ; i < statedate.length;i++) { 5 System.out.println(statedate[i]); 6 } 7 8 //完整方法 (匿名数组) 10 System.out.println(new int [] {1,2,3}.length); 11
总结一下:
数组最多缺点就是数组长度是固定的,如果在后面的开发中需要用到数组去解决问题,一般都是使用特殊的数据结构去实现一个动态大小的数组;(纯属自己学习之后的总结,大家可以在评论进行评论,互相学习才是目的!谢谢)!
拓展:在使用数组的时候常见的异常有:
- ArrayIndexOutOfBoundsException
用非法索引访问数数组时抛出的异常。是当数组索引值指定错误或起始位置给定错误,也可能是所访问数据的个数超出数组的大小范围时引发的异常。
例如:我们初始化了一个数组array[2],当我们访问array[3]时,就会抛出该异常。
- NullPointerException 就是没有实例化数组中的变量;例如:int data[] =null;
- ArrayStroeException
这是试图将错误类型的对象存储到一个对象数组时抛出的异常。
例如:Object x[ ] = new String[3]; x[0] = new Integer(0);就会抛出这个异常,而解决的方式就是正确存储数组。