第九章 数组
1.作业回顾
1,定义一个方法,功能是打印m行n列的指定符号的矩形,在主方法中调用此方法。
2,定义一个方法,功能是计算 长为x,宽为y的矩形的面积,在主方法中调用此方法,在主方法中打印结果。
3,定义一个方法,实现找出三个数的 最大值,并在主方法中调用此方法,在主方法中打印结果。
public class Day091 {
//1, 定义一个方法,功能是打印m行n列的指定符号的矩形,在主方法中调用此方法。
public static void Print_rectangular(int m, int n, String str) {
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(str);
}
System.out.println();
}
}
//2, 定义一个方法,功能是计算长为x,宽为y的矩形的面积,在主方法中调用此方法,在主方法中打印结果。
public static int Calculate_area(int x ,int y) {
return x * y;
}
//3, 定义一个方法,实现找出三个数的最大值,并在主方法中调用此方法,在主方法中打印结果。
public static int find_max_of_vulue(int a, int b, int c) {
return a > b ? (a > c ? a : c) : (b > c ? b : c);
}
// public static int find_max_of_vulue(int a, int b, int c) {
// return a > b ? Math.max(a, c) : Math.max(b, c);
// }
public static void main(String[] args) {
Print_rectangular(4, 4, ".");
int result = Calculate_area(4, 2);
System.out.println(result);
System.out.println(find_max_of_vulue(3, 2, 5));
}
}
2.数组的概念
什么是数组?
数组是一个容器,它可以保存一定数量的同一类型的数据。当数组创建完成后,它的长度就固定下来了。
数组是一块连续的存储空间。
int数组,内部可以存放int数据,如果数组的第一个元素地址:0000,0004,0008,0012
3.创建,初始化,和访问数组
public class Day092 {
public static void main(String[] args) {
//声明一个数组变量
int[] arr;
//创建一个可以存放10个int的数组
arr = new int[10];
//给数组的第一个元素赋值为10
arr[0] = 10;
//给数组的第二个元素赋值为20
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
arr[5] = 60;
arr[6] = 70;
arr[7] = 80;
arr[8] = 90;
//长度为10的数组最后一个元素的下标为9
arr[9] = 100;
//将数组的第一个元素的值赋值给变量a
int a = arr[0];
System.out.println(a);
//输出数组的最后一个元素
System.out.println(arr[9]);
}
}
public class Day093 {
public static void main(String[] args) {
//数组是引用类型的
//声明了一个数组变量
//变量的类型是int[],int是数组中元素的类型
//这个声明并不会真正的创建数组,它只是声明了一个可以引用的int类型数组的变量
int[] arr; //这个变量现在没有存放任何数据
//new int[10];这个语句,new操作符创建一个可以容纳10个int的数据
//将数组的引用(地址)赋值给arr,这样变量arr就引用了这个数组
//数组相当于空调,数组变量arr相当于空调的遥控器,通过遥控器可以操控空调
arr = new int[10];
//将数组变量arr的值(它所引用的数组的地址)赋值给数组变量arr1
//现在arr和arr1引用同一个数组
int[] arr1 = arr;
//将10赋值给arr所引用的的数组
arr[0] =10;
//取出arr1引用的数组的第一个元素的值
System.out.println(arr1[0]);
}
}
public class Day094 {
public static void main(String[] args) {
//可以声明其他类型的数组
byte[] arr1 = new byte[5];
long[] arr2 = new long[10];
String[] arr3 = new String[12];
//str是对象变量,它引用了字符串对象abc
//将字符串对象abc的地址赋值给对象变量str
String str = "abc";
}
}
public class Day095 {
public static void main(String[] args) {
//可以使用更简洁的方式来创建和初始化数组
//{10, 20, 30, 40}创建了一个长度为4的int数组,元素分别为10, 20, 30, 40
int[] arr = {10, 20, 30, 40};
System.out.println(arr[1]); //取第二个元素//20
//获取数组的长度
System.out.println(arr.length); //4
//获取数组最后一个元素
System.out.println(arr[arr.length - 1]); //40
}
}
public class Day096 {
public static void main(String[] args) {
//动态创建数组
int n = 10;
int[] arr = new int[10];
//数组的默认值
//创建一个数字数组(byte,short,int,long)所有的元素都初始化为0
//float和double是0.0
//boolean类型的初始化为false
//数组中元素如果是引用类型,那么初始化为null,表示此元素不引用任何对象
int[] arr1 = new int[5];
//遍历数组中的所有元素
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i]);
}//00000
System.out.println();
String[] arr2 = new String[10];
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i]);
}//nullnullnullnullnullnullnullnullnullnull
}
}
public class Day097 {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40};
//数组下标越界异常ArrayIndexOutOfBoundsException
System.out.println(arr[4]);
}
}
4.遍历数组
public class Day098 {
public static void main(String[] args) {
int[] arr = {100, 200, 300, 400, 500};
//使用for循环遍历数组中的所有元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}//100200300400500
System.out.println();
//使用foreach来遍历数组
//每次执行迭代时,将arr中对应的元素取出,赋值给i
//i代表当前元素,因为在执行迭代时会计数
//int是元素的类型
for(int i : arr) {
System.out.print(i);
}//100200300400500
System.out.println();
String[] arr1 = {"a", "b", "c"};
//String是元素的类型
for(String str : arr1) {
System.out.print(str);
}//abc
System.out.println();
//增强的for循环不能修改元素的值
for (int i : arr) {
i = 1;
}
for (int i : arr) {
System.out.print(i);
}//100200300400500
}
}
5.基本数据类型和引用数据类型的区别
5.1赋值
public class Day099 {
public static void main(String[] args) {
int a = 9;
int b = a; //将a的值拷贝给b
a = 8;
System.out.println(b); //9
int[] arr1 = {100, 200, 300};
int[] arr2 = arr1; //arr1和arr2引用同一个数组
arr1[0] = 101;
System.out.println(arr2[0]); //101
}
}
5.2传参
public class Day0910 {
public static void f(int n) {
n = 9;
}
public static void main(String[] args) {
//传参和赋值是一样的
int a = 10;
f(a); //拷贝实际参数a的值到形式参数n
System.out.println(a); //10
int n = 10;
f(n); //拷贝实际参数n的值到形式参数n
System.out.println(n); //10,这里的n和f中的n不是一个变量
}
}
public class Day0911 {
public static void f(int[] n) {
n[0] = 9;
}
public static void main(String[] args) {
//传参和赋值是一样的
int [] a = {100, 200, 300};
f(a); //拷贝实际参数a的值(数组的地址)到形式参数n,现在a和n引用同一个数组
System.out.println(a[0]); //9
}
}
5.3基本类型和引用类型,不管是赋值还是传参,都是值拷贝。
public class Day0912 {
public static void main(String[] args) {
//基本类型的相等性比较
int a = 10;
int b = 10;
System.out.println(a == b); //true,比较的是值
//引用类型的相等性比较
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
//变量arr1和变量arr2存放的是不同数组的地址
System.out.println(arr1 == arr2); //false
int[] arr3 = arr1;
System.out.println(arr1 == arr3); //true
}
}
6.使用Arrays类
java.utils.Arrays类中包含了用来操作数组的方法。
6.1相等性比较
import java.util.Arrays;
public class Day0913 {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
System.out.println(arr1 == arr2); //false
//比较数组中每一个元素的值
System.out.println(Arrays.equals(arr1, arr2)); //true
}
}
6.2数据填充
import java.util.Arrays;
public class Day0914 {
public static void main(String[] args) {
int[] arr = new int[3];
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}//000
System.out.println();
//将数组的每一个元素都填充为2
Arrays.fill(arr, 2);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}//222
}
}
6.3排序
import java.util.Arrays;
public class Day0915 {
public static void main(String[] args) {
int[] arr = {20, 4, 16, 80};
//从小到大排序
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
6.4查找
import java.util.Arrays;
public class Day0916 {
public static void main(String[] args) {
int[] arr = {20, 4, 16, 80};
//查找元素4的下标
System.out.println(Arrays.binarySearch(arr, 4)); //1
}
}
6.5格式化输出
import java.util.Arrays;
public class Day0917 {
public static void main(String[] args) {
int[] arr = {20, 4, 16, 80};
System.out.println(arr); //[I@4361bd48
//格式化输出
System.out.println(Arrays.toString(arr)); //[20, 4, 16, 80]
}
}
6.6拷贝
public class Day0918 {
public static void main(String[] args) {
int[] arr1 = {20, 4, 16, 80};
//创建一个新的数组,将原数组中的元素依次赋值到新数组,返回新数组的地址
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println(Arrays.toString(arr2)); //[20, 4, 16, 80]
System.out.println(arr1 == arr2); //false,arr1和arr2没有任何关联
//拷贝下标1到下标2之间的元素,包含开头不包含结束
int[] arr3 = Arrays.copyOfRange(arr1, 1, 2);
System.out.println(Arrays.toString(arr3)); //[4]
}
}
7练习
1,找出数组中元素的最大值 。
2,找出数组中元素的最大值和下标 。
3,数组反转[12345]—[54321]。