面试题答案
一键面试性能差异
- 数组:在Go语言中,数组一旦声明,其长度就固定不可变,无法直接进行追加元素操作。如果要模拟追加元素,需要创建一个新的更大的数组,并将原数组的内容复制到新数组中,这种操作的性能开销较大,时间复杂度为O(n),其中n是原数组的元素个数。
- 切片:切片可以灵活地追加元素。在容量足够时,追加元素操作的时间复杂度为O(1)。当容量不足时,会重新分配内存,创建一个更大的底层数组,并将原切片内容复制到新数组,此时时间复杂度为O(n),但这种重新分配内存的情况并不频繁,平均下来追加操作接近O(1)的时间复杂度,性能相对数组追加模拟操作要好很多。
差异原因
- 数组:数组的固定长度特性决定了它不能动态增长,每次模拟追加都需要手动创建新数组并复制数据,这导致了较高的性能开销。
- 切片:切片是基于数组的动态数据结构,它包含指向底层数组的指针、当前长度和容量信息。当容量足够时,直接在现有底层数组的空闲位置添加元素,效率高。当容量不足时,虽然也需要重新分配内存和复制数据,但Go语言的切片扩容策略采用了成倍增长(通常是2倍,特殊情况下有调整)的方式,减少了频繁扩容的次数,从而在整体上提升了追加元素的性能。