上次我们简单的把 Java数组 中:数组的声明、以及赋值方式、给数组分配空间、以及数组的两种初始化方式,说啦一下这次我会把我接触到的数组知识全部写全,以供大家参看。
老样子学习之前推荐相关学习资料:【仅供大家参考】
数组学习教程推荐:
1、查询数组元素
查询数组可以查询指定索引的元素的内容,直接按照索引定位即可;
可以按照指定内容元素的索引,需要逐个比较,直到找到为止,或者比较到数组的末尾也没有找到。
代码实现:
public class TestArray3{
public static void main(String [] args){
//使用数组存储10个学生的分数
int [] scoreArr = {75,87,56,45,89,100,76,34,89,97};
//获取第8个学生的分数 1 8
int position = 2;
int score = scoreArr[position-1];
System.out.println("第"+position+"个学生的分数是:"+score);
//获取分数的76的学生的索引(第一个)
int index = -1;
int elem = 101;
for(int i=0;i
结论1:
数组按照索引查询数据,效率最高;不管索引是哪个,花费的时间是一样的;
原理:分配连续的空间,且每个元素的空间大小是相同的,所以指定索引的元素位置=数组的起始位置+每个元素的大小*索引,无需进行逐个比较。
结论2:
数组按照内容查询数据效率低下;
一般需要从第一个元素逐次比较,直到找到位置;或者比较到数组的最后一个元素也没有找到,则确认无该元素。
如果数组的数据是大小有序的,可以通过折半查找的方式来提高查询效率。
2、删除元素
如何删除指定索引的元素;
代码实现:
public class TestArray4{
public static void main(String [] args){
//1.使用数组存储分数
int [] scoreArr = {75,87,56,45,89,100,76,34,89,97};
//2.删除之前输出
System.out.println("删除前");
for(int score :scoreArr){
System.out.print(score+"\t");
}
//3.删除索引为4的元素
int index = 4;
//3.1从第i个元素开始,将后一个元素前移一个位置
for(int i = index; i
结论1:数组的优点:
1) 一个数组可以存储多个元素
2) 按照索引查询元素效率高
结论2:数组的缺点:
1) 按照内容查询元素,效率低下
2) 进行删除和添加时候需要大量的移动元素,效率低下;
3) 长度固定
可以提取删除数组元素的方法,直接调用该方法即可实现删除。注意:这可是第一次使用数组做方法的形参。
public class TestArray5{
public static void main(String [] args){
//使用数组存储分数
int [] scoreArr = {75,87,56,45,89,100,76,34,89,97};
//删除之前输出
System.out.println("删除前");
for(int score :scoreArr){
System.out.print(score+"\t");
}
//3.删除索引为4的元素
int index = 4;
deleteElem(scoreArr,index);
//删除之后输出
System.out.println("\n删除后");
for(int score :scoreArr){
System.out.print(score+"\t");
}
}
public static void deleteElem(int [] arr,int index){
//3.1从第index个元素开始,将后一个元素前移一个位置
for(int i = index; i
使用数组作为方法的形参,这还是第一次。内存分配图如图所示:
3、添加数组元素
需要实现:在数组的索引为i的位置添加一个新的值value。
实现思路和删除类似,需要大量的移动元素。需要从末尾开始,将后面元素都后移一个位置,空出第i个位置来,再放入要添加的元素值value。
代码实现:
public class TestArray6 {
public static void main(String [] args){
//使用数组存储分数
int [] scoreArr = {75,87,56,45,89,100,76,34,0,0};
//添加之前输出
System.out.println("添加前");
for(int score :scoreArr){
System.out.print(score+"\t");
}
//3.在索引为4的位置添加90
int index = 4;
int value = 90;
insertElem(scoreArr,index,value);
//添加之后输出
System.out.println("\n添加后");
for(int score :scoreArr){
System.out.print(score+"\t");
}
}
public static void insertElem(int [] arr,int index,int value){
//从最后一个元素开始,将前一个元素后移一个位置
for(int i = arr.length-1; i>index;i--){
arr[i]=arr[i-1];
}
//第index的元素赋值为value
arr[index] = value;
}
}
1、Arrays工具类
JDK提供的 java.util.Arrays 工具类,包含了常用的数组操作,方便我们日常开发。Arrays类包含了:排序、查找、填充、打印内容等常见的操作。
示例代码:
public class TestArray7 {
public static void main(String[] args) {
//定义一个数组
int[] scoreArr = {75, 87, 56, 45, 89, 100, 76, 34, 89, 97};
//遍历数组
System.out.println(Arrays.toString(scoreArr));
//数组排序
Arrays.sort(scoreArr);
System.out.println(Arrays.toString(scoreArr));
//查询数据
int index = Arrays.binarySearch(scoreArr, 89);
System.out.println(index);
//数组的填充
// Arrays.fill(scoreArr,10);
Arrays.fill(scoreArr, 3, 8, 10);
System.out.println(Arrays.toString(scoreArr));
//数组复制
/*
int [] scoreArr2 = new int[10];
for(int i=0;i
需要三个注意的地方:
注意1:Arrays.binarySearch(arr,elem );是二分查找,要求数组必须有序。
注意2:在JDK8增加parallelSort()方法,为并发排序方法,适合数据量大的情况。
注意3:JDK8后增加了和函数式接口、lamda表达式,流式编程有关方法,暂时无法讲解。
2、数组拷贝
Arrays.copyOf() 的底层使用了 System 类的 arraycopy( ) 方法。可以进行数组的整体拷贝;
代码实现:
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
public static native void arraycopy(Object src, //源数组
int srcPos, //源数组要复制的起始位置
Object dest,//目的数组
int destPos,//目的数组要复制到的起始位置
int length); //要复制的数组元素的数量
public class TestArray8 {
public static void main(String args[]) {
String[] arr1 = {"阿里", "腾讯", "百度", "京东", "华为"};
System.out.println(Arrays.toString(arr1));
String[] arr2 = new String[10];
System.out.println(Arrays.toString(arr2));
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
//等价于如下语句,但是 System.arraycopy()效率更高
//for (int i = 0; i < arr1.length; i++) { arr2[i] = arr1[i]; }
System.out.println(Arrays.toString(arr2));
Arrays.fill(arr2, null);
System.arraycopy(arr1, 2, arr2, 4, 2);
System.out.println(Arrays.toString(arr2));
}
}
之前的删除操作可以使用 System.arrayCopy() 优化一下,提供效率。但是添加操作无法使用该方法优化,因为添加元素需要从后想起移动元素。
//删除操作
System.arraycopy(scoreArr,index+1,scoreArr,index,scoreArr.length-1-index);
scoreArr[scoreArr.length-1] = 0;
再来说一下:Arrays.copyOf()和System.arrayCopy()的区别
3、可变参数
JDK1.5 提供了定义方法时使用可变参数的功能,语法为格式为:参数类型...参数,允许实参可以是0个、1个、n个,甚至数组的形式。可以进步的减少方法重载的数量。
代码实现:
public class TestArray9{
public static void main(String [] args){
System.out.println(add());
System.out.println(add(10));
System.out.println(add(10,20));
System.out.println(add(10,20,30));
System.out.println(add(10,20,30,40,50));
int [] numArr ={10,20,30,40,50};
System.out.println(add(numArr));
}
public static int add(int ... numArr){
int sum = 0;
for(int num :numArr){
sum += num;
}
return sum;
}
}
总结1:可变参数关键点
总结2:可变参数和数组参数的区别和联系
联系
区别
1.个数不同: 一个方法的可变参数只能有一个;一个方法的数组参数可以有多个
2.位置不同: 一个方法的可变参数只能是最后一个;一个方法的数组参数位置任意
3.实参不同: 数组参数实参须是数组;可变参数实参可以是0个、1个、多个,一个数组
1、定长二维数组
举例要实现的功能:存储3个班级分别4个学生的分数
思路1:定义一个数组,长度是12,存储12个分数
int [] scoreArr = new int[12];
不合理:一个班级12个学生
思路2:定义3个数组,长度都是4,分别存一个班的分数
int [] scoreArr = new int[4]
int [] scoreArr2 = new int[4]
int [] scoreArr3 = new int[4]
不合理:数组太多了
思路3:目标:数组少,能够区分3个班级
定义一个二维数组,一个数组就可以存储3个班分别四个学生的信息
代码实现:
public class TestArray10 {
public static void main(String[] args) {
//定义一个二维数组
int[][] scoreArr = new int[3][4];//
//存储3个班级分别4个学生的分数
scoreArr[0][0] = 90;
scoreArr[0][1] = 100;
scoreArr[0][2] = 90;
scoreArr[0][3] = 100;
scoreArr[1][0] = 89;
scoreArr[1][1] = 89;
scoreArr[2][2] = 100;
//输出分数
System.out.println(scoreArr.length);
System.out.println(scoreArr[0].length);
System.out.println(scoreArr[0][0]);//90
System.out.println(scoreArr[1][0]);//89
System.out.println(scoreArr[2][0]);//0
System.out.println(scoreArr[2][1]);//100
//遍历数组的所有元素
for (int i = 0; i < scoreArr.length; i++) {
System.out.println("第" + (i + 1) + "个班的学生分数");
for (int j = 0; j < scoreArr[i].length; j++) {
System.out.print(scoreArr[i][j] + "\t");
}
System.out.println();
}
}
}
图解:
2、不定长二维数组
举例功能:存储3个班级,每个班最多4个学生的分数.
实现代码:
public class TestArray11{
public static void main(String [] args){
//定义一个二维数组
int [][] scoreArr = new int[3][];
scoreArr[0] = new int[4];
scoreArr[1] = new int[3];
scoreArr[2] = new int[2];
//存储3个班级分别4个学生的分数
scoreArr[0][0] = 90;
scoreArr[0][1] = 100;
scoreArr[0][2] = 90;
scoreArr[0][3] = 100;
scoreArr[1][0] = 89;
scoreArr[1][1] = 89;
scoreArr[2][1] = 100;
//输出分数
System.out.println(scoreArr.length);//3
System.out.println(scoreArr[0].length);//4
System.out.println(scoreArr[1].length);//3
System.out.println(scoreArr[2].length);//2
//遍历数组的所有元素
for(int i=0;i
图解:
总结1:有一维数组,有二维数组,就有三维数组,四维数组.....
总结2:其实只要一维数组,没有二维数组,三维数组
总结3:二维数组的静态初始化
int [] [] scoreArr = new int[][]{{90,100,90,100},{89,89,0},{100,0}};
int [] [] scoreArr = {{90,100,90,100},{89,89,0},{100,0}};
总结4:实际开发中多维数组用的非常少,一般最多使用二维数组.
以上就是 Java入门【数组篇】 全部内容,喜欢的同学记得点个赞支持一下哦~
上方知识点全部动手操作一篇你会收获很多的~~如需要资料推荐的哪些课程资料,可以订阅主页的公众号
感谢阅读~