数组概述
数组声明创建
public class ArraryDemo01 {
//变量的类型 变量的名字 =变量的值;
//数组类型
public static void main(String[] args) {
int []nums;//1.定义
int nums2[];//c与c++定义方法
}
}
public class ArraryDemo01 {
//变量的类型 变量的名字 =变量的值;
//数组类型
public static void main(String[] args) {
int []nums;//1.定义
nums=new int[10];//这里面可以存放10个int类型的数字 创建一个数组
//给数组元素中赋值
nums[0]=1;
nums[1]=2;
nums[2]=3;
nums[3]=4;
nums[4]=5;
nums[5]=6;
nums[6]=7;
nums[7]=8;
//nums[8]=9;
nums[9]=10;
//不赋值会有一个默认值 int类型是0 string类型是null
System.out.println(nums[9]);
System.out.println(nums[8]);
//计算所有元素的和
int sum=0;
//arrays.length数组的长度
for (int i = 0; i <nums.length ; i++) {
sum+=nums[i];
}
System.out.println("总和为:"+sum);
}
}
10
0
总和为:46
进程已结束,退出代码为 0
内存分析
当我们使用数组中不存在的下标时,则会报错
java.lang.ArrayIndexOutOfBoundsException
所以,当今后在编程过程中出现这样的错误,首先我么要想到是否是数组越界的问题。
数组使用
public class ArrayDemo02 {
public static void main(String[] args) {
//静态初始化 :创建+赋值
int [] a={1,2,3,4,5,6,7,8,9};
System.out.println(a[0]);
//动态初始化 包含默认初始化
int [] b= new int[10];
b[0]=20;
System.out.println(b[0]);
System.out.println(b[1]);
System.out.println(b[2]);
}
}
1
20
0
0
进程已结束,退出代码为 0
public class ArrayDemo03 {
public static void main(String[] args) {
int []arrays={1,2,3,4,5};
//打印全部的数组元素
for (int i = 0; i <arrays.length ; i++) {
System.out.println(arrays[i]);
}
System.out.println("=============================");
//计算所有元素的和
int sum=0;
for (int i = 0; i <arrays.length ; i++) {
sum+=arrays[i];
}
System.out.println("sum="+sum);
System.out.println("=================================");
//查找最大元素
int max=arrays[0];
for (int i = 1; i <arrays.length ; i++) {
if (arrays[i]>max){
max=arrays[i];
}
}
System.out.println("max="+max);
}
}
运行结果:
1
2
3
4
5
=============================
sum=15
=================================
max=5
public class ArrayDemo04 {
public static void main(String[] args) {
int[]arrays={1,2,3,4,5};
//JDK1.5,没有下标
// for (int array : arrays) {
// System.out.println(array);
// }
printArray(arrays);
System.out.println();
int[]reverse=reverse(arrays);
printArray(reverse);
}
//打印数组元素
public static void printArray(int[]arrays){
for (int i = 0; i <arrays.length ; i++) {
System.out.printf(arrays[i]+"");
}
}
//反转数组
public static int[] reverse(int[]arrays){
int []result=new int[arrays.length];
//反转的操作
for (int i = 0,j=result.length-1; i <arrays.length ; i++,j--) {
result[j]=arrays[i];
}
return result;
}
}
运行结果
12345
54321
多维数组
public class ArrayDemo05 {
public static void main(String[] args) {
//[4][2]
/*
1,2 array[0]
2,3 array[1]
3,4 array[2]
4,5 array[3]
*/
int[][]array={{1,2},{2,3},{3,4},{4,5}};
for (int i = 0; i <array.length ; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]);
}
}
printArray(array[0]);
System.out.println();
System.out.println(array[0][0]);
System.out.println(array[0][1]);
System.out.println(array[2][1]);
}
public static void printArray(int[]arrays){
for (int i = 0; i <arrays.length ; i++) {
System.out.printf(arrays[i]+" ");
}
}
}
运行结果:
1
2
2
3
3
4
4
5
1 2
1
2
4
Arrays类
Array类中内置方法:
可通过ctrl+鼠标右键点击idea中的Array 选择右下角的结构选项中可查看到Array类中的内置方法。也可通过JDK帮助文档查看内置的方法,在这里就不多赘述了。
import java.util.Arrays;
public class ArrayDemo06 {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 9090, 21231, 543, 21, 3, 23};
System.out.println(a);
//打印数组元素
System.out.println(Arrays.toString(a));
printArray(a);
System.out.println();
Arrays.sort(a);//数组进行排序 升序排序
System.out.println(Arrays.toString(a));
Arrays.fill(a,0);
System.out.println(Arrays.toString(a));
}
//不要重复造轮子
public static void printArray(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] + ", ");
}
}
}
}
运行结果:
[I@6d311334
[1, 2, 3, 4, 9090, 21231, 543, 21, 3, 23]
[1, 2, 3, 4, 9090, 21231, 543, 21, 3, 23]
[1, 2, 3, 3, 4, 21, 23, 543, 9090, 21231]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
不要过度依赖工具类,工具类中的方法也是人写出来的,我们也可以写出来,但是没有必要重复造轮子。刚开始学习的话,明白其中的基本原理即可。
Array类tostring方法源码
这是包中内置的tostring方法的源码,在这里给大家复制粘贴出来学习,可能很多同学在刚接触Java,不太能理解stringBuilder类,今后会给大家做一个详细的介绍。
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(", ");
}
}
冒泡排序
//冒泡排序
//1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置。
//2.每一次比较,都会产生出一个最大,或者最小的数字。
//3.下一轮,可以少一次排序!
public static int[] sort(int []array){
//临时变量
int temp=0;
//外层循环,判断我们这个循环要走多少次;
for (int i = 0; i <array.length-1 ; i++) {
//内层循环,比较判断两个数,如果第一个数,比第二个数大,则交换位置
for (int j = 0; j <array.length-1-i ; j++) {
if (array[j+1]>array[j]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
return array;
}
如果要将降序改为升序,则将if (array[j+1]>array[j])中的大于号变成小于号即可,冒泡排序是一个非常重要的排序方法,所以希望大家可以课下多多练习,熟练并且掌握这一个排序方法,对于以后的学习或者是工作来说都有很好的帮助。
冒泡排序的一种优化方式——加入flag标识位
public static int[] sort(int []array){
//临时变量
int temp=0;
//外层循环,判断我们这个循环要走多少次;
boolean flag=false;//通过flag标识位减少没有意义的比较
for (int i = 0; i <array.length-1 ; i++) {
//内层循环,比较判断两个数,如果第一个数,比第二个数大,则交换位置
for (int j = 0; j <array.length-1-i ; j++) {
if (array[j+1]>array[j]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=true;
}
}
if(flag==true){
break;
}
}
return array;
}
*稀疏数组
代码实现稀疏数组
其中包含了稀疏数组的构建与稀疏数组的还原
public class ArrayDemo08 {
public static void main(String[] args) {
//1.创建一个二维数组 11*11 0:没有棋子 1:黑棋 2:白棋
int [][]array1=new int[11][11];
array1[1][2]=1;
array1[2][3]=2;
//输出原始的数组
System.out.println("输出原始的数组");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("===========================================================");
//转换为稀疏数组保存
//获取有效值的个数
int sum=0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j <11 ; j++) {
if (array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
//2.创建一个稀疏数组的数组
int[][]array2=new int[sum+1][3];
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非零的值,存放进稀疏数组中
int count=0;
for (int i = 0; i < array1.length ; i++) {
for (int j = 0; j < array1[i].length ; j++) {
if (array1[i][j]!=0){
count++;
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组:");
for (int i = 0; i < array2.length ; i++) {
System.out.println(array2[i][0]+"\t"
+array2[i][1]+"\t"
+array2[i][2]+"\t"
);
}
System.out.println("================================");
System.out.println("还原稀疏数组");
//1.读取稀疏数组的值
int[][]array3=new int[array2[0][0]][array2[0][1]];
//2.给其中元素还原它的值
for (int i = 1; i < array2.length ; i++) {
array3[array2[i][0]][array2[i][1]]=array2[i][2];
}
//3.打印
System.out.println("输出还原的数组");
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}
输出原始的数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
===========================================================
有效值的个数:2
稀疏数组:
11 11 2
1 2 1
2 3 2
================================
还原稀疏数组
输出还原的数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
特别感谢:
附上视频地址
狂神yyds
https://www.bilibili.com/video/BV12J41137hu?p=30