Java学习(6)
- Java数组
- 数组概述
- 数组的本质是什么呢?
- 数组的特点
- 数组的定义方式
- 二维数组
- Arrays数组工具类
Java数组
数组概述
在执行程序的过程中,经常需要存储大量的数据,例如,假设需要读取100个数,计它们的平均值,然后找出有多少个数大于平均值。首先,程序读入这些书并且计算它们的平均值,然后将每个数与平均值进行比较判断它是否大于平均值。为了完成这个任务,必须将全部的数据存储到变量中。必须声明100个变量,并且重复书写100次几乎完全相同的代码。这样编写程序的方式似乎是不太现实的,那么该如何解决这个问题呢?
Java和许多高级语言都提供了一种称作数组(array)的数据结构,可以用它来存储一个元素个数固定且元素类型下相同的有序集。数组主要解决多变量多数据的存储问题,方便程序后期统一维护操作数据。
数组的本质是什么呢?
- 数组就是一系列空间大小相等且地址连续的一片存储空间。
- 为什么空间大小是相等的呢?就是为了方便统一维护我们的数据,必须得保证数据之间的类型是一样的。
- 为什么变量空间的地址是连续的呢?地址连续切大小相等方便计算后续元素的具体物理内存地址。
数组的特点
- 数组就是一片地址连续且空间大小一致的存储空间(但是每个空间存的还是其他数据的地址。
- 数组存在于堆内存中,但凡在堆中存储的数据都称之为对象。
- 数组提供角标来访问数组当中的元素。
- 数组变量存的就是数组在堆内存中首元素的地址。
- 数组通过角标来访问元素的具体计算方式是:所要访问数据的地址 = 首元素地址 + 角标 * 数据类型大小。
- 数组一旦定义下来,其长度不可改变;数组中有几个地址?就看数组有几个元素空间(数组的长度)。
- 创建数组时必须明确规定大小或内容。
数组的定义方式
创建数组只指定长度但不指定内容
数据类型[] 数组名 = new 数据类型[长度];
创建数组指定内容(同时长度就确定了)
数据类型[] 数组名 = new 数据类型[]{数据1, 数据2, 数据3, ..., 数据n};
数据类型[] 数组名 = {数据1, 数据2, 数据3, ..., 数据n};
数组遍历
public class ArrayTraversal {
public static void main(String[] args) {
int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (int i : arr) {
System.out.println(i);
}
}
}
例题1:有一堆1元硬币,每次只能拿一个或者两个,求最少多少次可以拿完硬币{10, 8, 5, 3, 27, 99}
10要5次 8要4次 5要3次 3要2次 27要14次 99要50次
一共78次
package day07;
public class Test3 {
public static void main(String[] args) {
int[] arr= {10, 8, 5, 3, 27, 99};
System.out.print(getCoin(arr));
}
public static int getCoin(int[] arr) {
int count=0;
for(int i=0;i<arr.length;i++) {
int num=arr[i];
if(num%2==0) {
count+=num/2;
}else {
count+=num/2+1;
}
}return count;
}
}
例题2:请输入10位同学的java成绩,
求平均成绩,最高成绩、最低成绩
package day07;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
double[] arr= {};
Scanner sc = new Scanner(System.in);
//输入成绩
double max=0,min=0,sum=0;
for(int i=0;i<=arr.length;i++){
System.out.print("请输入第"+(i+1)+"个java同学成绩:");
double num=sc.nextDouble();
arr[i]=num;
sum+=arr[i];
if(i==0){
max=arr[i];
min=arr[i];
}else {
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
}
System.out.println("平均成绩:"+(sum/arr.length));
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
}
二维数组
就是一个由行和列组成的一个表格而已,矩阵Matrix。
在这个矩阵中访问元素的话,是根据元素的行角标和列角标所确定的。
二维数组具体是在内存中如何存储的呢?
- 无论是二维数组,还是多维数组,它们本身就是一个一维数组。
- 尤其对于二维数组而言,无非就是一个一维数组,只不过该一维数组中的每一个元素是另一个一维数组罢了。
定义方式
//创建一个3行4列的二维数组,元素默认都是0
int[][] matrix = new int[3][4];
//创建个指定元素的二维数组
int[][] matrix = new int[][]{
{ 1, 2, 3, 4 } ,
{ 5, 6, 7, 8 } ,
{ 9, 10, 11, 12 }
};
//锯齿矩阵
int[][] matrix = {
{ 1, 2, 3, 4 } ,
{ 5, 6, 7 } ,
{ 8, 9 },
{ 10 }
};
Arrays数组工具类
此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。
static int binarySearch(int[] a, int key) :使用二分搜索法来搜索指定的 int型数组,以获得指定的值。
static int[] copyOf(int[] original, int newLength) :复制指定的数组,截取或用 0
填充(如有必要),以使副本具有指定的长度。static boolean equals(int[] a, int[] a2) :如果两个指定的 int 型数组彼此相等 ,则返回true。
static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。
static String toString(int[] a) :返回指定数组内容的字符串表示形式。