数组

数组是指一组数据的集合,数组中的每个数据称为元素。在Java中,数组也是Java对象。数组中的元素可以是任意类型(包括基本类型和引用类),但同一个数组里只能存放类型相同的元素。创建数组大致包括如下步骤:

. 声明一个数组类型的引用变量,简称为数组变量;
. 用new语句构造数组的实例。new语句为数组分配内存,并且为数组中的每个元素赋予默认值;
. 初始化,即为数组的每个元素设置合适的初始值。

第四章主要围绕以下内容展开;

. 数组的创建,包括基本类型数组的创建和类类型数组的创建;
. 访问数组的元素和长度属性;
. 创建一个数组的数组(多维数组);

一. 数组变量的声明;

声明数组:
1) 一个存放同一类型数据的集合
   a. 即可以是基本类型,也可以是对象类型;
   b. 数组中的每个数据为元素;
2) 数组是一个对象,成员是数组长度和数组中的元素;
3) 申明了一个数组变量并不是创建了一个对象;
4) 申明数组的方式;

   int[] IArray 或者 int IArray[] 	基本数据类型数组,数组中存放的是基本数据类型。
   Teacher[] tArray 或者 Teacher tArray[]	类数组,数组中存放的是Teacher类创建的若干个的对象。

注意:1) 声明数组变量的时侯,不能指定数组的长度,以下声明方式是非法的。

         int x[1];
         int[2] x;

二. 初始化

初始化:自变量创建后首次赋值的过程;
静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度,如:
//只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为4
String[] computers = {"Dell", "Lenovo", "Apple", "Acer"};  //①
//只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为3
String[] names = new String[]{"多啦A梦", "大雄", "静香"};  //② 
动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值,如:
//只是指定了数组的长度,并没有显示的为数组指定初始值,但是系统会默认给数组数组元素分配初始值为null
String[] cars = new String[4];
1. 创建数组对象;

   数组对象和其他Java对象一样,也用new语句创建;

   int[] iArray = new int[2];

   new语句执行以下步骤:

   a. 在堆区中为数组分配内存空间,以上代码创建了一个包含2个元素的int数组;每个元素都是int类型,占4个字节,因此
      整个数组对象在内存中占用8个字节。
   b. 为数组中的每个元素赋予其数据类型的默认值。
      byte/short/int/long 	0
      float			0.0f
      double                0.0d
      String                null
      char               空或者’\u0000'
      boolean               false
   c. 返回数组对象的引用
   
   在用new语句创建数组对象时,需要指定数组长度。数组长度表示数组中包含的元素数目。数组长度可以用具体的数值表示,也可以用
   变量表示。如:

   int[] x = new int[10];
   或
   int size=10;
   int[] x = new int[size];

   数组的长度可以为0,此时数组中一个元素也没有。例如:

   int[] x = new int[0];

   对于Java类的程序入口方法main(String args[]),如果运行时这个类没有输入参数,那么main()方法的参数args并不是null, 而是一个
   长度为0的数组。例如:

   public class Sample {
       public static void main(String[] args) {
            System.out.println(args.length);           //打印0
       }
   }

   数组对象创建后,它的长度是固定的。数组对象的长度是无法改变的,但是数组变量可以改变所引用的数组对象。

   int[] x = new int[3];
   int[] y = x;
   x = new int[4];
ArrayIndexOutOfBoundsException 是运行时异常(编译时不报错)
数组越界:表示使用的数组下标超过了数组的最大下标,数组的
	最大下标是数组长度-1 (length-1),这个错
	出现在运行阶段,编译阶段不报错.不是checkexception
