java学习笔记(六) - 数组

一、数组的使用

1. 定义

1
2
3
4
5
6
7
//方式一
数据类型 数组名[] = new 数据类型[大小];
//方式二
数据类型[] 数组名 = new 数据类型[大小];
//案例
int nums[] = new int[5];
int[] nums = new int[5];

2. 初始化数组

1
2
3
数据类型 数组名[] = {元素值, 元素值...};//元素值要为同一数据类型
//案例
int nums[] = {1,2,3,9};

3. 注意事项

  • 数组是多个相同类型数据的组合,实现对这些数据的统一管理

  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用,数组创建后,如果没有赋值,有默认值(int0, short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false, String null)

  • 使用数组的步骤:

    • 声明数组并开辟空间

    • 给数组各个元素赋值

    • 使用数组

  • 数组的下标是从0开始的

  • 数组下标必须在指定范围内使用,否则报:下标越界异常

    1
    int [arr=new int[5];//则有效下标为0-4
  • 数组属引用类型,数组型数据是对象(object)

二、数组的赋值机制

  • 基本数据类型赋值,这个值就是具体的数据
  • 数组在默认情况下是引用传递,赋的值是地址

1. 值传递

2. 值拷贝

三、排序

  • 将一群数据,以指定的顺序进行排列的过程

1. 内部排序法

  • 指将需要处理的所有数据都加载到内部存储器中进行排序(交换式排序法、选择式排序法和插入式排序法)

2. 外部排序法

  • 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序(合并排序法和直接合并排序法)

3. 冒泡排序(Bubble Sorting)

  • 通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较
    大的元素逐渐从前移向后部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class BubbleSort {
//编写一个main方法
public static void main(String[] args) {

//将5个无序的数:24,69,80,57,13;使用冒泡排序法将其排成从小到大的有序数列
int tem = 0;//定义一个中间值
//定义一个静态数组
int[] arr = {24,69,80,57,13,54,100};
//进行外层循环 次数为arr.length - 1
for(int i = 0;i < arr.length - 1;i++) {
//进行判断大小循环
for(int j = 0;j < arr.length - i;j++) {
//比大小 并进行交换位置
if(arr[j] > arr[j + 1]) {
tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
}
//打印
System.out.println("======arr中的元素=======");
for(int j = 0;j < arr.length;j++) {
System.out.println(arr[j]);
}
}
}

四、查找

1. 顺序查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.Scanner;
public class SequenceSearch {
//编写一个main方法
public static void main(String[] args) {
/*
有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
从键盘输入任意一个名称,判断数列中是否包含此名称[顺序查找]
要求:如果查找到,就提示找到,并给出下标

思路分析:
1、定义一个字符串数组
2、接收用户输入、遍历数组,逐一比较,如果有则提示信息,并退出。
*/
//定义一个字符串数组
String[] names = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};

Scanner scanner = new Scanner (System.in);
System.out.println("请输入一个名字:");
String findName = scanner.next();

//遍历数组,逐一比较,如果有则提示信息,并退出

int index = -1;
for(int i = 0;i < names.length;i++) {

//字符串比较 equals
if(findName.equals(names[i])) {
System.out.println("恭喜你猜对了!" + "是第" + (i + 1) + "个");
index = i;
break;//退出
}
}
//没有找到
if(index == -1) {
System.out.println("很遗憾查找失败!");
}
System.out.println("猜数游戏程序退出!");
}
}

2. 二分查找

五、多维数组 - 二维数组

1. 定义

1
2
3
数据类型[][] 数组名 = new 数据类型[大小][大小];
//案例
int[][] nums = new int[8][8];

2. 动态初始化

  • 先声明:数据类型 数组名 [] []
  • 在定义:数组名 = new 数据类型[大小] [大小]
  • 赋值,存在默认值
1
2
int[][] nums;
nums = new int[8][8];

3. 静态初始化

1
2
3
数据类型 数组名[][] = {{值1, 值2...},{值1, 值2...}}
//案例
int arr[][] = {{4,6},{1,4,9,5},{-2}};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class YangHui {
//编写一个main方法
public static void main(String[] args) {
/*
使用二维数组打印一个10 行杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
.....

思路分析:
1.创建一个二位数组 包含10和一维数组 int arr[][] = new int[10][]
2.后一个以为数组里里面的元素比上一个数组多一
3.数组第一和最后一个元素均为1,arr[i][0] arr[i][j.length]
中间元素等于上一个数组对应元素下标和前一个元素的和 arr[i][j] = arr[i -1][j-1] + arr[i - 1][j]
4.打印
*/

Scanner scanner = new Scanner (System.in);
System.out.println("请输入杨辉三角的的行数:");
int h = scanner.nextInt();

//创建一个二位数组
int arr[][] = new int[h][];

//遍历二位数组
for(int i = 0;i < arr.length;i++) {

//创建一维数组 如果没有给一维数组new 那么arr[i] 就是null
arr[i] = new int[i+1];

//遍历一维数组
for(int j = 0;j < arr[i].length;j++) {

//当一维数组的第一个或者最后以一个时赋值为1,否则中间元素等于上一个数组对应元素下标和前一个元素的和
if(j == 0 || j == arr[i].length - 1) {
arr[i][j] = 1;//赋值
} else {
arr[i][j] = arr[i -1][j-1] + arr[i - 1][j];//赋值
}
}
}
//打印
System.out.println("======arr中的元素=======");
for(int i = 0;i < arr.length;i++) {
for(int j = 0;j <= i;j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();//换行
}
}
}

4. 注意事项

  • 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同