1、数组
数组是用来存储固定大小的同类型元素的容器。
2、声明数组
-
dataType[] arrayRefVar; //首选 或 dataType arrayRefVar[]; //效果相同,但不是首选
3、创建数组
-
静态初始化
-
dataType[] arrayRefVar = new dataType[] {value0, value1, ..., valuek}; // 可以缩写成 dataType[] arrayRefVar = {value0, value1, ..., valuek};
-
-
动态初始化
-
dataType[] arrayRefVar = new dataType[arraySize];
-
一、使用 dataType[arraySize] 创建了一个数组。
-
二、把新创建的数组的引用赋值给变量 arrayRefVar。
-
4、数组元素的获取
-
直接打印数组名称会得到数组对应的内存地址哈希值
-
访问数组时是以 数组名称[索引值] 的格式
-
索引是基0的
-
public class DemoArray { public static void main(String[] args) { int[] array = {10, 20, 30}; for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } }
-
使用动态初始化时,元素会有默认值
- 整数默认值为0
- 浮点数默认值为0.0
- 字符型默认值为‘\u0000’
- 引用类型默认值为 null
5、Java內存
- 1、棧(Stack) :存放方法的局部变量,方法的运行一定在栈当中
- 局部变量:方法的参数,或者{…}内的变量
- 作用域:一旦超出作用域,立即从栈消失
- 2、堆(Heap) :凡是new出来的都在堆中
- 堆中的数据都有对应的16进制地址值
- 堆中的数据都有对应的默认值
- 整数默认值为0
- 浮点数默认值为0.0
- 字符型默认值为‘\u0000’
- 引用类型默认值为 null
- 3、方法区(Method Area) :存储.class相关信息。包含方法的信息
- 4、本地方法栈(Native Method Stack): 与操作系统相关
- 5、寄存器(PC Register)
5、数组的内存图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vQ7Xufa-1647753016141)(D:\User\15497\Desktop\2021-6-1-Java\IDEA-Project\JavaSE\JavaBasicGrammar\数组内存图.png)]
6、数组的遍历
-
double[] myList = {1.9, 2.9, 3.4, 3.5}; // 打印所有数组元素 for (int i = 0; i < myList.length; i++) { System.out.println(myList[i] + " "); }
6.1、For-Each 循环
-
public class TestArray { public static void main(String[] args) { double[] myList = {1.9, 2.9, 3.4, 3.5}; // 打印所有数组元素 for (double element: myList) { System.out.println(element); } } }
7、获取数组的长度
arrayName.length
8、Arrays 类
java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
- 具有以下功能:
- 给数组赋值:通过 fill 方法。
- 对数组排序:通过 sort 方法,按升序。
- 比较数组:通过 equals 方法比较数组中元素值是否相等。
- 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。
- 具体说明请查看下:
public static int binarySearch(Object[] a, Object key)
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。public static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此相等,则返回
true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。public static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。public static void sort(Object[] a)
对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
9、数组的练习
9.1、求数组的最值
-
public class DemoArray { public static void main(String[] args) { int[] array = new int[]{10, 20, 30, 2, 5, 9, 8, 23}; int max = array[0]; int min = array[0]; for (int i = 1; i < array.length; i++) { //假如当前元素比max还大,就互换位置 if (array[i] > max) { max = array[i]; } //假如当前元素比min还小,就互换位置 if (array[i] < min) { min = array[i]; } } System.out.println("数组最大值为:" + max); System.out.println("数组最小值为:" + min); } }
9.2、数组反转
-
1、数组反转其实就是对称元素的交换
-
2、通常遍历数组用的是一个索引:
-
int i = 0;
-
此时 表示对称位置则需要再加一个索引
int min =0; int max = array.length-1;
-
-
3、通过中间变量来交换两个变量的值
-
int a = 10; int b = 20; int temp = a; b = temp; //此时a b的值已经交换
-
-
4、何时停止交换
- 4.1、长度为基数时
min == max
- 4.2、长度为偶数时
min>max
总结:当min<max时即可交换
- 4.1、长度为基数时
-
public class DemoArray { public static void main(String[] args) { int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; System.out.println("反转前"); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } for (int min = 0, max = array.length - 1; min < max; min++, max--) { int temp = array[min]; array[min] = array[max]; array[max] = temp; } System.out.println("反转后"); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } }
9.3、数组作为方法参数
- 当调用方法时,向方法的小括号传参,传递的是数组的地址值。
- 当数组作为方法返回值时,返回的也是数组的地址值。