数组

  • Post author:
  • Post category:其他


基本类型的变量只能存放单个值,而程序经常需要处理若干具有相同类型的数据,如100个学生的某门课成绩。

尽管可以声明用100个变量来分别存放这100个学生的某门课的成绩,但显然这样的方式过于繁琐,此时采用数组将极大的方便编程。

数组是由若干具有相同类型的元素构成的有序集,实际上它是一种用于存放固定个数的数据的容器。

数组中的元素可以是基本类型,也可以是对象类型,但同一数组中的所有元素必须具有相同的类型——如int数组和字符串数组分别表示数组中所有元素是int类型和字符串类型。

数组中元素的总个数称为数组的长度,每个元素在数组中所处的位置称为该元素的下标,通过下标来定位数组中的某个元素。

若能以一个下标定位到数组中的元素,此时的数组称为一维数组。



声明一维数组

数组是一种特殊的变量,因此也需要先声明,一维数组的声明有两种等价的格式为:


类型 [] 数组名; //如int[] a,声明了基本类型的数组a

类型 数组名[]; //如string names[],声明了对象类型的数组names

说明:

  • 此处的方括号不代表可选项,而是数组特有的语法,数组名左侧的类型并非指数组的类型,而是指数组中元素的类型,因此,前一种声明方式更能体现数组的实质。
  • 不管数组中的元素是何种类型,数组本身是一种对象类型。
  • 声明数组时不能在方括号中指定数组的长度,而是在创建数组时指定。



创建一维数组

仅仅声明数组,数组元素并未被分配内存单元,因此,声明数组后要进行创建的操作——为数组元素分配内存单元,否则不能访问该数组,创建一维数组的语法格式为:


数组名 =new 类型[长度];//如a = new int[5]

说明:

  • 关键字new右侧的类型必须与声明时指定的类型一致,对于对象类型要兼容。

  • 长度不能省略,其可以是任何值为int型的表达式,但不能为负数,若长度是byte,short或char型,则自动提升为int型。

  • 可以在声明的同时创建数组,也可以先声明,再单独创建,如:


    int [] a = new int [5]; //声明的同时创建数组

    float [] b; //先声明

    b = new float [10]; //单独创建

  • 创建数组后,各元素的值均为默认值(对象类型为null)

从内存角度看,数组名实际上代表着数组对象的引用,被分配在栈中,而数组元素则被分配在堆中。

与其它编程语言一样,java中的数组也占据着一段连续的内存单元,因此数组具有随机存取的特性。

随机存取是顺序存储结构所具有的特性,结构中任一元素的存放位置是计算出来的——结构的起始地址加上元素相对于该起始地址的偏移量,无论要访问的元素的偏移量是多少,cpu执行一条加法指令所耗费的时间都是一样的,因此找到数组中每个元素所耗费的时间也是一样的。


类型[] 数组名 ={初值1,初值2,…};

  • 多个初值彼此以逗号隔开,初值的个数决定了数组的长度,花括号中可以没有任何初值此时数组长度为0.
  • 系统先根据初值个数建出数组,然后将各初值按顺序赋给各元素。
  • 若初值的个数比较多,且具有一定规律,则通常采用循环结构在运行时为各元素赋值。
  • 各初值的类型要与声明的类型一致,若不一致,则系统会试图将初值类型自动转换为声明的类型,若不能转换,则视为语法错误。



访问以为数组

1.

取得数组长度

java中的任何数组都有一个标识数组长度的属性——length,可通过“数组名.lenght”的形式动态取得数组的长度。

2.

访问数组元素



数组名[下标]

  • 下标可以是任何值为int 型的表达式。
  • 尽管下标也位于方括号中,但其与创建数组时方括号中长度的意义完全不同——前者用于访问数组的元素,后者用于创建数组。
  • 因java从语法层面取消了指针,故不支持所占的内存地址来访问数组的元素。
  • 下标从0开始,第i个元素的下标是i-1,即下标为自然计数之间相差1



增强型for循环


for(类型 e :数组名){


循环体

}

  • 会依次取数组中的各个元素并赋值到变量e。
  • 元素e的类型要与声明数组时的类型兼容。
  • 增强型for循环屏蔽了数组元素的下标,若要在循环体中取得下标,可以在循环外部声明一个初值为0的int型变量,并在循环体结构前将该变量自增1.
  • 在可能的情况下,应优先使用增强型而非常规的for循环。



版权声明:本文为weixin_45517802原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。