数组
1. 数组的概念
数组:一块
连续
的内存空间,存储类型相同
的数据,长度是固定
的
2. 数组的定义方式
先声明、再分配空间:
数据类型[] 数组名;
数组名 = new 数据类型[长度];声明并分配空间:
数据类型[] 数组名 = new 数据类型[长度];声明并赋值(繁):
数据类型[] 数组名 = new 数据类型[]{value1,value2,value3,…};声明并赋值(简):
数据类型[] 数组名 = {value1,value2,value3,…};
package com.atguigu.test1;
/**
* 1.先声明 再开辟空间
* 2.连声明 带开辟空间
* 3.声明并且赋值(繁琐)
* 4.声明并且赋值(简单)
* */
public class Test1 {
public static void main(String[] args) {
// 方式1 先声明 再开辟空间
int [] arr1;
arr1 = new int[3];
// 方式2 连声明带开辟空间
int arr2[] = new int[5];
// 方式3 声明并且赋值(繁琐)
int [] arr3 = new int[]{1, 3, 5, 6, 99, 88};
// 方式4 声明并且赋值(简单)
int [] arr4 = {56, 89, 12, 34, 45};
}
}
3. 数组的访问
数组的访问:数组的访问包括 赋值 以及 取值
数组的元素:数组中的每个数据,称之为元素
数组的下标:下标(角标,索引)属于自动生成,不需要人为设置,从0开始,往后依次加1
举例:长度为5的数组,下标范围是 0 ~ 4
访问数组的中的元素是通过下标来访问
访问方式:
赋值 数组名[下标] = 值;
取值 System.out.println(数组名[下标]);
注意:不能访问超过下标范围的内容 否则将报数组下标越界异常 ArrayIndexOutOfBoundsException
异常会中断正在执行的程序 未执行的代码将不再执行
package com.atguigu.test2;
/**
* 数组的访问:数组的访问包括 赋值 以及 取值
* 数组的元素:数组的每个数据,称之为元素
* 数组的下标:下标(角标,索引)属于自动生成,不需要人为设置,从0开始,往后依次加1
* 举例:长度为5的数组,下标范围是 0 ~ 4
*
* 访问数组的元素是通过下标来访问
* 访问方式:
* 赋值 数组名[下标] = 值;
* 取值 System.out.println(数组名[下标]);
*
* 注意:不能访问超出下标范围的内容,否则将报数组下标越界异常 ArrayIndexOutOfBoundsException
* 异常会中断正在执行的程序 未执行的代码将不再执行
*
* */
public class Test1 {
public static void main(String[] args) {
int [] arr1 = new int[5];
// 赋值/存值
arr1[0] = 56;
arr1[1] = 78;
arr1[2] = 234;
arr1[3] = 345;
arr1[4] = 12387;
// arr1[5] = 123; // 报错 ArrayIndexOutOfBoundsException
// 取值
System.out.println("arr1数组第1个元素值为:" + arr1[0]); // arr1数组第1个元素值为:56
System.out.println("arr1数组第2个元素值为:" + arr1[1]); // arr1数组第2个元素值为:78
System.out.println("arr1数组第3个元素值为:" + arr1[2]); // arr1数组第3个元素值为:234
System.out.println("arr1数组第4个元素值为:" + arr1[3]); // arr1数组第4个元素值为:345
System.out.println("arr1数组第5个元素值为:" + arr1[4]); // arr1数组第5个元素值为:12387
}
}
4.数组的遍历
数组的遍历:逐一对数组中的元素进行访问 这个过程称之为遍历
package com.atguigu.test3;
import java.util.Scanner;
/**
* 数组的遍历:逐一对数组中的元素进行访问 这个过程称之为遍历
* */
public class Test1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] arr1 = new int[5];
for (int i = 0; i < 5;i++){
System.out.print("请输入第" + (i + 1) + "个元素的值:");
arr1[i] = input.nextInt();
}
System.out.println("---------------赋值完毕---------------");
for (int i = 0; i < 5; i++){
System.out.println("第" + (i + 1) + "个元素的值为:" + arr1[i]);
}
System.out.println("---------------取值完毕---------------");
}
}
5. 数组的length属性
遍历数组,推荐使用数组的length属性,length属性表示数组的长度(元素的个数),是一个int类型的整数数值
使用方式:数组名.length
package com.atguigu.test3;
/**
* 遍历数组:推荐使用数组的length属性,length属性表示数组的长度(元素的个数),是一个int类型的整数数值
* 使用方式:数组名.length
* */
public class Test2 {
public static void main(String[] args) {
int [] nums = {45, 55, 66, 77};
System.out.println("当前nums数组的长度为:" + nums.length);
for (int i = 0; i < nums.length; i++){
System.out.print(nums[i] + "\t");
}
System.out.println();
}
}
6.数组的默认值
数组元素的默认值:当我们给数组开辟空间,数组中即存在对应长度个数的默认值
整数:0
浮点:0.0
布尔:false
字符:\u0000
其他:null
package com.atguigu.test3;
/**
* 数组元素的默认值:当我们给数组开辟空间,数组中即存在对应长度个数的默认值
* 整数:0
* 浮点数:0.0
* 布尔:false
* 字符:\u0000
* 其他:null
* */
public class Test3 {
public static void main(String[] args) {
byte [] nums1 = new byte[3];
for (int i = 0; i < nums1.length; i++){
System.out.print(nums1[i] + "\t"); // 0 0 0
}
System.out.println();
System.out.println("--------------------------------------");
short [] nums2 = new short[5];
for (int i = 0; i < nums2.length; i++){
System.out.print(nums2[i] + "\t"); // 0 0 0 0 0
}
System.out.println();
System.out.println("--------------------------------------");
int [] nums3 = new int[6];
for (int i = 0; i < nums3.length;i++){
System.out.print(nums3[i] + "\t"); // 0 0 0 0 0 0
}
System.out.println();
System.out.println("--------------------------------------");
long [] nums4 = new long[10];
for (int i = 0; i < nums4.length; i++){
System.out.print(nums4[i] + "\t"); // 0 0 0 0 0 0 0 0 0 0
}
System.out.println();
System.out.println("--------------------------------------");
float [] nums5 = new float[4];
for (int i = 0; i < nums5.length; i++){
System.out.print(nums5[i] + "\t"); // 0.0 0.0 0.0 0.0
}
System.out.println();
System.out.println("--------------------------------------");
double [] nums6 = new double[8];
for (int i = 0; i < nums6.length; i++){
System.out.print(nums6[i] + "\t"); // 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
}
System.out.println();
System.out.println("--------------------------------------");
boolean [] bls = new boolean[4];
for (int i = 0; i < bls.length; i++){
System.out.print(bls[i] + "\t"); // false false false false
}
System.out.println();
System.out.println("--------------------------------------");
char [] chs = new char[6];
for (int i = 0; i < chs.length; i++){
System.out.print(chs[i] + "-\t"); // - - - - - -
}
System.out.println();
System.out.println("--------------------------------------");
String [] strings = new String[7];
for (int i = 0; i < strings.length; i++){
System.out.print(strings[i] + "\t"); // null null null null null null null
}
System.out.println();
System.out.println("--------------------------------------");
}
}
7.数组的扩容
1.创建大于原数组长度的新数组
2.将原数组中的元素依次复制到新数组中
3.将原数组的引用指向新的数组 完成扩容
数组作为引用数据类型 其数组名(引用)中存储的是指向堆中的地址
所以 直接将一个数组赋值给另外一个数组 赋值的是内存中的地址
package com.atguigu.test4;
/**
* 数组的扩容:
* 1.创建大于原数组长度的新数组
* 2.将原数组的元素依次复制到新数组中
* 3.将原数组的引用指向新的数组 完成扩容
* */
public class Test1 {
public static void main(String[] args) {
int [] oldArr = {22, 33, 44, 55, 66};
// 1.创建大于原数组长度的新数组
int [] newArr = new int[oldArr.length * 2];
// 2.将原数组中的元素依次复制到新数组中
for (int i = 0;i < oldArr.length; i++){
newArr[i] = oldArr[i];
}
System.out.println("-------------------遍历新数组------------------");
for (int i = 0;i < newArr.length;i++){
System.out.print(newArr[i] + "\t"); // 22 33 44 55 66 0 0 0 0 0
}
System.out.println();
// 3.将原数组的引用指向新的数组 完成扩容
// 数组作为引用数据类型 其数组名(引用)中存储的是指向堆中的地址
// 所以 直接将一个数组赋值给另外一个数组 赋值的是内存中的地址
oldArr = newArr;
System.out.println(oldArr); // [I@1540e19d
System.out.println(newArr); // [I@1540e19d
}
}
package com.atguigu.test4;
public class Test2 {
public static void main(String[] args) {
int [] nums1 = {1, 2, 3, 4, 5};
int [] nums2 = new int[10];
System.out.println(nums1); // [I@1540e19d
System.out.println(nums2); // [I@677327b6
nums2 = nums1;
System.out.println("------------地址赋值完毕---------------");
System.out.println(nums1); // [I@1540e19d
System.out.println(nums2); // [I@1540e19d
System.out.println("------------遍历nums2数组---------------");
for (int i = 0;i < nums2.length;i++){
System.out.print(nums2[i] + "\t"); // 1 2 3 4 5
}
System.out.println();
System.out.println("------------nums2数组对元素进行改变-------------");
nums2[0] = 999;
System.out.println(nums1[0]); // 改变nums2[0],nums[1]也同步发生变化 999
}
}
8. 课堂练习
统计int类型数组中所有元素的总和、平均值。
package com.atguigu.test5;
/**
* 统计int类型数组中所有元素的总和、平均值
* */
public class Test1 {
public static void main(String[] args) {
int [] nums = {56, 66, 34, 54, 98, 23};
int sum = 0;
for (int i = 0; i < nums.length; i++){
sum += nums[i];
}
System.out.println("nums数组元素总和为:" + sum); // nums数组元素总和为:331
System.out.println("nums数组元素平均值为:" + sum / nums.length); // nums数组元素平均值为:55
}
}
求一个数组中的最大值,或者最小值。
分析:我们可以假设数组中的某个元素作为最大值/最小值 然后依次与其他的元素比较
如果遇到更到/更小的 就交换’头衔’ 最终来确定 最大/最小值
package com.atguigu.test5;
/**
* 求一个数组中的最大值,或者最小值
*
* 分析:我们可以假设数组中的某个元素作为最大值/最小值 然后依次与其他的元素比较
* 如果遇到更大/更小的 就进行交换 最终来确定 最大/最小值
* */
public class Test2 {
public static void main(String[] args) {
int [] nums = {23, 56, 34, 87, 45};
int max = nums[0]; // 假设第一个元素为最大值
int min = nums[0]; // 假设第一个元素为最小值
for (int i = 1; i < nums.length;i++){
if (nums[i] > max){
max = nums[i];
}
if (nums[i] < min){
min = nums[i];
}
}
System.out.println("nums数组中最大的元素为:" + max); // nums数组中最大的元素为:87
System.out.println("nums数组中最小的元素为:" + min); // nums数组中最小的元素为:23
}
}
需求:
1.编写方法用于统计一组人的成绩 并且返回
2.编写方法用于打印一组人的成绩 使用数组作为参数
package com.atguigu.test6;
import java.util.Scanner;
/**
* 数组类型的参数 数组类型的返回值
*
* 需求:
* 1.编写方法用于统计一组人的成绩 并且返回
* 2.编写方法用于打印一组人的成绩 使用数组作为参数
* */
public class Test1 {
public static double[] inputScore(){
Scanner input = new Scanner(System.in);
System.out.print("请输入有几个人:");
int count = input.nextInt();
double [] scores = new double[count];
for (int i = 0;i < scores.length;i++){
System.out.print("请输入第" + (i + 1) + "个人的成绩:");
scores[i] = input.nextDouble();
}
return scores;
}
public static void printScore(double[] scores){
for (int i = 0;i < scores.length;i++){
System.out.println("第" + (i + 1) + "个人的成绩为:" + scores[i]);
}
}
public static void main(String[] args) {
double [] scores = inputScore();
System.out.println();
printScore(scores);
}
}
9. 值传递和引用传递的区别?
面试题:Java中值传递和引用传递的区别?
Java官方明确指出:Java中只有值传递,引用传递传递的也是值,只不过这个值是一个地址
基本数据类型 属于值传递 传递的是值本身 在方法中对值的操作 不影响实参的取值
引用数据类型 属于引用传递 传递的是地址 在方法中根据地址所做的操作 影响指向这个地址的所有变量
String类型属于特殊的引用数据类型 作为参数 在方法中对参数的改变 不会影响原来的实参
package com.atguigu.test7;
/**
* 面试题:Java中值传递和引用传递的区别?
* Java官方明确提出:Java中只有值传递,引用传递的也是值,只不过这个值是一个地址
* 基本数据类型 属于值传递 传递的是值本身 在方法中对值的操作 不影响实参的取值
* 引用数据类型 属于引用传递 传递的是地址 在方法中根据地址所做的操作 影响指向这个地址的所有变量
* String类型属于特殊的引用数据类型 作为参数 在方法中对参数的改变 不会影响原来的实参
* */
public class Test1 {
public static void m1(int num){
num += 10;
System.out.println("m1方法中,num的值为:" + num); // m1方法中,num的值为:20
}
public static void main(String[] args) {
int a = 10;
m1(a);
System.out.println("main方法中,a的值为:" + a); // main方法中,a的值为:10
int [] arr = {1, 2, 3};
m2(arr);
for (int i = 0;i < arr.length;i++){
System.out.print(arr[i] + "\t"); // 2 3 4
}
}
public static void m2(int[] nums){
for (int i = 0; i < nums.length; i++){
nums[i]++;
}
}
}
10.可变长参数
可变长参数:可接收零个或者多个同类型的实参 个数不限 使用方式与数组相同
语法格式:数据类型 … 参数名称
要求:
1.整个形参列表中只能存在一个可变长参数
2.只能存在于形参列表的末尾
package com.atguigu.test8;
/**
* 可变长参数:可接受零个或者多个同类型的实参 个数不限 使用方式与数组相同
* 语法格式:数据类型 ... 参数名称
*
* 要求:
* 1.整个形参列表中只能存在一个可变长参数
* 2.只能存在于形参列表的末尾
* */
public class Test1 {
public static void m1(int[] a, int... nums){
for (int i = 0;i < nums.length;i++){
System.out.print(nums[i] + "\t"); // 1 2 3 4 5 6 7 m1方法执行完毕
}
System.out.println("m1方法执行完毕");
}
public static void main(String[] args){
int[] arr1 = {1, 2, 3, 4};
m1(arr1,1, 2, 3, 4, 5, 6, 7);
}
}
11.复制数组
循环将原数组中所有元素逐一赋值给新数组。
System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);
java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。
复制数组方式1:编写循环实现元素的复制
package com.atguigu.test9;
/**
* 复制数组方式1:编写循环实现元素的复制
* */
public class Test1 {
public static void main(String[] args) {
int[] oldArr = {1, 2, 3, 4, 5, 6, 7};
int[] newArr = new int[oldArr.length];
for (int i = 0;i < oldArr.length;i++){
newArr[i] = oldArr[i];
}
System.out.println("-----------元素复制完毕---------------");
for (int i = 0;i < newArr.length;i++){
System.out.print(newArr[i] + "\t");
}
}
}
制数组方式2:System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度);
长度必须小于等于剩余元素的个数 否则报下标越界异常
package com.atguigu.test9;
/**
* 复制数组方式2:System.arraycopy(原数组, 原数组起始, 新数组, 新数组起始, 长度);
*
* 长度必循小于等于剩余元素的个数 否则报下标越界异常
* */
public class Test2 {
public static void main(String[] args) {
int[] oldArr = {1, 2, 3, 4, 5};
int[] newArr = new int[10];
System.arraycopy(oldArr, 2, newArr, 6, 1); // 原数组, 原数组下标起始位, 新数组, 新数组下标起始位, 复制多少位
for (int i = 0; i < newArr.length;i++){
System.out.print(newArr[i] + "\t"); // 0 0 0 0 0 0 3 0 0 0
}
System.out.println();
}
}
复制数组方式3:java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组。
package com.atguigu.test9;
import java.util.Arrays;
/**
* 复制数组方式3:java.util.Arrays.copyOf(原数组, 新数组的长度); // 返回复制后的新数组
* */
public class Test3 {
public static void main(String[] args) {
int[] oldArr = {11, 22, 33, 44, 55};
int[] newArr = Arrays.copyOf(oldArr, 10);
for (int i = 0;i < newArr.length;i++){
System.out.print(newArr[i] + "\t");
}
System.out.println(); // 11 22 33 44 55 0 0 0 0 0
}
}
12.练习
package com.atguigu.test10;
import java.util.Scanner;
/**
* 数组练习
* */
public class Test1 {
public static void main(String[] args) {
// 1.下列数组的声明有哪些是对的?错的应该怎么修改?
// A. int[] a;
// B. int a[] = new int[3];
// c. int[] a;
// a = {1, 2, 3, 4, 5};
// D. int[] a = new int[3]{1, 2, 3};
getAvg();
isExist();
getMaxMin();
reverseOrder();
}
// 2.写一个函数,计算一个整数数组的平均值
public static void getAvg(){
int sum = 0;
int[] nums = {11, 22, 33, 44, 55};
for (int i = 0; i < nums.length; i++){
sum += nums[i];
}
System.out.println("平均值为:" + sum / nums.length); // 平均值为:33
}
// 3.自定义一个整数数组a, 读入一个整数n, 如果n在数组中存在, 则输出n的下标;如果不存在,输出-1。
public static void isExist(){
int[] a = {11, 22, 33, 44, 55};
Scanner input = new Scanner(System.in);
System.out.print("请输入整数:");
int num = input.nextInt();
for (int i = 0;i < a.length;i++){
if (a[i] == num){
System.out.println("下标为:" + i);
break;
}
}
System.out.println(-1);
}
// 4.给定一个数组,输出数组中的最大值和最小值
public static void getMaxMin(){
int[] nums = {34, 65, 12, 98, 45};
int max = nums[0];
int min = nums[0];
for (int i = 0; i < nums.length;i++){
// 求最大值
if (nums[i] > max){
max = nums[i];
}
// 求最小值
if (nums[i] < min){
min = nums[i];
}
}
System.out.println("数组中的最大值为:" + max); // 数组中的最大值为:98
System.out.println("数组中的最小值为:" + min); // 数组中的最小值为:12
}
// 5.给定一个数组,把这个数组中所有元素顺序进行颠倒
public static void reverseOrder(){
int[] nums = {34, 65, 12, 98, 45};
for (int i = 0; i < nums.length / 2;i++){
int temp = nums[i];
nums[i] = nums[nums.length - i - 1];
nums[nums.length - i - 1] = temp;
}
for (int i = 0; i < nums.length;i++){
System.out.print(nums[i] + "\t"); // 45 98 12 65 34
}
}
}