目录
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.计算时间复杂度的规则
不考虑必要操作(循环、初始化赋值,程序的加载)
不考虑常数项
不考虑低次项