一维数组
数组(Array): 是多个相同类型数据按照一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组的常见概念:
- 数组名
- 下标(或索引)
- 元素
- 数组的长度:元素的个数
数组的特点:
- 数组是有序排列的。
- 数组本身是引用数据类型的变量,而数组中的元素可以是任何数据类型
- 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
- 数组的长度一旦确定,就不能修改。
一维数组的使用:
- 一维数组的声明和初始化
- 如何调用数组的指定位置的元素
- 如何获取数组的长度
- 如何遍历数组
- 数组元素的默认初始值
数组的声明和初始化:
public class ArrayTest{
public static void main(String[] args){
//①一维数组的声明和初始化
int[] ids;//声明
//静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids = new int[]{1001,1002,1003,1004};
//动态初始化:数组的初始化和数组元素的赋值操作分开操作
String[] names = new String[3];
//总结:数组一旦初始化完成,其长度就确定了
//数组元素的调用:
names[0] = "张三";
names[1] = "李四";
names[2] = "王五";
//数组的长度:
//属性:length
System.out.println(ids.length);//4
System.out.println(names.length);//3
//获取数组中的单个元素
System.out.println(names[0]);
//遍历数组中的所有元素
for(int i = 0;i< namses.length;i++){
System.out.println(names.[i]);
}
}
}
数据的默认初始化值
数组元素的默认初始化值:
- 数组元素是整形:0
- 数组元素的浮点型:0.0
- 数组元素是char性:0 或者’\u0000’ ; 并非是 ‘0’
- 数组元素是boolean性:false
- 数组元素是引用数据类型:null
public class ArrayTest {
public static void main(String[] args) {
//int型数组默认初始化值
int[] arr = new int[4];
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);//0000
}
System.out.println("--------------------------");
//double型数组默认初始化值
double[] arr1 = new double[4];
for(int i = 0;i<arr.length;i++){
System.out.println(arr1[i]);
}
System.out.println("--------------------------");
//char型数组默认初始化值
char[] arr2 = new char[4];
for(int i = 0;i<arr2.length;i++){
System.out.println("**" + arr2[i] + "**");
}
System.out.println("--------------------------");
//boolean型数组默认初始化值
boolean[] arr3 = new boolean[4];
for(int i = 0;i<arr3.length;i++){
System.out.println(arr3[i]);
}
System.out.println("--------------------------");
//引用数据类型数组默认初始化值
String[] arr4 = new String[4];
for(int i = 0;i<arr3.length;i++){
System.out.println(arr4[i]);//null
}
}
}
多维数组
二维数组
Java语言中提供了支持多维数组的语法
对于二位数组的理解,外面可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
二维数组的使用:
- 二维数组的声明和初始化
- 如何调用数组的指定位置的元素
- 如何获取数组的长度
- 如何遍历数组
- 数组元素的默认初始值
@Test
public void arrayTest2() {
//1.初始化
int[] arr = new int[]{1,2,3};//一维数组
//二维数组
//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
//动态初始化
String[][] arr2 = new String[3][2];//数组中包含3个元素,每个元素中又包含2个元素。
//2.如何调用数组的指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
//3.获取数组的长度
System.out.println(arr2.length);//3
System.out.println(arr2[1].length);//2
//4,如何遍历二维数组
//几维数组就使用几层 for循环
for(int i = 0;i < arr1.length;i++){
for(int j = 0;j < arr1[i].length;j++){
System.out.print(arr1[i][j] + " ");
}
System.out.println();
}
}
二维数组元素默认初始化值:
规定:二维数组分为外层数组的元素,内层数组的元素
-
针对于初始化方式一:比如:arr
-
外层元素的初始化值为:地址值
-
内层元素的初始化值为:与一位数组初始化情况相同
-
-
针对于初始化方式二:如 arr3
- 外层元素的初始化值为:null
- 内层元素的初始化值为:不能调用,否则报错
@Test
public void arrayTest3() {
int[][] arr = new int[4][3];
System.out.println(arr[0]);//地址值
System.out.println(arr[0][0]);//0
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//地址值
System.out.println(arr1[0][0]);//0.0
String[][] arr2 = new String[4][3];
System.out.println(arr2[0]);//地址值
System.out.println(arr2[0][0]);//null
double[][] arr3 = new double[4][];
System.out.println(arr3[1]);//null
System.out.println(arr3[1][0]);//报错
}
数组中涉及到的常用算法
常用:
- 数组元素的赋值(杨辉三角、回形数等)
- 求数值型数组中元素的最大值、最小值、平均数、总和等
- 数组的赋值、反转、查询(线性查找、二分法查找)
- 数组元素的排序算法
查找
线性查找:
实现思路:通过遍历的方式,一个一个的数据进行比较、查找。
适用性:具有普遍适用性
二分法查找:
实现思路:每次比较中间值,折半的方式检索。
适用性:前提:所要查找的数组必须有序。
排序
排序:假设含有n个记录的序列为{R1,R2,……,Rn},其相应的关键字序列为{K1,K2,……,Kn}。将这些记录重新排序为{Ri1,Ri2,……,Rin},使得相应的关键字值满足条件Ki1<=Ki2<=……<=Kin,这样的一种操作称为排序。
通常来说,排序的目的的快速查找。
衡量排序算法的优劣:
- 时间复杂度:分许关键字的比较次数和记录的移动次数(高效率)
- 空间复杂度:分析排序算法中需要多少辅助内存(低存储)
- 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
排序算法分类:内部排序和外部排序
- 内部排序:整个排序过程不需要借助外部存储器(如磁盘等),所有排序操作都在内存中完成。
- 外部排序:参与排序的数据非常多,数据量非常大,计算机无法把真个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认位外排序是由多次内部排序组成。
十大内部排序算法
- 选择排序
- 直接选择排序
- 堆排序
- 交换排序
- 冒泡排序
- 快速排序(常用、快)
- 插入排序
- 直接插入排序
- 折半插入排序
- Shell排序
- 归并排序
- 桶式排序
- 基数排序
算法的5大特征
- 输入:由0个或者多个输入数据,这些输入必须由清除的描述和定义
- 输出:至少有1个活多个输出结果,不可以没有输出结果
- 有穷性(有线性):算法在有限的步骤之后会自动结束而不会无线循环,并且没有每一个步骤都可以在可接受的时间内完成。
- 确定性(明确性):算法中的每一步都有明确的含义,不会出现二义性。
- 可行性(有效性):算法的每一步都是清楚且可行的,能上用户用纸笔计算而求出的答案。
说明:满足确定性的算法也称为:确定性算法。现在人们也关注更广泛的概念。比如:考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终止的计算描述,这种描述有时被称为过程。
冒泡排序:
@Test
public void arrayTest4() {
int[] arr = new int[]{43,32,76,-42,0,64,33,-21,32,99};
//冒泡排序
for(int i = 0;i < arr.length;i++){
for(int j = 1;j < arr.length - i;j++){
if(arr[j - 1] > arr[j]){
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + " ");
}
}
Arrays工具类
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
@Test
public void arraysTest() {
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,4,2,3};
//1.boolean equals(int[] a,int[] b) //判断两个数组是否相等。
boolean isEquals = Arrays.equals(arr1,arr2);
System.out.println(isEquals);//false
//2.String toString(int[] a); //输出数组信息
String str = Arrays.toString(arr1);
System.out.println(str);//[1, 2, 3, 4]
//3.void fill(int[] a,int val); //将指定值填充到数组当中
Arrays.fill(arr1, 999);
System.out.println(Arrays.toString(arr1));//[999, 999, 999, 999]
//4.void sort(int[] a) //对数组进行排序
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4]
//5.int binarySearch(int[] a,int key); //对排序后的数组进行二分法查找
int index = Arrays.binarySearch(arr2, 2);
System.out.println(index);//1
}