数组
- 数组:用来存储多个相同数据类型的集合(容器)。
数组中元素的数据类型必须相同
数组是引用数据类型,对应一个地址 - 定义方法
静态定义:
数据类型 [ ] 数组名 = {数组值};
数据类型 [ ] 数组名 = new 数据类型 [ ] {数组值};
其中[ ] 数组名可交换顺序
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu","tianqi"};
int ageArr [] = new int[]{1,2,3,33,44,55,123};//必须不能定义长度
动态定义:
数据类型 [ ] 数组名 = new 数据类型 [长度 ];
数组的长度是固定的,定义后不能改变
其中[ ] 数组名可交换顺序
int arr [] = new int[50];// 一定定义长度
arr[0] = 1 ;
arr[1] = 2 ;
定义完后的默认值
byte,short,int,long---->0
float,double---->0.0
char---->\0(对应ASCⅡ表中的空格)
boolean---->false
//验证定义完后默认值
int numArr1[] = new int[20];
System.out.println(numArr1[1]); //默认值为0
double numArr2[] = new double[30];
System.out.println(numArr2[1]); //默认值为0.0
char numArr3[] = new char[10];
System.out.println(numArr3[0]);//打印结果为一个空格,\0
String weightArr[] = new String[4];
System.out.println(weightArr[0]);//null
- 元素在内存空间是连续的,每位元素都有对应的编号,从0开始
访问数组中的某个元素是通过下标访问的: 数组名[下标]
一下有多种方式打印数组内容:
int ageArr [] = new int[]{1,2,3,33,44,55,123};
System.out.println(ageArr[2]);//打印数组中某一元素
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu","tianqi"};
for (int i = 0; i < nameArr.length; i++) {
System.out.println(nameArr[i]);
}//通过for循环打印数组元素,可以决定打印的元素个数
int ageArr [] = new int[]{1,2,3,33,44,55,123};
for(int i : ageArr){
System.out.println(i);
}//增强for循环,foreach,循环次数由集合的元素个数决定
int [] nameArr = {6,4,2,3,12,15,16};
Arrays.sort(nameArr);//排序打印
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu"};
System.out.println(Arrays.toString(nameArr) );//直接打印
- 删除
思路:已知删除C---->将D、E向左移一位得到[A B D E E]---->将最后一位赋值为‘=0’(char为字符型)
//删除C
char [] arr = {'A','B','C','D','E'};
for(int i=3;i<arr.length;i++){
arr[i-1] = arr[i];
}
arr[arr.length-1]= '\0';
System.out.println(Arrays.toString(arr));//[A, B, D, E, ]
- 新增
//新增:在lisi后面新增一个数据{"zhangsan","lisi","wangwu","zhaoliu"}
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu",null};
for(int i=nameArr.length-1;i>2;i--){
nameArr[i] = nameArr[i-1];
}
nameArr[2] = "tianqi";
for (String name : nameArr) {
System.out.println(name);
}
- 扩容
// 方法一:使用循环
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu"};
String [] newArr = new String [8];
for(int i=0;i<nameArr.length;i++){
newArr[i] = nameArr[i];
}
System.out.println(Arrays.toString(newArr));
//[zhangsan, lisi, wangwu, zhaoliu, null, null, null, null]
//方法二:使用System.arraycopy(nameArr,0, newArr, 0, nameArr.length)方法;被复制的数组,从哪个位置复制,要粘贴的数组,从哪个位置开始粘贴,复制的长度
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu"};
String [] newArr = new String [8];
System.arraycopy(nameArr,0, newArr, 0, nameArr.length);
nameArr = newArr ;//直接覆盖
for (String name : nameArr) {
System.out.println(name);
}
- 复制
String [] nameArr = {"zhangsan","lisi","wangwu","zhaoliu"};
String [] newArr = Arrays.copyOf(nameArr, nameArr.length);
System.out.println(Arrays.toString(nameArr) );
int [] nameArr = {6,4,2,3,12,15,16};
int [] newArr = Arrays.copyOfRange(nameArr, 1, 3);//[1,3)
System.out.println(Arrays.toString(newArr) );
- 冒泡排序
public static void main(String[] args) {
int [] nameArr = {6,4,2,3,12,15,16,10};
for (int j = 0; j < nameArr.length-1 ; j++) {
boolean flag = true ;
for(int i=0;i<nameArr.length-1-j ; i++){
if(nameArr[i+1]<nameArr[i]){
flag = false ;
int temp = nameArr[i];
nameArr[i] = nameArr[i+1];
nameArr[i+1] = temp;
}
}
if(flag){
break ;
}
}
System.out.println(Arrays.binarySearch(nameArr, 16));
//7
System.out.println(Arrays.toString(nameArr));
//[2, 3, 4, 6, 10, 12, 15, 16]
- 二维数组
定义方法:
数据类型 [][] 数组名 = {{数组值},{数组值},{数组值},{数组值}};
数据类型 [] 数组名 [] = new 数据类型 [][]{{数组值},{数组值},{数组值},{数组值}} ;
数据类型 [] 数组名 [] = new 数据类型 [][];
int [][] age = {{1,2,3},{4},{5,6},{7,8,9}};
int [] age1 [] = new int [][] {{1,2,3},{4},{5,6},{7,8,9}};
int age [][] = new int[4][] ;//1维的长度是必须给出的
age[0] = new int[]{1,2,3};
age[1] = new int[]{4,5,6};
age[2] = new int[]{7,8,9};
age[3] = new int[]{10,11,12};
System.out.println(age[1][2]);//6
//遍历
for (int i = 0; i < age.length; i++) {
for (int j = 0; j < age[i].length; j++) {
System.out.println(age[i][j]);
}
}