当前位置:   article > 正文

【语言基础】java中的Array初始化、内存特征、遍历方式、数组扩容(合并与追加)、缩容(删除元素)、Arrays工具类_java array初始化

java array初始化

一、Array初始化

静态创建:

int[] array = {1,2,3};
  • 1

动态创建:

int[] array = new int[60];
  • 1

数组长度

int arrayL = array.length
  • 1

二、Array内存特征

  • 栈内存(Stack):主要用于执行方法,工厂的生产车间
    ①临时的
    ②存储量相对较小的
    ③存放main()、基本类型变量、引用类型变量、方法函数

  • 堆内存(Heap):用于存储大量数据,工厂的原料仓库
    ①持久的
    ②存储量相对较大的
    ③存放由new创建的对象和数组

java程序执行时,首先将main函数载入栈内存,然后在栈内存中存放基本数据类型创建的变量(如int类型、float类型);而引用类型数据创建的变量存储的过程如下(以Array为例):

  1. 首先在堆内存中开辟出一段连续的空间,用于存储数组中的元素;
  2. 然后在栈内存中开辟空间存放存放该数组首元素的地址
  3. 因此在这里栈内存存储机制就是引用堆存储中的数据。

  • 数组一旦创建,长度不可变(因为堆内存中已经定好连续的存储地址,可能后面的地址已经存储了其他数据);
  • 数组存储数据增加和修改数据比较麻烦,但是根据索引查询数据非常快(查询算法为:目标元素的地址=首元素的地址+索引*数据长度),因此数据元素再多也能很快定位目标元素。

三、数组的遍历方式

  • for循环遍历,利用索引直接通过数组中元素的地址来进行查询、修改元素等操作。
for(int i =0;i<array.length;i++){
	System.out.println(array[i]);
}
  • 1
  • 2
  • 3
  • foreach循环,挨个取出数组中的数据存入中间变量,简化了for循环,方便查询,但同时也无法直接更改原数组元素值。
for(int a : arr ){
	System.out.println(a);
}
  • 1
  • 2
  • 3

四、数组扩容(合并和追加)、数组缩容(删除元素)

1.数组合并

  1. 对于arr1和arr2两个数组长度已经确定无法改变,因此需要创建arr3
int[] arr3 = new int[arr1.length+arr2.length];
  • 1
  1. 将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];
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.往数组中追加元素、插入元素:思路同上,都是创建一个中间数组。(不能直接在原数组中添加,因为长度已经固定)

3.删除元素

  1. 移动元素位:快,省内存,但是会有空余位;
    数组删除元素1
  2. 创建新数组:更严谨:
    数组删除元素2

五、Arrays工具类

Arrays JRE中基本类库提供的一个数组工具类
封装了 排序、查找极值、遍历输出等操作。

  1. 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
  • 2
  • 3
[1, 3, 5, 23, 28, 32, 42, 45]
  • 1
  1. 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
  • 2
  • 3
  • 4
[1, 3, 5, 23, 28, 32, 42, 45]
  • 1
//2.在排序后的数组中查询
int index = Arrays.binarySearch(arr,45);
System.out.println("元素在数组中的索引"+index);
  • 1
  • 2
  • 3
元素在数组中的索引7
  • 1

二分算法查询效率高,思路如下(查找45,如果一个一个比对,需要8次,二分算法3次计算即可):
二分算法思路

  1. 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));
  • 1
  • 2
  • 3
[23, 5, 3, 42, 45]
  • 1
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/730731
推荐阅读
相关标签
  

闽ICP备14008679号