Java数组(知识点+练习+扩展+算法)
- 👨💻作者简介: 大家好,我是小火车~~,在校大二学生一枚
- 🛳️个人主页: 嘟嘟嘟的小火车的博客
- 📗系列专栏: 本文写在《java从0到1》专栏
- ✉️如果文章知识点有错误的地方,请指正! 和大家一起学习一起进步🎈
- 🔥如果觉得博主的文章还不错的话,请👍三连支持👍一下博主哦
java数组
-
- 一.数组概述
- 二.数组声明创建
- 三.数组使用
- 四.多维数组
- 五.Arrays类
- 六.稀疏数组
- 七.扩展
-
- 内存分析
- 冒泡排序
- 其他专栏
一.数组概述
数组描述的是相同类型的若干个数据,按照一定的先后次序排列而成.
每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们
数组的四个基本特点
-
其长度是固定的.数组一旦被创建,它的大小就是不可以改变的
-
其元素必须是相同类型,不容许出现混合类型
-
数组中的元素可以是任何数据类型,包括基本类型,包括基本类型和引用类型
-
组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
数组本身就是对象,Java对象是在堆中的,因此数组无论保持原始类型还是其他数据类型
二.数组声明创建
声明数组
datatype[] arrayRefVar;
int[] numbers;// 首选声明方法
datatype arrayRefVar[];
int numbers[];//也可以不推荐
创建数组
dataType[] arrayRefVar = new dataType[arraySize];
numbers = new int[5];
同时声明创建数组
int[] numbers = new int[5];
- 数组的元素是通过索引访问的,数组索引从0开始.
- 获取数组的长度: arrays.length
三种初始化
- 静态初始化
int[] a = {1,2,3,4};
- 动态初始化
numbers[0] = 1;numbers[1] = 2;numbers[2] = 3;numbers[3] = 4;numbers[4] = 5;
- 默认初始化 int数组默认值为0
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方法被隐式初始化.
int[] numbers = new int[10];numbers[0] = 1;numbers[1] = 2;numbers[2] = 3;numbers[3] = 4;numbers[4] = 5;System.out.println(numbers[5]);
数组边界
下标的合法区间:[0,length-1]
如果越界会报错:ArrayIndexOutBountsException:数组下标越界异常
练习 计算数组中元素的和
public class Demo01 { public static void main(String[] args) { int[] numbers = new int[5]; numbers[0] = 1; numbers[1] = 2; numbers[2] = 3; numbers[3] = 4; numbers[4] = 5; int sum = 0; for (int i = 0;i < numbers.length;i++){ sum += numbers[i]; } System.out.println(sum); }}
三.数组使用
普通for循环
//练习 计算数组的和public class Demo01 { public static void main(String[] args) { int[] numbers = new int[5]; numbers[0] = 1; numbers[1] = 2; numbers[2] = 3; numbers[3] = 4; numbers[4] = 5; int sum = 0; for (int i = 0;i < numbers.length;i++){ sum += numbers[i]; } System.out.println(sum); }}
For-Each循环
//练习 计算数组的和public class Demo02 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; for (int i : arrays) { System.out.println(i); } }}
数组作方法参数
//练习 打印数组元素public class Demo02 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; printArray(arrays); } public static void printArray(int[] arrays){ for (int i = 0;i < arrays.length;i++){ System.out.println(arrays[i]); } }}
数组作返回值
//练习 将数组元素顺序倒置public class Demo03 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; printArray(reverse(arrays)); } public static int[] reverse(int[] arrays){ int[] result = new int[arrays.length]; //for (int i = 0;i < arrays.length;i++){ // result[(arrays.length-1)-i] =arrays[i]; //} for (int i = 0,j = arrays.length-1;i < arrays.length;i++,j--){ result[j] = arrays[i]; } return result; } public static void printArray(int[] arrays){ for (int i = 0;i < arrays.length;i++){ System.out.println(arrays[i]); } }}
四.多维数组
多维数组
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组.
二维数组
int[][] a = new int[2][5];
int[][] arr = {{1,2},{2,3},{3,4},{4,5}};
public class Demo04 { public static void main(String[] args) { int[][] arr = {{1,2},{2,3},{3,4},{4,5}};//一个特殊的一维数组,其每一个元素都是一个一维数组. System.out.println(arr[0][0]); System.out.println(arr[1].length); }}
练习:打印二维数组中的值
public class Demo04 { public static void main(String[] args) { int[][] arr = {{1,2},{2,3},{3,4},{4,5}}; for (int i = 0;i < arr.length;i++){ for (int j = 0;j < arr[i].length;j++){ System.out.print(arr[i][j]); } } }}
五.Arrays类
数组工具类Java.util.Arrays
-
由于数组对象本身没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基础的操作.
-
Arrays类中方法都是static修饰符修饰的静态方法,在使用时可以直接使用类名进行调用,而不用
(不用而不是不能)
使用对象来调用
打印数组
import java.util.Arrays;public class Demo05 { public static void main(String[] args) { int a[] = {1,2,5,123,15,2,4}; //[I@448139f0 一个对象 System.out.println(a); //打印数组 System.out.println(Arrays.toString(a)); //相同效果的方法 printArray(a); } public static void printArray(int[] arrays){ for (int i = 0;i < arrays.length;i++){ if(i==0){ System.out.print("["); } if (i==arrays.length-1){ System.out.print(arrays[i]); System.out.print("]"); }else { System.out.print(arrays[i]+", "); } } }}
数组排序
import java.util.Arrays;public class Demo06 { public static void main(String[] args) { int a[] = {1,2,5,123,15,2,4}; //数组升序 Arrays.sort(a); System.out.println(Arrays.toString(a)); }}
填充数组
import java.util.Arrays;public class Demo06 { public static void main(String[] args) { int a[] = {1,2,5,123,15,2,4};//数组元素全都填充为0 Arrays.fill(a,0); System.out.println(Arrays.toString(a)); }}
import java.util.Arrays;public class Demo06 { public static void main(String[] args) { int a[] = {1,2,5,123,15,2,4};//数组下标2到下标为4的元素填充为0 [2,4)左闭右开 Arrays.fill(a,2,4,0); System.out.println(Arrays.toString(a)); }}
比较数组:通过equals方法比较数组中元素值是否相等.
六.稀疏数组
当二维数组大多数是0或同一个值的时候,就可以用稀疏数组来保存该数组
- 记录数组一共几行几列,有多少个不同的值
- 把具有不同值的元素行和列以及值记录在一个小规模的数组中,从而缩小程序的规模
public class Demo08 { public static void main(String[] args) { int[][] arrays= new int[10][10]; arrays[1][3] = 5; arrays[5][8] = 3; arrays[1][6] = 9; //打印原来的数组 for(int i = 0;i < arrays.length;i++){ for (int j = 0;j < arrays[i].length;j++){ System.out.print(arrays[i][j]+"\t"); } System.out.println(); } //计算数组中有多少个值不同 int num = 0; for(int i = 0;i < arrays.length;i++){ for (int j = 0;j < arrays[i].length;j++){ if(arrays[i][j]!=0){ num++; } } } System.out.println(num); //创建稀疏数组 int[][] xs =new int[num+1][3]; xs[0][0] = 10; xs[0][1] = 10; xs[0][2] = num; num = 1; //把不同的值的i,j以及值存到稀疏数组中 for(int i = 0;i < arrays.length;i++){ for (int j = 0;j < arrays[i].length;j++){ if(arrays[i][j]!=0){ xs[num][0] = i; xs[num][1] = j; xs[num][2] = arrays[i][j]; num++; } } } //打印稀疏数组 for(int i = 0;i < xs.length;i++){ for (int j = 0;j < xs[i].length;j++){ System.out.print(xs[i][j]+"\t"); } System.out.println(); } }}
七.扩展
内存分析
1.声明数组时
int[] array;
2.创建数组时
array = new int[8];
3.数组元素赋值时
array[0] = 1;array[1] = 2;array[2] = 3;array[3] = 4;array[4] = 5;
冒泡排序
1.比较数组中两个相邻的元素,如果第一个数比第二个大,我们就交换他们的位置
2.每一次比较,都会产生一个最大或者最小的数字
3.下一轮则可以少一次排序
4.依次循环,直到结束
import java.util.Arrays;public class Demo07 { public static void main(String[] args) { int a[] = {1,2,5,123,15,2,4}; a = paixu(a); System.out.println(Arrays.toString(a)); } public static int[] paixu(int[] arrays){ for (int i = 0;i<arrays.length-1;i++){ for (int j = 0;j < arrays.length-1-i;j++){ if(arrays[j]>arrays[j+1]){ int b = arrays[j+1]; arrays[j+1] = arrays[j]; arrays[j] = b; } } } return arrays; }}
这个算法的时间复杂度为O(n2).
其他专栏
❤️《编程相关技能》专栏
🧡《HTML5》专栏
💛《CSS3》专栏
💚《java从0到1》专栏
💙《英语语法》专栏