数组1
1.数组的概念
数组的概念:在内存中开辟一块
连续
的空间,存储数据类型相同
的数据,长度是固定
的
2. 数组的创建
先声明、再分配空间:
数据类型[] 数组名;
数组名 = new 数据类型[长度];
声明并分配空间:
数据类型[] 数组名 = new 数据类型[长度];
声明并赋值(繁):
数据类型[] 数组名 = new 数据类型[]{value1,value2,value3,…};
声明并赋值(简):
数据类型[] 数组名 = {value1,value2,value3,…};
package com.qfedu.test1;
/**
* 数组的概念:在内存中开辟一块连续的空间,存储数据类型相同的数据,长度是固定的
* 数组的4种定义方式
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
// 方式1 先声明 再开辟空间
int [] arr1;
arr1 = new int[6];
// 方式2 连声明 带开辟空间
byte [] arr2 = new byte[10];
short arr3 [] = new short[5];
// 方式3 声明并且赋值 繁琐
// 这种方式 不能在中括号中书写长度 因为具体长度根据数据的个数来决定
double [] arr4 = new double[] {11.5,22.2,33.6,20,60,55};
// 方式4 声明并且赋值 简单
String [] arr5 = {"a","b","hello","中国","666"};
}
}
3. 数组的访问
数组中的每个数据格被称为“数组元素”。
对每个元素进行赋值或取值的操作被称为“元素的访问”。
访问元素时,需要使用“下标”(从0开始,依次+1)。
访问的语法:数组名[下标]; //例如 存:a[0]=10; 取:a[0]
4. 数组的下标
下标:数组中的下标从0开始,往后依次+1
package com.qfedu.test2;
/**
* 数组的访问
* 下标:数组中的下标从0开始,往后依次+1
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
int [] arr1 = new int[5];
// 赋值
arr1[0] = 11;
arr1[1] = 22;
arr1[2] = 23;
arr1[3] = 43;
arr1[4] = 56;
// arr1[5] = 77; 访问超出范围的下标 报错 ArrayIndexOutOfBoundsException:数值
// arr1[10] = 222;
// 取值
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[3]);
System.out.println(arr1[4]);
// System.out.println(arr1[6]); 数组下标越界异常
}
}
5. 数组的遍历
遍历:逐一对数组中的元素进行访问
package com.qfedu.test2;
/**
* 数组的遍历1
* 遍历:逐一对数组中的元素进行访问
* @author WHD
*
*/
public class Test2 {
public static void main(String[] args) {
int [] nums = new int[4];
nums[0] = 11;
nums[1] = 22;
nums[2] = 33;
nums[3] = 44;
for(int i = 0;i < 4;i++) {
System.out.println(nums[i]);
}
}
}
使用循环对数组中的元素赋值 并且取值
package com.qfedu.test2;
import java.util.Scanner;
/**
* 数组的遍历2
* 使用循环对数组中的元素赋值 并且取值
* @author WHD
*
*/
public class Test3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] nums = new int[5];
for(int i = 0;i < 5;i++) {
System.out.println("请输入第"+ (i + 1) +"个元素的值 ");
int num = input.nextInt();
nums[i] = num;
}
System.out.println("------------------赋值完毕------------------");
System.out.println("取值");
for (int i = 0; i < 5; i++) {
System.out.println(nums[i]);
}
}
}
6. length属性
length属性表示数组的长度,是一个int类型的数值,使用数组名.length使用
package com.qfedu.test2;
/**
* 数组的遍历 和 length属性
* length属性表示数组的长度,是一个int类型的数值,使用数组名.length使用
* @author WHD
*
*/
public class Test4 {
public static void main(String[] args) {
int [] nums = {1,2,3,4,5,6,56,456,12,4545,47,12,4545,212,12,454,21,5242,12,124,4545,212,12,454,21,5242,12,124,4545,212,12,454,21,5242,12,124};
System.out.println("nums数组的长度为:" + nums.length);
for(int i = 0;i < nums.length;i++) {
System.out.print(nums[i] + "\t");
}
System.out.println();
}
}
7. 数组的默认值
数组的默认值
整数:0
小数:0.0
布尔:false
字符:\u0000
其他:null
package com.qfedu.test3;
/**
* 数组的默认值
* 整数:0
* 小数:0.0
* 布尔:false
* 字符:\u0000
* 其他:null
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
byte [] arr1 = new byte[3];
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + "\t");
}
System.out.println();
short [] arr2 = new short[4];
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + "\t");
}
System.out.println();
int [] arr3 = new int[5];
for (int i = 0; i < arr3.length; i++) {
System.out.print(arr3[i] + "\t");
}
System.out.println();
long [] arr4 = new long[6];
for (int i = 0; i < arr4.length; i++) {
System.out.print(arr4[i] + "\t");
}
System.out.println();
System.out.println("----------------------------------");
float [] arr5 = new float[2];
for (int i = 0; i < arr5.length; i++) {
System.out.print(arr5[i] + "\t");
}
System.out.println();
double [] arr6 = new double[10];
for (int i = 0; i < arr6.length; i++) {
System.out.print(arr6[i] + "\t");
}
System.out.println();
System.out.println("----------------------------------");
boolean [] arr7 = new boolean[3];
for (int i = 0; i < arr7.length; i++) {
System.out.print(arr7[i] + "\t");
}
System.out.println();
System.out.println("----------------------------------");
char [] arr8 = new char[5];
for (int i = 0; i < arr8.length; i++) {
System.out.print(arr8[i] + "---" + "\t" );
}
System.out.println();
System.out.println("----------------------------------");
String [] arr9 = new String[3];
for (int i = 0; i < arr9.length; i++) {
System.out.print(arr9[i] + "\t");
}
System.out.println();
}
}
8. 数组的扩容
思路:创建一个更大的数组,将原数组中元素依次存放到新数组中,然后将新数组的地址赋值给原来的数组,实现扩容
package com.qfedu.test4;
/**
* 数组的扩容
* 思路:创建一个更大的数组,将原数组中元素依次存放到新数组中
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
// 原数组
int [] oldArr = {11,22,33,44,55};
// 新数组
int [] newArr = new int[oldArr.length * 2];
// 将原数组中的元素依次复制到新数组中
for(int i = 0;i < oldArr.length;i++) {
newArr[i] = oldArr[i];
}
// 遍历新数组
for(int i = 0;i < newArr.length;i++) {
System.out.print(newArr[i] + "\t");
}
System.out.println();
// 将两个数组的地址进行打印
System.out.println(oldArr);// 15db9742
System.out.println(newArr);// 6d06d69c
// 将新数组的地址赋值给原数组
oldArr = newArr;
System.out.println("赋值地址以后,两个数组地址相同");
System.out.println(oldArr);
System.out.println(newArr);
System.out.println("遍历原来的老数组");
for (int i = 0; i < oldArr.length; i++) {
System.out.print(oldArr[i] + "\t");
}
System.out.println();
}
}
9. 值传递和引用传递的区别
基本数据类型传参,传递的是值本身(值的拷贝、值的副本),在方法中对参数的改变,不会影响原来的实参
引用数据类型传参,传递的是地址,在方法中对参数的改变,会影响原来的实参
String类型属于特殊的引用数据类型,作为参数传递不会改变原来的值
package com.qfedu.test5;
/**
* 面试题:值传递和引用传递的区别?
* 基本数据类型传参,传递的是值本身(值的拷贝、值的副本),在方法中对参数的改变,不会影响原来的实参
* 引用数据类型传参,传递的是地址,在方法中对参数的改变,会影响原来的实参
* String类型属于特殊的引用数据类型,作为参数传递不会改变原来的值
* @author WHD
*
*/
public class Test1 {
public static void m1(int a) {
a+= 10;
System.out.println("m1方法中a的取值 为:" + a);
}
public static void m2(int [] nums2) {
System.out.println("m2方法中nums2的地址是:" + nums2);
for (int i = 0; i < nums2.length; i++) {
System.out.print(nums2[i] + "\t");
}
System.out.println();
for(int i = 0;i < nums2.length;i++) {
nums2[i]++;
}
}
public static void main(String[] args) {
int b = 10;
m1(b);
System.out.println("main方法中b的取值为:" + b);
System.out.println("-------------------------------------");
int [] nums1 = {1,2,3,4,5};
System.out.println("main方法nums1的地址是:" + nums1);
m2(nums1);
for (int i = 0; i < nums1.length; i++) {
System.out.print(nums1[i] + "\t");
}
System.out.println();
}
}
10. 课堂练习
统计int类型数组中所有元素的总和。
统计int类型数组中所有元素的平均值。
求一个数组中的最大值,或者最小值。
package com.qfedu.test6;
import java.util.Scanner;
/**
* 统计int类型数组中所有元素的总和。统计int类型数组中所有元素的平均值。
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数组的长度");
int length = input.nextInt();
int [] nums = new int[length];
int sum = 0;
for (int i = 0; i < nums.length; i++) {
System.out.println("请输入第"+ (i + 1) +"个元素的值");
nums[i] = input.nextInt();
sum += nums[i];
}
System.out.println("总和是:" + sum + "平均值为:" + sum / nums.length);
}
}
package com.qfedu.test6;
/**
* 求一个数组中的最大值,或者最小值。
* @author WHD
*
*/
public class Test2 {
public static void main(String[] args) {
int [] nums = {45,78,5689,6564,87,45456,22};
int min = nums[0]; // 假设一个最大值
for(int i = 1;i < nums.length;i++) {
if(min > nums[i]) {
min = nums[i];
}
}
System.out.println("最小值为:" + min);
}
}
数组2
1. 复制数组的方式
循环将原数组中所有元素逐一赋值给新数组。
System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);
java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。
package com.qfedu.test1;
/**
* 复制数组方式1:使用for循环将原数组中所有元素逐一赋值给新数组。
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
int [] oldArray = {1,2,3,4,5};
int [] newArray = new int[8];
for(int i = 0;i < oldArray.length;i++) {
newArray[i] = oldArray[i];
}
for (int i = 0; i < newArray.length; i++) {
System.out.print(newArray[i] + "\t");
}
System.out.println();
}
}
package com.qfedu.test1;
/**
* 复制数组方式2:System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);
* @author WHD
*
*/
public class Test2 {
public static void main(String[] args) {
int [] oldArray = {1,2,3,4,5,6,7,8};
int [] newArray = new int[oldArray.length * 2];
System.arraycopy(oldArray, 3, newArray, 2, 2);
for (int i = 0; i < newArray.length; i++) {
System.out.print(newArray[i] + "\t");
}
System.out.println();
}
}
package com.qfedu.test1;
import java.util.Arrays;
/**
* 复制数组方式3:java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。
* @author WHD
*
*/
public class Test3 {
public static void main(String[] args) {
int [] oldArray = {1,2,3,4,5};
int [] newArray = Arrays.copyOf(oldArray, 10);
for (int i = 0; i < newArray.length; i++) {
System.out.print(newArray[i] + "\t");
}
}
}
2. 数组类型的参数
数组类型的参数,与之前参数使用方式一致
需求:在main方法中提示用户输入5门成绩,使用数组保存,编写方法将成绩打印
package com.qfedu.test2;
import java.util.Scanner;
/**
* 数组类型的参数,与之前参数使用方式一致
* 需求:在main方法中提示用户输入5门成绩,使用数组保存,编写方法将成绩打印
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] scores = new int[5];
for (int i = 0; i < scores.length; i++) {
System.out.println("请输入第"+ (i + 1) +"门成绩");
scores[i] = input.nextInt();
}
printScore(scores);
}
public static void printScore(int [] scores) {
for (int i = 0; i < scores.length; i++) {
System.out.println("第"+ (i + 1) +"门成绩为:" + scores[i]);
}
}
}
3. 数组类型的返回值
数组类型的返回值,与之前返回值使用方式一致
需求:编写方法提示用户输入5门成绩,使用数组保存并且返回
Arrays.toString(数组名):表示将数组中的元素转换为字符串的格式 前后都加上中括号
package com.qfedu.test2;
import java.util.Arrays;
import java.util.Scanner;
/**
* 数组类型的返回值,与之前返回值使用方式一致
* 需求:编写方法提示用户输入5门成绩,使用数组保存并且返回
*
* Arrays.toString(数组名):表示将数组中的元素转换为字符串的格式 前后都加上中括号
* @author WHD
*
*/
public class Test2 {
public static double[] inputScore() {
Scanner input = new Scanner(System.in);
double [] scores = new double[5];
for (int i = 0; i < scores.length; i++) {
System.out.println("请输入第"+ (i + 1) +"门成绩");
scores[i] = input.nextDouble();
}
return scores;
}
public static void main(String[] args) {
double scores[] = inputScore();
System.out.println(Arrays.toString(scores));
}
}
4.可变长参数
概念:可接收多个同类型实参,个数不限,使用方式与数组相同。
语法:数据类型… 形参名
要求:必须定义在形参列表的最后,且只能有一个。
可变长参数:表示调用者可以传入0个或者多个同类型的参数
package com.qfedu.test2;
/**
* 概念:可接收多个同类型实参,个数不限,使用方式与数组相同。
* 语法:数据类型... 形参名
* 要求:必须定义在形参列表的最后,且只能有一个。
*
* 可变长参数:表示调用者可以传入0个或者多个同类型的参数
* @author WHD
*
*/
public class Test3 {
public static void printNum(int a,int... nums) {
for(int i = 0;i < nums.length;i++) {
System.out.print(nums[i] + "\t");
}
System.out.println();
}
public static void main(String[] args) {
printNum(1,2,3,4,5,6);
}
}
5. 冒泡排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mEE2eslz-1653892599682)(.\img\冒泡排序.gif)]
冒泡排序:相邻的两个数值比较大小,互换位置。
规律:
1.比较的轮数,永远是长度-1 6个数比较5轮 7个数比较6轮,外层循环控制比较的轮数
2.每一轮比较的次数,最多的一次是长度-1 ,后续每次递减1,内层循环控制每一轮比较的次数
外层循环 n- 1
内层循环 n -1 -i
package com.qfedu.test3;
import java.util.Arrays;
/**
* 冒泡排序:相邻的两个数值比较大小,互换位置。
*
* 规律:
* 1.比较的轮数,永远是长度-1 6个数比较5轮 7个数比较6轮,外层循环控制比较的轮数
* 2.每一轮比较的次数,最多的一次是长度-1 ,后续每次递减1,内层循环控制每一轮比较的次数
*
* 外层循环 n- 1
* 内层循环 n -1 -i
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
// int a = 10;
// int b = 20;
// int temp = a;
// a = b;
// b = temp;
//
// System.out.println(a);
// System.out.println(b);
int [] nums = {110,23,556,98845,774,520,321,41,5};
for(int i = 0;i < nums.length -1;i++) {
for(int j = 0 ;j < nums.length -1 - i ;j++) {
if(nums[j] < nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
System.out.println("第"+(i + 1)+"轮比较以后的顺序:" + Arrays.toString(nums));
}
System.out.println(Arrays.toString(nums));
}
}
6. 选择排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvyLOcqh-1653892599684)(.\img\选择排序.gif)]
选择排序:固定位置的元素依次与其他元素比较,比较一轮以后,交换一次位置
回顾我们刚才学过的冒泡排序,发现元素的位置需要频繁的移动,效率比较第,而选择排序
是每一轮最多交换一次位置,从而提高效率
举例:赵四 188 大拿 175 刘能 150
分析:
外层循环属于比较的数A,从第一个元素到倒数第二个元素,属于比较的数A
内层循环属于比较的数B,从第二个元素到末尾,属于比较的数B
在整个比较过程中,需要交换比较的数,所以我们定义index 与i相同 后续比较过程中 改变index的值
package com.qfedu.test4;
import java.util.Arrays;
/**
* 选择排序:固定位置的元素依次与其他元素比较,比较一轮以后,交换一次位置
*
* 回顾我们刚才学过的冒泡排序,发现元素的位置需要频繁的移动,效率比较第,而选择排序
* 是每一轮最多交换一次位置,从而提高效率
* 举例:赵四 188 大拿 175 刘能 150
*
* 分析:
* 外层循环属于比较的数A,从第一个元素到倒数第二个元素,属于比较的数A
* 内层循环属于比较的数B,从第二个元素到末尾,属于比较的数B
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
int [] nums = {-1,110,23,556,98845,774,520,321,41,5};
for(int i = 0;i < nums.length-1;i++) {
int index = i;
for(int j = i + 1;j < nums.length;j++) {
if(nums[index] > nums[j]) {
index = j;
}
}
// 这里应该交换元素了 因为一轮比较完毕
if(i != index) {
int temp =nums[i];
nums[i] = nums[index];
nums[index] = temp;
}
System.out.println("第"+(i + 1)+"轮比较完以后的顺序:" + Arrays.toString(nums));
}
System.out.println(Arrays.toString(nums));
}
}
7. JDK排序
JDK排序:java.util.Arrays.sort(数组名); //JDK提供(升序)
package com.qfedu.test5;
import java.util.Arrays;
/**
* JDK排序:java.util.Arrays.sort(数组名); //JDK提供(升序)
* @author WHD
*
*/
public class Test1 {
public static void main(String[] args) {
int [] nums = {-1,110,23,556,98845,774,520,321,41,5};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
for(int i = nums.length -1;i >= 0;i--) {
System.out.print(nums[i] + "\t");
}
}
}
8. 二维数组
二维数组:数组中的元素还是数组
创建二维数组,高维度必须指定,低维度可以单独分开指定
二维数组赋值和遍历
package com.qfedu.test5;
/**
* 二维数组赋值和遍历
* @author WHD
*
*/
public class Test3 {
public static void main(String[] args) {
int [][] nums = new int[3][3];
nums[0][0] = 11;
nums[0][1] = 13;
nums[0][2] = 14;
nums[1][0] = 15;
nums[1][1] = 16;
nums[1][2] = 17;
nums[2][0] = 33;
nums[2][1] = 44;
nums[2][2] = 55;
for(int i = 0;i < nums.length;i++) {
for(int j = 0;j < nums[i].length;j++) {
System.out.println(nums[i][j]);
}
System.out.println();
}
}
}
先声明、再分配空间:
数据类型[][] 数组名;
数组名 = new 数据类型[高维长度][低维长度];
声明并分配空间:
数据类型[][] 数组名 = new 数据类型[高维长度][低维长度];
声明并赋值(繁):
数据类型[][] 数组名 = new 数据类型[高维长度][]; //不规则数组,自行new低维数组
声明并赋值(简):
数据类型[] 数组名 = { {v1,v2,v3},{v4,v5},{v6,v7,v8,v9} }; //显示初始化