一、数组的概念
1、概念:数组是一组**连续的存储空间,存储多个相同类型**的值。
二、数组的创建
2.1基本语法: 数据类型 [ ] 数组名 = new 数据类型 [长度]; 如: int [ ] a =new int [5];
2.2数组的创建语法:
a.先声明、再分配空间:
数据类型[ ] 数组名;
数组名 = new 数据类型[长度];
b.声明并分配空间:
数据类型[ ] 数组名 = new 数据类型[长度];
c.声明并赋值(繁):
数据类型[ ] 数组名 = new 数据类型[ ]{value1,value2,value3,.……};
d.声明并赋值(简):
数据类型[] 数组名 = {value1,value2,value3,.……}; //显示初始化,注意:不可换行
三、数组的组成
a. 数组中的“每个格子” 被称为 ”数组的元素“。
b.对元素的访问分别为:”赋值“ 与 ”取值“
c.访问元素:通过”下标“访问。(注:下标从0开始,依次+1,自动增加)
d.访问数组的语法:数组名[下标] 如: a[0]=10(存值) a[0] (取值)
e.数组范围:数组下标从0开始,数组总长度减1,如:int [ ] a =new int [5]; 数组长度为:0------->5-1(4),即0—4;如果不在 下标范围内,会产生数组下标越界异常。
public class TestArray {
public static void main(String[] args) {
// 1.使用声明并分配空间的方式创建数组
int[] nums = new int[5];
// 2访问元素(存值)
nums[0] = 10;
nums[1] = 20;
nums[2] = 30;
nums[3] = 40;
nums[4] = 50;
// 3.访问元素(取值) 数组名[下标
int a = nums[0];
System.out.println(a);
System.out.println(nums[1]);
System.out.println(nums[2]);
System.out.println(nums[3]);
System.out.println(nums[4]);
System.out.println(nums[5]);// 数组下标越界,出错
}
}
四、数组的遍历
1、概念:从头至尾,逐一对数组中的元素进行访问。 动态获取数组的长:数组名.length
注意:JDK1.5之后,Java提供了增强for循环简化数组或集合的遍历。
2、语法:
for(数组元素类型 n : 数组){ n代表数组中每个元素
}
缺点:不能使用下标
public class TestArray {
public static void main(String[] args) {
// 1.使用声明并分配空间的方式创建数组
int[] nums = new int[5];
// 2访问元素(存值)
nums[0] = 10;
nums[1] = 20;
nums[2] = 30;
nums[3] = 40;
nums[4] = 50;
// 使用增强for循环遍历数组
for (int n : nums) {
System.out.print(n + "\t");
}
System.out.println();// 每打印一个元素换行
}
}
五、数组内存
程序运行中有两块重要的存储空间
1、栈
a.存储基本类型数据以及引用类型的地址。
b.空间比较小 ,存储速度较快,JDK1.5之前是 256k, JDK1.5之后1M。
c.出栈顺序:先进先出。
2、堆
a.存储引用类型的实际数据。
b.空间比较大
注意:数组属于引用类型,实际存储再堆中,栈中存储堆中数据的引用(地址)。
六、数组的扩容
1、创建数组时,必须显示指定长度,并在创建之后不可更改长度。
2、 扩容思想
创建一个大于原数组长度的新数组。将原数组中的元素依次赋值给新数组。
int [ ] newNums=new int[nums.length*2];
3、数组的复制
a. System.arraycopy(原数组,原数组的起始位置,新数组,新数组的起始位置,长度);
b. 数组类型=java.util.Arrays.copyOf(原数组,新数组的长度); 根据长度创建新数组,并将原数组中的元素赋值给新数组。
public class TestArray1{
public static void main(String [] args){
//1创建一个源数组
int [] nums=new int[5];
//2访问元素 存值
nums[0]=11;
nums[1]=22;
nums[2]=33;
nums[3]=44;
nums[4]=55;
//3遍历元素
System.out.println("遍历源数组:");
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
//4创建一个新数组
int [] newNums=new int[nums.length*2];//创建一个大于原数组长度的新数组。将原数组中的元素依次赋值给新数组。
//5复制元素****
for(int i=0;i<nums.length;i++){
newNums[i]=nums[i];
}
//6遍历新数组
System.out.println("遍历新数组:");
for(int i=0;i<newNums.length;i++){
System.out.println(newNums[i]);
}
}
}
public class TestArray3{
public static void main(String [] args){
//1创建一个源数组
int [] nums=new int[5];
//2访问元素 存值
nums[0]=11;
nums[1]=22;
nums[2]=33;
nums[3]=44;
nums[4]=55;
//3遍历元素
System.out.println("遍历源数组:");
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
//4创建一个新数组
//int [] newNums=new int[nums.length*2];
//5复制元素****
//java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。
//int [] newNums=java.util.Arrays.copyOf(nums,nums.length*2);
int [] newNums=Arrays.copyOf(nums,nums.length*2);
//6遍历新数组
System.out.println("遍历新数组:");
for(int i=0;i<newNums.length;i++){
System.out.println(newNums[i]);
}
}
}
七、数组类型参数
1、A. 基本数据类型传参:值传递,一方改变不会影响另一方法。
2、 引用数据类型传参:值传递(地址值),一方改变影响另一方。
public class TestArray {
public static void main(String[] args) {
// 数据类型:基本数据类型 8、引用数据类型
/*
* 基本数据类型:作为方法参数
*/
/*
* 引用数据类型:数组
*/
int[] nums = { 10, 20, 30, 40, 50 };
printArray(nums);
System.out.println("main遍历数组:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
System.out.println();
}
public static void printArray(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] += 5;
}
System.out.println("printArray遍历数组:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + "\t");
}
System.out.println();
}
public static void print1(int a) {
a += 5;
System.out.println(a);
}
}
八、可变长参数
1、概念:可接收多个同类型实参,个数不限,使用方式与数组相同。
2、语法:数据类型… 形参名 //必须定义在形参列表的最后,且只能有一个。
public class TestArray1{
public static void main(String args[]){
//int [] nums={1,2,3,4,5};
//method(nums);
//method();
method(1, 2, 3, 4, 5);
}
//方法的参数作为可变长参数 数据类型... 参数名
public static void method(int a,int ... arr){
System.out.println("遍历数组"+a);
for (int i = 0; i < arr.length; i++)
System.out.print(arr[i]+"\t");
System.out.println();
}
}