JAVA数组
一、数组声明创建
数组是相同类型数据的有序集合;
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成;
其中,每个数据称作一个数组元素,每个数组元素可以通过一个下标来访问。
public static void main(String[] args) {
// 变量的类型 变量名 = 变量值
// 数组类型 数组名 = 数组的值
int[] nums; //声明数组,首选
nums = new int[10]; // 创建数组,可以存放10个int类型的数据
// int[] nums=new int[10];
// 赋值
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
// 计算所有数据的和
int sum =0;
for (int i = 0; i < nums.length; i++) {
sum+=nums[i];
}
System.out.println("总和"+sum);
}
内存分析
当声明一个数组之后会在栈中申请一块内存,在进行new时,会在堆中申请数组的具体大小内存,内存里存放赋值数据。当使用下标进行取值时,注意下标的大小,超出范围,会报数组下标越界的错误。
三种初始化
数组的四个基本特点
- 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型。数组对象本身是在堆中的。
数组边界
二、数组使用
For-Each 循环/数组作方法入参/数组作返回值
public static void main(String[] args) {
int[] arrays={1,2,3,4,5};
// for (int array : arrays) { //没有下标,比较适合查询遍历
// System.out.println(array);
// }
// printArray(arrays);
int[] recerse=reverseArray(arrays);
printArray(recerse);
}
//打印数组元素
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]+" ");
}
}
//反转数组
public static int[] reverseArray(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;
}
三、多维数组
public static void main(String[] args) {
//[4][2] 四行两列
int[][] arrays={{1,2},{2,3},{3,4},{4,5}};
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
System.out.print(arrays[i][j]+" ");
}
}
}
四、Arrays类
public static void main(String[] args) {
int[] nums={25,1546546,156,15,2,23};
//数组的打印
System.out.println(nums);
System.out.println(Arrays.toString(nums));
PrintNums(nums);
//数组的排序
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
//数组的填充
Arrays.fill(nums,0);//用0进行填充
Arrays.fill(nums,2,4,0);//也可以对于指定的位置进行填充,当前是2-4位置进行用0填充
System.out.println(Arrays.toString(nums));
}
//模仿toString方法的输出
public static void PrintNums(int[] arr){
for (int i = 0; i < arr.length; i++) {
if(i==0){
System.out.print("[");
}
if(i== arr.length-1){
System.out.println(arr[i]+"]");
}else{
System.out.print(arr[i]+", ");
}
}
}
五、冒泡排序★★★★★
//冒泡排序
//比较数组中相邻的两个数据,如果第一个比第二个数字大,我们就交换他们的位置
//每一次交换,都会产出一个最大或者最小的数字;
//下一轮则可以少一次排序
//依次循环,直到结束
public static void main(String[] args) {
int[] arrays = {45, 1265, 46, 15, 216, 5, 38, 56, 1};
System.out.println(Arrays.toString(sortBetter(arrays)));
}
public static int[] sort(int[] arrays) {
int temp = 0;
for (int i = 0; i < arrays.length - 1; i++) {//外层循环控制循环次数
for (int j = 0; j < arrays.length - 1 - i; j++) {//内层循环控制数字的比较
if (arrays[j + 1] > arrays[j]) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
}
}
}
return arrays;
}
//优化版,减少不需要进行的排序,如果没有交换变换,直接退出循环
public static int[] sortBetter(int[] arrays) {
int temp;
boolean flag = false; //通过flag标识符减少没有意义的比较
for (int i = 0; i < arrays.length - 1; i++) {//外层循环控制循环次数
for (int j = 0; j < arrays.length - 1 - i; j++) {//内层循环控制数字的比较,如果第一个数比第二个数小,则交换位置
if (arrays[j + 1] > arrays[j]) {
temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
flag = true;
}
}
if (flag == false) { //flag为false,代表没有进行交换,则直接退出循环
break;
}
}
return arrays;
}
六、稀疏数组
public static void main(String[] args) {
//创建稀疏矩阵
int[][] arr1=new int[11][11];
arr1[1][2]=1;
arr1[2][3]=2;
//输出稀疏矩阵
System.out.println("输出稀疏矩阵");
for (int[] ints : arr1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
//转换为稀疏数组
//遍历查询稀疏矩阵中的有效数据的个数
int sum=0;
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
if(arr1[i][j]!=0){
sum++;
}
}
}
System.out.println("非0个数为:"+sum);
//首先创建一个稀疏数组的数组
int[][] arr2=new int[sum+1][3];
//填充稀疏数组的第一行数据
arr2[0][0]=11;
arr2[0][1]=11;
arr2[0][2]=sum;
//依次填入稀疏数组的后续内容
//遍历原稀疏矩阵,把非0有效数据进行存储
int count=0;//记录稀疏数组的行数
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
if(arr1[i][j]!=0){
count++;
arr2[count][0]=i;
arr2[count][1]=j;
arr2[count][2]=arr1[i][j];
}
}
}
System.out.println("=========================");
System.out.println("输出稀疏数组");
//输出稀疏数组
for (int[] ints : arr2) {
System.out.print(ints[0]+"\t"+ints[1]+"\t"+ints[2]);
System.out.println();
}
//还原
int[][] arr3=new int[arr2[0][0]][arr2[0][1]];
for (int i = 1; i < arr2.length; i++) {
arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];
}
//打印还原的稀疏矩阵
System.out.println("=========================");
System.out.println("输出还原的稀疏矩阵");
for (int[] ints : arr3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}