目录
数组的定义和使用:
数组的初始化:
遍历数组:
数组是引用类型
初始JVM的内存分布
再读引用变量
认识null
数组的应用场景
作为函数的参数
作为函数的返回值
数组练习
数组转字符串
排序
冒泡排序
数组逆序
数组求平均值
数组的定义和使用:
数组是一块连续的内存,用来存储相同类型的数据
数组名.length:
int[] array3 = new int[10];//默认全部初始化为0
System.out.println(array3.length);//数组长度
int n = 10;
int[] array4 = new int[n];//
数组的初始化:
数组的初始化主要分为动态初始化以及静态初始化
- 动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array3 = new int[10];//默认全部初始化为0
- 静态初始化:在创建数组时不直接指定数组元素个数,而是直接将具体的数据内容进行指定
int[] array = {1, 2, 3, 4};//简化形式
//int array2[]={1,2,3,4};//不推荐
int[] array2 = new int[]{1, 2, 3, 4};
new是一个关键字,一般用来new对象,即数组是一个对象,Java当中一切皆对象
int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20,30};
// 注意省略格式不可以拆分,否则编译失败
// int[] array3:
// array3 = {1, 2, 3};
int[] array = null;//小写
System.out.println(array);
如果数组中存储元素类型为引用类型,默认值为null
遍历数组:
//增强for循环 for-each循环
for (int x : array2) {System.out.print(x + " ");
}
遍历这个数组的时候,把数组当中的元素赋值给x
数组是引用类型
初始JVM的内存分布
- 程序运行时代码需要加载到内存
- 程序运行产生的中间数据要存放在内存
- 程序中的常量也要保存
- 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁
如果堆内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦
因此JVM对所使用的内存按照功能的不同进行了划分:
再读引用变量
认识null
public static void main(String[] args) {int[] array = null;//一个不指向对象的引用System.out.println(array.length);
}
array当前不指向任何对象,因此没有长度,不能对这个内存进行任何读写操作,一旦尝试读写,就会出现异常
注意:JAVA中并没有约定null和0号地址的内存有任何关联
对象不能指向对象,只有引用可以指向对象
数组的应用场景
作为函数的参数
public static void main(String[] args) {int[] array = {1, 2, 3, 4};fun(array);for (int x : array) {System.out.print(x + " ");} }public static void fun(int[] array) {array = new int[]{11, 22, 33, 44, 55};//重新在堆中开辟了地址}
结果:
只是修改了形参的指向
作为函数的返回值
public static void main(String[] args) {int[] array = getArray();System.out.println(array[0]);
}
public static int[] getArray() {int[] arr = {1,2,3,4,5,6};return arr; // return 返回数组,返回的是数组内存中地址
}
数组练习
数组转字符串
import java.util.Arrays;public class Shift {public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};System.out.println(Arrays.toString(array));}
}
排序
import java.util.Arrays;public class Shift {public static void main(String[] args) {int[] array = {21, 12, 13, 54, 5};System.out.println(Arrays.toString(array));//打印// Arrays.sort(array);//自动排序Arrays.sort(array, 0, 2);//区间排序[0,2)——>0,1System.out.println(Arrays.toString(array));}
}
开发效率很高!
import java.util.Arrays;public class Shift {public static void main(String[] args) {int[] array = {21, 12, 13, 54, 5};System.out.println(myToString(array));//打印// Arrays.sort(array);//自动排序Arrays.sort(array, 0, 2);//区间排序[0,2)——>0,1System.out.println(myToString(array));int[] array2 = {};System.out.println(Arrays.toString(array2));//[]}public static String myToString(int[] array) {//相当于Arrays.toStringif (array == null) {return "null";}if (array.length == 0) {return "[]";}String ret = "[";for (int i = 0; i < array.length; i++) {ret += array[i];if (i != array.length - 1) {ret += ", ";}}ret += "]";return ret;}}
冒泡排序
public class bubbleSort {public static void bubbleSort(int[] array) {//i代表趟数for (int i = 0; i < array.length - 1; i++) {//已经优化了,每次比上次少1个boolean flg = false;for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]) {int tmp = array[j];array[j] = array[j + 1];array[j + 1] = tmp;flg = true;}}if (!flg) {//没有交换,进一步优化return;}}}
数组逆序
public class Reverse {public static void reverse(int[] array) {if (array == null) {return;}int i = 0;int j = array.length - 1;while (i < j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;i++;j--;}}public static String myToString(int[] array) {if (array == null) {return "null";}if (array.length == 0) {return "[]";}String ret = "[";for (int i = 0; i < array.length; i++) {if (i != array.length - 1) {ret += (array[i] + "," + " ");} else {ret += array[i];}}return ret += "]";}public static void main(String[] args) {int[] array = {1, 2, 3, 4};reverse(array);System.out.println(myToString(array));}
}
数组求平均值
public class Average {public static void main(String[] args) {int[] arr = {1, 2, 3, 4};System.out.println(avg(arr));}public static double avg(int[] arr) {int sum = 0;for (int x : arr) {sum += x;}return (double) sum / (double) arr.length;}
}