当前位置: 代码迷 >> 综合 >> corejava基础篇-知识点总结三(数组)
  详细解决方案

corejava基础篇-知识点总结三(数组)

热度:96   发布时间:2024-02-22 02:27:59.0

目录

1.数组和链表优缺点,使用哪种好?

2.数组扩容的三种实现方法

3.System.arraycopy()和Arrays.copyOf的异同点

4.一维数组、二维数组和三维数组

5.可变参数

6.计算时间复杂度的规则


1.数组和链表优缺点,使用哪种好?

数组:

优点:选址效率高,可以通过首地址+偏移量快速查询到某一元素,选址时间复杂度为O(1)

缺点:对内存要求高,不利于执行插入和删除操作,因为要进行内存的搬移

链表:

优点:通过节点来保存数据,适合进行大量的数据插入和删除操作,不涉及内存的搬移

缺点:寻址效率低,不适合进行查询,如果要查询的话,每一个元素都需要从首节点开始顺次查询

数组和链表没有意义上的优劣之分,存在即合理,使用哪一种,要结合需求做具体的分析

如果需要进行查询操作,使用数组,因为它的选址效率高,可以通过首地址+偏移量快速查询到某一元素

如果需要进行数据的插入和删除操作,使用链表,因为不涉及内存的搬移

面试题:下列代码是否合法?

int[] array = new int[5] {10, 20, 30, 40, 50};

不合法:int[]array=new int[5]{}和int[]array=new int[]{10,20,30,40,50}只能两者选择其一

 

2.数组扩容的三种实现方法

手动编码实现复制过程

int[] array = new int[] {10, 20, 30, 40, 50};
int[] newArray = new int[array.length + 5]; // 比原数组长度多5
// 遍历旧数组,将每个元素都放到新数组指定位置
for (int i = 0; i < array.length; i++) {newArray[i] = array[i];    
}
array = newArray;	// 将新数组赋值给旧数组

 

System.arraycopy()

参数1:原数组

参数2:原数组的开始位置

参数3:新数组

参数4:新数组开始位置

参数5:原数组的长度

int[] array = new int[] {10, 20, 30, 40, 50};
int[] newArray = new int[array.length + 5]; // 比原数组长度多5
System.arraycopy(array, 0, newArray, 0, array.length);

 

Array.copyOf()

参数1:原数组

参数2:新数组长度

int[] array = new int[] {10, 20, 30, 40, 50};
int[] newArray = Arrays.copyOf(array, 10);

 

3.System.arraycopy()和Arrays.copyOf的异同点

联系:System.arraycopy()是使用native修饰的本地方法,没有java实现,调用它,只需要直接调用底层C++函数实现数组的复制即可,效率较高

ArrayCopyOf()实际上方法内部也是调用System.arraycopy()方法来实现的,只不过它需要在java中再调用一次实现,所以执行效率会略低 

区别:Arrays.copyOf()会自动给我们创造目标数组,并且返回,而System.arraycopy()需要我们手动创建

Arrays.copyOf()参数较少,调用比较简单,但有局限性,复制元素的开始位置以及存放目标的开始元素都是固定的,不可修改,默认都是0,而System.arraycopy()方法参数较多,调用较为复杂 ,但功能更为强大,使用起来更加灵活

4.一维数组、二维数组和三维数组

一维数组:平房,只有一层

二维数组:楼房,有几层,几号两个维度

二维数组:好几栋楼房,有哪栋,几层,几号三个维度

5.可变参数

参数的个数是可变的

常规的参数列表,必须声明参数的个数、类型、顺序

而可变参数参数可以在参数类表中声明若干相同类型的参数

注:参数列表里可以同时定义固定参数和可变参数,但是可变参数必须得放在最后,并且只能有一个

6.计算时间复杂度的规则

不考虑必要操作(循环、初始化赋值,程序的加载)

不考虑常数项

不考虑低次项