数组
数组是在一块连续的内存空间中,一次性存储多个相同数据类型的变量。
数组在内存空间必定是连续的!
数组的基本使用流程:
①声明
数据类型[] 变量名; int[] a; int []a; int a[];
②分配空间
变量名/数组名 = new 数据类型[数组长度]; a = new int[4];
③数组的声明方式有多种:
a.声明的同时并分配空间[常用]
int[] a = new int[长度];
b.声明并赋值:
int[] a = new int[]{10,20,30};
注意:分配空间时,[]中 不能定义数组长度
c.声明并赋值[简单、常用]:
int[] a = {10,20,30};
注意:int[] a;
a = {10,20,30}; //错误的 error
④每一个数据格对应的数据称之为元素
⑤每一个元素对应的都有其下标,下标范围:0~长度-1
⑥元素访问:通过下标取操作元素,称之为元素访问
为元素赋值:数组名[下标] = 数值;
取值:数据类型 变量名 = 数组名[下标];
System.out.println(数组名[下标]);
⑦数组遍历[重点]:从头到尾,访问每一个元素
数组长度:数组名.length
for(int i=0;i<数组名.length;i++){
//通过数组名[i] 访问元素
}
注意:a.当访问无效的下标对应的元素时,会导致下标越界,会运行报错
下标越界异常:java.lang.ArrayIndexOutOfBoundsException;
b.数组的元素,具有默认值
整数、浮点型 :0、0.0
字符型:'\u0000'
布尔类型:false
对象数据类型:null
数组的默认值:
变量类型 |
整形变量 |
浮点数 |
字符(char) |
Boolean |
对象类型 |
默认值 |
0 |
0.0 |
\u0000 |
False |
null |
数组的内存存储:
①数组的内存空间是连续的
②数组类型的变量存储的是数组的首地址
③数组元素的首地址:
首地址+下标*数据类型字节数
④数组下标从0开始,为了提高寻址效率
⑤数组类型的变量之间传递的是数组的首地址
特点:寻址效率高,查询快
数组的扩容
①新建一个数组,长度大于原数组
通过循环,一一将原数组的元素赋值给新数组
②java.util.Arrays.copyOf(原数组,新数组长度); //返回值为赋值后的新数组
③System.arraycopy(原数组,起始下标,新数组,存储元素的起始下标,长度);
将元素中的从起始下标开始对应的元素,
一一赋值给新数组中存储的起始下标开始。
数组作为参数和返回值
①数组作为参数:实参赋值给形参 赋的是首地址
②数组作为返回值:
返回值类型定义为:数据类型[]
需要将新数组的地址返回
可变长参数
①概念:参数个数不限(0-n),数组形式的参数
②语法:数据类型...参数名(定义在形参列表处)
注意:可变长参数只能放在形参列表的最后
定义一个数组int [] a ={1,2,3,4,5};然后遍历出每个元素的值 。
For(int i=0;i<5;i++){ System.out.println(a[i]); }
写一个函数,计算一个整数数组的总和 。
class asum{ public static void main(String[] args) { int a[]=new int[3]; int sum=0; for (int i=0;i<3;i++ ) { a[i]=i; sum=sum+a[i]; System.out.println("a["+i+"]="+a[i]+"\tsum="+sum); } } }
自定义一个整数数组 a,读入一个整数 n,如果 n 在数组中存在,则输出 n 的下标;如果不存在,输出-1 。
import java.util.Scanner; class xiabiao{ //自定义一个整数数组 a,读入一个整数 n,如果 n 在数组中存在,则输出 n 的下标;如果不存在,输出-1 public static void main(String[] args) { int a[]={10,11,12,13,15,16,17,18,19,5,6,3,2,1,9}; Scanner sc = new Scanner(System.in); System.out.println("请输入一个数n:"); int n=sc.nextInt(); for (int i=0;i<a.length;i++ ) { if (a[i]==n) { System.out.println("该数下标为:"+i); return; } } System.out.println(-1); } }