一. 数组的定义
- 数组是相同类型数据的有序集合
- 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
- 其中每个数据称为一个数组元素每个数组元素可以通过一个下标来访问它们。
二. 数组声明和创建
首先必须声明数组变量,才能在程序中使用数组,下面是声明数组变量语法。
int[] max;//首选的方法
int max[];//两个效果一样,但不是首选方法
java语言使用new操作符来创建数组,语法如下;
int [] max = new int [ 数组长度];
- 数组的元素是通过索引访问的,数组索引从0开始。
- 获取数组长度:数组变量名.length
- 案例理解
三. 数组的三种初始化
- 静态初始化
int[] a= {1,2,3};
Man[] mans = {new Man(1,1),new Man(2,2)};
- 动态初始化
int[] a= new int[];
a[0]=1;
a[1]=2
- 数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
四. 数组的四个基本特点
-
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
-
其元素必须是相同类型,不允许出现混合类型。
-
数组中的元素可以是任意数据类型,包括基本类型和引用类型。
-
数组变量属于引用类型,数组也可以看成对象,数组中的每个元素相当于该对象的成员变量。
-
数组本身就是对象,Java中队象是推中的,因此数组无论保存原始类型还是其他类型,数组队象本身是在推中的.
数组边界
-
下标的合法区间:[0.length-1],如果越界就会报错;
public static void main(String[] args){
int []a=new int[2];//定义第一个数组为2
System.oiut.println(a[2]);//而输出第三个数组,所以会报错。
}
- ArraylndexOutOfBoundsExcption:数组下标越界异常.
小结:
-
数组是相同数据类型(数据类型可以为任意类型)的有序集合
-
数组也是对象。数组元素相当于对象的成员变量
-
数组长度的确定的,不可变的。如果越界,则报ArraylndexOutOfBoundsExcption
-
理解:下方代码为什么报错
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
System.out.println(a[0]);
for (int i=0;i<=a.length;i++){
System.out.println(a[i]);
}
}
五. 数组的使用
-
普通的for循环
-
for- Each 循环
-
数组作方法入参
-
数组作返回值
1. 普通的for循环
案例:打印全部的数组元素
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
for (int i=0;i<a.length;i++){//将a数组的数全部循环出来
System.out.println([i]);
}
}
案例:计算所有元素的和
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
int sum=0;
for (int i=0;i<a.length;i++){//将a数组的数全部循环出来
sum+= a[i];//将a数组的数加上sum的数总和赋sum
System.out.println("总和为:"+sum);
}
}
案例:查找最大值
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
int max =a[0];
for (int i=0;i<a.length;i++){//将a数组的数全部循环出来
if(a[i]>max){//如果a[i]数组的数大于max数往下执行
max= a[i];//将a[i]大于max的数赋值给max
}
}
System.out.println("最大值为:"+max);
}
进阶版
2. for- Each 循环
案例:打印全部的数组元素
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
for (int i:a){//将a数组的数全部循环出来
System.out.println([i]);
}
}
3. 数组作方法入参
案例:打印全部的数组元素
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
k(a);
}
public static void k(int[] a){
for (int i:a){//将a数组的数全部循环出来
System.out.println(a[i]);
}
}
}
4. 数组作返回值
案例:反转数组(将数组的数倒着输出)
public class 小白 {
public static void main(String[] args){
int[] a={1,2,3,4,5,6,7,8};
int [] b=b(a);//将反转的数给a数组
q(b);//用q方法打印b方法反转的数——输出
}
//反转方法
public static int [] b(int []a){
int [] c = new int [a.length];//新建一个c数组【将a数组的长度给c数组】
//当j等于c数组第7个,j--;i等于a数组第零个,i++
for(int i = 0, j=c.length-1;i<a.length;i++,j--){
c[j]= a[i];//将a数组第零个数给c数组第七个
}
return c;//返回c数组的数
}
//打印全部的数组元素
public static void q(int[] a) {
for (int i = 0; i<a.length; i++) {//将a数组的数全部循环出来
System.out.print(a[i]+" ");
}
}
}
六. 多维数组
- 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每个元素都是数组。
- 二维数组
int a [][] = new int[2][5];
- 解析:以上二维数组可以看成一个两行五列的数组。
思考:多维数组的使用?
案例:
public class 小白 {
public static void main(String[] args){
int [][] a= {{1,2},{3,4},{5,6},{7,8}}
System.out.println(a[0][0]+","+a[0][1]);
}
}
输出:1,2
看图理解:
public class dd {
public static void main(String[] args){
int [][] a= {{1,2},{3,4},{5,6},{7,8}};
q(a[0]);//输出:a数组的第零个
}
//打印全部的数组元素
public static void q(int[] a) {
for (int i = 0; i<a.length; i++) {//将a数组的数全部循环出来
System.out.print(a[i]+" ");
}
}
}
输出:1 2
案例数组的长度
public class 小白{
public static void main(String[] args){
int [][] a= {{1,2},{3,4},{5,6},{7,8}};
System.out.println(a.length);
System.out.pritln(a[0].length);
}
}
输出:4 2
案例:输出全部的数组的数
public class 小白 {
public static void main(String[] args){
int [][] a= {{1,2},{3,4},{5,6},{7,8}};
for(int i = 0; i<a.length;i++){
for(int j=0; j<a[0].length;j++){
System.out.pritln(a[i][j]);
}
}
}
}
输出:1 2 3 4 5 6 7 8
不理解看图理解
七. Arrays类
- 数组的工具类Java.util.Arrays
- 重点:学会查看JDK帮助文档
- Arrays类中的方法都是static修饰的静态方法没在使用的时候可以直接使用类名进行调用,而不用使用对象来调用(注意:不用而不是不能)
- 常用功能:给数组赋值:通过fill方法
- 对数组排序:通过SORT方法,按升序。
- 比较数组:通过equals方法比较数组中元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序号的数组进行二分查找法操作。
类Arrays使用
import java.util.Arrays;
public class 类Arrays使用 {
public static void main(String[] args) {
int a[]={2,4,546,56,67567,562562,65,7,23,56};
//Arrays输出全部数组
System.out.println(Arrays.toString(a));
}
}
输出:[2, 4, 546, 56, 67567, 562562, 65, 7, 23, 56]
自己也可以这样写:
import java.util.Arrays;
public class 类 {
public static void main(String[] args) {
int a[] = {2, 4, 546, 56, 67567, 562562, 65, 7, 23, 56};
b(a);
}
public static void b(int a[]) {
for (int i = 0; i < a.length; i++) {
if (i == 0) {
System.out.print("[");
}
if (i == a.length - 1) {
System.out.print(a[i] + "]");
} else {
System.out.print(a[i] + ", ");
}
}
}
}
输出:[2, 4, 546, 56, 67567, 562562, 65, 7, 23, 56]
Arrays对数组排序
import java.util.Arrays;
public class 类Arrays使用 {
public static void main(String[] args) {
int a[]={2,4,546,56,67567,562562,65,7,23,56};
Arrays.sort(a);//从小到大排序
System.out.println(Arrays.toString(a));
}
}
输出:[2, 4, 7, 23, 56, 56, 65, 546, 67567, 562562]
Jdk文档去了解其他方法
八. 冒泡排序简介(从小到大排序)
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个
package com;
import java.util.Arrays;
public class Arraysdome1 {
public static void main(String[] args) {
int [] a={1234,63,6236,4,23567,34,56,2};
int [] m=m(a);
System.out.println(Arrays.toString(a));
}
public static int[] m(int[] a){
//临时变量
int temp =0;
//外层循环,判断我们要走多少次
for (int i = 0; i <a.length-1; i++) {
//内层循环,比价判断两个数,如果第一个数,比第二个数大,则交换位置
for (int j= 0; j<a.length-1; j++) {
if(a[j+1]>a[j]) {
temp= a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
return a;
}
}
九. 稀疏数组
- 概念
当一个中大部分元素为零时,或者为同一个值的数组时。 - 处理方法
(1)记录数组有几行几列,有多少个不同的值。
( 2)把具有不同值的元素的行列值记录在一个小规模数组中,而缩小程序的规模 - 原数组如下:
- 转换为稀疏数组如下:
案例
public void SparseTest() {
// 创建一个原始的二维数组 11 * 11
// 0: 表示没有棋子, 1 表示 黑子 2 表蓝子
int[][] arr = new int[11][11];
arr[1][1] = 1;
arr[2][3] = 2;
arr[4][5] = 2;
System.out.println("原始数组");
for (int[] tmp:arr) {
for ( int t : tmp) {
System.out.printf("%d\t",t);
}
System.out.println();
}
int[][] sparseArr=ArrayToSparse(arr);
//1.0输出稀疏数组
System.out.println("输出稀疏数组");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
System.out.println();
}
//2.0 将系数数组写入文件
WriteSparseToFile(sparseArr,"xishu.txt");
//3.0从文件中读出稀疏数组
System.out.println("从文件中读出稀疏数组");
int[][] readFileArray = ReadFileToArray("xishu.txt");
for (int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
System.out.println();
}
//4.0从文件中读出稀疏数组,恢复成原来数组
System.out.println("恢复出来的二维数组");
int[][] ints = SparseToArray(readFileArray);
for (int[] tmp:ints) {
for ( int t : tmp) {
System.out.printf("%d\t",t);
}
System.out.println();
}
}