数组,二维数组,数组排序,Arrays的常用方法
java 核心基础 2.26
数组
数组是一个用于存放大量相同数据类型的集合
数组基本要素
- 数组名称
- 数组下标
- 元素类型
- 数据元素
数组中的每一个元素都可以通过下标去访问到相应的数据,数组中的每一个元素的元素类型必须相同
如何使用数组
声明数组 分配内存空间 给数组赋值 使用数组
示例代码:
//声明数组
int[] array;
//分配内存空间
array = new int[4];
//数组赋值
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
//使用数组
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
相关的JMM图例:
常见的错误
- 元素类型不匹配
array是int类型的数组,而array[2]赋值的字符串类型
- 数组下标越界异常,数组下标最长为 数组长度-1
//声明数组
int[] array;
//分配内存空间
array = new int[4];
//数组赋值
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
System.out.println(array[5]);
抛出数组越界异常ArrayIndexOutOfBoundsException
数组常用操作和方法
1、求数组中的最大值
代码:
int[] arr = {10, 2, 49, 89, 9};
int max=arr[0];
for (int i = 1; i < arr.length; i++){
if(max<arr[i])
max=arr[i];
}
System.out.println(max);
2、求数组中的最小值
代码:
int[] arr = {10, 2, 49, 89, 9};
int min=arr[0];
for (int i = 1; i < arr.length; i++){
if(min>arr[i])
min=arr[i];
}
System.out.println(min);
3、在数组的指定位置插入一个数据
代码:
int[] arr = {10, 2, 49, 89, 9};
//插入99到arr的第三个元素中
int[] newArr =new int[arr.length+1];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
newArr[3] = 99;
System.out.println("======================================");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(newArr));
输出:
4、数组排序
代码:
int[] arr = {10, 2, 49, 89, 9};
//数组排序(冒泡排序,升序排列)
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length -1 - j; i++) {
if(arr[i] > arr[i+1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
Arrays.toString()源码实现,可以借鉴学习一下编程思想
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
StringBuilder比String 的效率高
Arrays 是 JDK 提供的一个工具类,专门用来操作数组,通过调用该工具类的方法即可完成对数组的操作,存储在 java.util 包中
Arrays的常用方法
- Arrays.toString(arr1) 输出
- Arrays.equals(arr1, arr2) 比较两个数组是否相等
- Arrays.copyOf(arr1, 10) 创建一个新数组,并将原数组中的元素复制到新数组中,并规定长度
- Arrays.copyOfRange(arr1, 0, 3) 创建一个新数组,并将原数组的前3个元素复制到新数组中
int[] arr1 = {10, 2, 49, 89, 9};
int[] arr2 = {10, 2, 49, 89, 9};
int[] arr3 = {11, 22, 33, 44};
// 比较两个数组是否相等
System.out.println(Arrays.equals(arr1, arr2));
// 对数组进行排序
Arrays.sort(arr1);
System.out.println(Arrays.toString(arr1));
// 创建一个新数组,并将原数组中的元素复制到新数组中
int[] arr4 = Arrays.copyOf(arr1, 10);
System.out.println(Arrays.toString(arr4));
// 创建一个新数组,并将原数组的前3个元素复制到新数组中
int[] arr5 = Arrays.copyOfRange(arr1, 0, 3);
System.out.println(Arrays.toString(arr5));
输出:
二维数组
JMM 内存模型
二维数组的使用
声明 开辟内存空间 赋值 使用
int[][] arr;
arr = new int[3][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
arr[2][0] = 7;
arr[2][1] = 8;
arr[2][2] = 9;
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}
//声明式赋值
int[][] arr2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
System.out.println(Arrays.deepToString(arr2));
Arrays.deepToString(arr2) :Arrays工具类里面的方法,可以用来输出二维数组的值
例子:超市卖鸡蛋的货柜分为上、中、下 3 层,每层又分为 6 个格挡,每个格挡中的鸡蛋个数为层数*格挡数,比如第1层的第3个格挡中有1 * 3 = 3个鸡蛋,第3层的第6个格挡中有3 * 6 = 18个鸡蛋,要求按照此规律使用二维数组来装载所有的鸡蛋并求出总数量。
代码:
int[][] arr = new int[3][6];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
System.out.println("第" + (i + 1) + "层货架:");
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = (i + 1) * (j + 1);
System.out.println("第"+(j+1)+"个鸡蛋:"+arr[i][j]);
sum += arr[i][j];
}
System.out.println();
}
System.out.println("总的鸡蛋数量为:" + sum);
arr.length :3,代表存放了三个数组的首地址,所以长度为3
arr[i].length :代表自己数组的长度,所以长度为6
输出:
总的鸡蛋数量为:126
面向对象
面向对象是一种编程思想,java主要就是面向对象的编程语言
万物皆可对象,程序员不需要对象,自己new一个就行了,可以把程序中的所有角色都看成一个对象
面向对象和面向过程的区分
-
面向对象
面向对象注重的是整个事情的模块化思想
核心思想是 重用性 和 灵活性 (可扩展性和变化性)
重用性是指 某个写好的程序可以在多个业务模块中反复使用
-
面向过程
面向过程注重的是整个事情的每一个步骤