一、Array初始化
静态创建:
int[] array = {1,2,3};
动态创建:
int[] array = new int[60];
数组长度
int arrayL = array.length
二、Array内存特征
-
栈内存(Stack):主要用于执行方法,工厂的生产车间
①临时的
②存储量相对较小的
③存放main()、基本类型变量、引用类型变量、方法函数 -
堆内存(Heap):用于存储大量数据,工厂的原料仓库
①持久的
②存储量相对较大的
③存放由new创建的对象和数组
java程序执行时,首先将main函数载入栈内存,然后在栈内存中存放基本数据类型创建的变量(如int类型、float类型);而引用类型数据创建的变量存储的过程如下(以Array为例):
- 首先在堆内存中开辟出一段连续的空间,用于存储数组中的元素;
- 然后在栈内存中开辟空间存放存放该数组首元素的地址;
- 因此在这里栈内存存储机制就是引用堆存储中的数据。
注:
- 数组一旦创建,长度不可变(因为堆内存中已经定好连续的存储地址,可能后面的地址已经存储了其他数据);
- 数组存储数据增加和修改数据比较麻烦,但是根据索引查询数据非常快(查询算法为:目标元素的地址=首元素的地址+索引*数据长度),因此数据元素再多也能很快定位目标元素。
三、数组的遍历方式
- for循环遍历,利用索引直接通过数组中元素的地址来进行查询、修改元素等操作。
for(int i =0;i<array.length;i++){
System.out.println(array[i]);
}
- foreach循环,挨个取出数组中的数据存入中间变量,简化了for循环,方便查询,但同时也无法直接更改原数组元素值。
for(int a : arr ){
System.out.println(a);
}
四、数组扩容(合并和追加)、数组缩容(删除元素)
1.数组合并:
- 对于arr1和arr2两个数组长度已经确定无法改变,因此需要创建arr3
int[] arr3 = new int[arr1.length+arr2.length];
- 将arr1和arr2分别追加到arr3中
//往arr3中添加arr1
for(int i =0;i<arr1.length;i++){
arr3[i]=arr1[i];
}
//往arr3追加arr2
for(int i = 0;i<arr2.length;i++){
arr3[i+arr1.length]=arr2[i];
}
2.往数组中追加元素、插入元素:思路同上,都是创建一个中间数组。(不能直接在原数组中添加,因为长度已经固定)
3.删除元素
- 移动元素位:快,省内存,但是会有空余位;
- 创建新数组:更严谨:
五、Arrays工具类
Arrays JRE中基本类库提供的一个数组工具类
封装了 排序、查找极值、遍历输出等操作。
- Arrays.sort(arr):排序arr数组,只能升序;
Arrays.toString(arr):返回arr字符串的表达形式(快速遍历数组)。
int[] arr = {23,5,3,42,45,1,28,32};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
[1, 3, 5, 23, 28, 32, 42, 45]
- Arrays.binarySearch(arr,key):在数组中快速的查询给定元素出现的位置,必须先将arr排序(因为使用二分算法),返回值为负数表示未查询到。
int[] arr = {23,5,3,42,45,1,28,32};
//1.使用Arrays.binarySearch()需要先排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
[1, 3, 5, 23, 28, 32, 42, 45]
//2.在排序后的数组中查询
int index = Arrays.binarySearch(arr,45);
System.out.println("元素在数组中的索引"+index);
元素在数组中的索引7
二分算法查询效率高,思路如下(查找45,如果一个一个比对,需要8次,二分算法3次计算即可):
- Arrays.copyof(): 复制数组
堆内存中开辟了一段连续的地址存储arr,使用copyof就会再开辟一段新的连续的地址存储newArr,并将arr的数值赋给newArr。如果用newArr = arr直接复制,其实就是将arr存储的引用地址给了newArr,换言之,arr和newArr使用堆内存中的同一段连续地址。
int[] arr = {23,5,3,42,45,1,28,32};
int[] newArr = Arrays.copyOf(arr,5);
System.out.println(Arrays.toString(newArr));
[23, 5, 3, 42, 45]