2. 初始化数组对象;       

   数组中的每个元素都有一个索引,或者称为下标。数组中的第一个元素的索引为0,第二个元素的索引为1, 依次类推。
   通过索引可以访问数组中的元素或者给数组中元素内容赋值。

   1) 声明、创建、初始化分开: 

      int[] iArray;
      iArray = new int[2];
      iArray[0] = 0;
      iArray[1] = 1; 

   2) 声明、创建的同时并初始化数组;

      int[] iArray = {0, 1};
      Student sArray[] = new Student[] { new Student(“George”, “Male”, 20), new Student()};
  合法:Student[] stArray = { new Student(), new Student()} ;
  这种模式不能进行拆分  e.g
  不合法:Student[] stArray;
    stArray = {new Student(),new Student()} 不能分成两部分     
      注意:a. 非法的数组初始化方式:
               int[] x = new int[5]{5,4,3,2,1};           //编译出错,不能在[]中指定数组的长度;
               
               int[] x;
               x = {5,4,3,2,1};                           //{5,4,3,2,1}必须在声明数组变量的语句中使用,不能单独使用

3. 多维数组;

   Java支持多维数组。假定某个宾馆有三层楼,第一层有4个房间,第二层有3个房间,第三层有5个房间。某一天客户人住宿情况如
   下图所示:

   第三层:           |    |Tom |Jerry|    |Rose|
   第二层:          |Mary|    |Kevin|
   第一层:          |Mike|Jane|Duke |    |

   可以用两维数组来存储各个房间的客人信息。

   String[][] room = new String[3][];
   room[0] = new Stirng[]{"Mike","Jane","Duke",null};
   room[1] = new String[]{"Mary",null,"kevin"};
   room[2] = new String[]{null,"Tom","Jerry",null,"Rose"}

   以上代码等价于:

   String[][] room = {{"Mike","Jane","Duke",null},
                      {"Mary",null,"kevin"},
                      {null,"Tom","Jerry",null,"Rose"}};

   通过以上代码引出两维数组,多维数组本质上是数组的数组,数组的元素内容还是数组;
几乎所有的程序设计语言都支持数组。Java也不例外。当我们需要多个类型相同的变量的时候,就考虑定义一个数组。在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。

对于多维数组,假设有这么一段代码:

1 int[][] nums = new int[2][2];
2 nums[0][1] = 2;

多位数组在构建时,一定时先构建第一个一维数组,在构建这个一维数组中每一个元素所指向的
另一个一维数组.不能再没有构建第一个一维数组的前提下,直接构建这个数组中每一个
元素所指向的另一个一维素组.
e.g
int[][] i = new int[3][];合法
int[][] i = new int[][3];不合法

二维数组需要注意:
如果只是确定了二维数组中的第一个一维数组,第二个一维数组没有
确定长度.此时不能直接使用二维数组一个一个赋值.只能在第一个一维
数组中来制定另一个一维数组值
e.g
String[][] str = new String[3][];
str[0][0] = “hello”;报错 空指针
str[0] = new String[]{“hello”};正确
-----------------
String[][] str = new String[3][3];
str[0][0] = “hello” 正确
4. 数组的边界:
1) 一个数组的下标从0开始,数组通过数组的对象引用变量的下标访问数组。

      数组中第一个元素的索引为0, 第二元素的索引为1,依次类推。如果一个数组长度是5,要访问最后一个数组元素可以通过
      下标4来访问,如果通过下标5访问,超出了数组的边界,在运行时会抛出ArrayIndexOutOfBoundsException。

   2) 通过调用数组的length方法可以获得一个数组的元素个数(数组长度)。
   
      所有Java数组都有一个length属性,表示数组的长度. 该属性只能读取,但是不能修改。

      讲解书上的例子。 

      以下修改数组的length属性,这是非法的。

      int[] x = new int[4];
      x.length = 10;            //编译出错,length属性不能被修改。

   注:a. 数组变量必须在引用一个数组对象之后,才能访问其元素。

          public class Sample {
               private int[] x;

               public static void main(String[] args) {
                      Sample s = new Sample();
                      System.out.println(s.x);            //打印null
                      System.out.println(s.x[0]);         //运行时抛出NullPointerException
                      System.out.println(s.x.length);      //运行时抛出NullPointerException
               }
          }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值