数组
基本使用
概念
概念:一组
连续
的存储空间,存储多个相同
数据类型的值,长度是固定
的。
定义
方式1:先声明、再分配空间
数据类型[] 数组名;
数组名 = new 数据类型[长度];
方式2:声明并分配空间:
数据类型[] 数组名 = new 数据类型[长度];
方式3:声明并赋值(繁):
数据类型[] 数组名 = new 数据类型[]{value1,value2,value3,...};
方式4:声明并赋值(简):
数据类型[] 数组名 = {value1,value2,value3,...};
package com.yuluo;
public class ArrayTrain {
public static void main(String[] args) {
String [] userNameArr = new String[3];
int [] ageArr = new int[3];
// 赋值
ageArr[0] = 18;
userNameArr[0] = "Hanser";
// 取值
System.out.println("年龄为:"+ageArr[0]);
System.out.println("姓名为:"+userNameArr[0]);
}
}
使用
数组的元素:数组中的每个数据称之为数组中的元素
数组的访问:对数组中的元素赋值以及取值的操作 统称为数组的访问
下标、索引、角标、index : 下标自动生成 从0开始 往后依次+1
访问数组通过下标访问:
赋值 数组名[下标] = 值;
取值 System.out.println(数组名[下标]);
访问不存在的下标 将会导致数组下标越界异常 ArrayIndexOutOfBoundsException
package com.yuluo;
public class ArrayTrain {
public static void main(String[] args) {
String [] userNameArr = new String[3];
int [] ageArr = new int[3];
// 赋值
ageArr[0] = 18;
userNameArr[0] = "Hanser";
// 取值
System.out.println("年龄为:"+ageArr[0]);
System.out.println("姓名为:"+userNameArr[0]);
}
}
遍历
数组的遍历:逐一对数组中的元素进行访问 称之为数组的遍历
package com.yuluo;
public class ArrayTrain {
public static void main(String[] args) {
// 定义一个数组
int[] age;
age = new int[3];
// 数组的遍历
for (int i = 0; i < age.length; i++) {
// 赋值
age[i] = i;
}
// 数组遍历
for (int i = 0; i < age.length; i++) {
System.out.println(age[i]);
}
}
}
默认值
数组的默认值:数组作为引用数据类型 其元素是有默认值的 当我们给数组开辟空间以后 默认值即存在
整数:0
浮点:0.0
字符:\u0000
布尔:false
其他:null (空)
package com.yuluo;
import java.util.Arrays;
public class ArrayTrain {
public static void main(String[] args) {
// 定义一个数组
int[] age = new int[3];
byte[] sex = new byte[2];
float [] salary = new float[3];
boolean [] leader = new boolean[2];
String [] name = new String[2];
char [] marriage= new char[2];
// 把数组转为String
String ageStr = Arrays.toString(age);
String sexStr = Arrays.toString(sex);
String leaderStr = Arrays.toString(leader);
String nameStr = Arrays.toString(name);
String salaryStr = Arrays.toString(salary);
String marriageStr = Arrays.toString(marriage);
// 打印String
System.out.println(ageStr); // [0, 0, 0]
System.out.println(sexStr); // [0, 0]
System.out.println(salaryStr); // [0.0, 0.0, 0.0]
System.out.println(marriageStr); // /u0000
System.out.println(leaderStr); // [false, false]
System.out.println(nameStr); // [null, null]
}
}
使用一个为null的对象,调用任何属性或者方法,都将出现空指针异常
扩容
背景:创建数组时,必须显式指定长度,并在创建之后不可更改长度。
数组的扩容
实现步骤:
1.创建比原数组更长的新数组
2.将原数组中的元素依次复制到新数组中
3.将新数组的地址赋值给原数组
注意:
数组作为引用数据类型 其数组名中保存的是指向堆中的地址
所以 当我们把一个数组 赋值 给 另外一个数组时
赋值的是堆地址
默认打印数组本身得到的是一个内存中的堆地址
package com.yuluo;
import java.util.Arrays;
public class ArrayTrain {
public static void main(String[] args) {
// 数组扩容
int [] oldArr = {15,16,17,18};
// 创建比之前大的新数组
int [] newArr = new int [oldArr.length * 2];
// 复制新数组
for (int i = 0; i < oldArr.length; i++) {
newArr[i] = oldArr[i];
}
// 地址替换
oldArr = newArr;
// 设置新数组
newArr[7] = 28;
System.out.println(oldArr);// [I@4554617c
System.out.println(newArr); // [I@4554617c
System.out.println(Arrays.toString(newArr)); // [15, 16, 17, 18, 0, 0, 0, 28]
}
}
复制
复制数组的三种方式:
循环将原数组中所有元素逐一赋值给新数组。
System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度)
; 无返回值
java.util.Arrays.copyOf(原数组, 新长度)
; 有返回值,返回带有原值的新数组。
package com.yuluo;
import java.util.Arrays;
public class copyArray {
public static void main(String[] args) {
int [] oldArr = {12,13,14,15};
int [] newArr = new int[10];
int [] ageArr = {13,13,13};
// 1. 使用 System.arraycopy 方法
// 参数为 旧数组 下标 新数组 下标 长度
// 无返回值
System.arraycopy(oldArr,1,newArr,2,2);
System.out.println("新数组为 " + Arrays.toString(newArr));
// 2. 使用 Arrays.copyOf 方法
// 有返回值
int [] newAgeArr = Arrays.copyOf(ageArr,10);
System.out.println("新数组1为 " + Arrays.toString(newAgeArr));
}
}
数组方法
JDK提供了一个用于操作数组的工具类 java.util.Arrays
,此类中提供大量的用于操作数组的各种方法
类的方法 类似JS中类本身的方法
Arrays.toString(数组名) : 将数组中的元素转换为字符串 返回
Arrays.copyOf(数组名,新长度) : 复制数组,存在返回值
Arrays.sort(数组名) : 将数组按照升序排序 属于快速排序 实现原理为 递归
Arrays.fill(数组名,填充元素) : 将数组按照指定元素进行填充
Arrays.binarySearch(数组名,元素) : 使用二分查找法查找某个元素在数组中的下标(前提是数组是升序排序后的,且元素不重复),返回值为下标
案例
package com.yuluo;
import java.util.Arrays;
public class utilsArray {
public static void main(String[] args) {
int [] nums = {56,12,22,41,85,99};
// 使用 sort方法排序:快速排序 默认是升序
Arrays.sort(nums);
System.out.println(Arrays.toString(nums)); // [12, 22, 41, 56, 85, 99]
int [] newArr = new int[nums.length];
// 降序排序
for (int i = 0,j = nums.length -1; i < nums.length; i++,j--) {
newArr[i] = nums[j];
}
System.out.println(Arrays.toString(newArr)); // [99, 85, 56, 41, 22, 12]
// 填充元素
Arrays.fill(newArr,445);
System.out.println(Arrays.toString(newArr)); // [445, 445, 445, 445, 445, 445]
// 查找元素
int index = Arrays.binarySearch(nums, 41);
System.out.println("查找到的下标为"+index); // 查找到的下标为 2
}
}