C#list数组原理?
C#中的List是一种动态数组类型,它可以存储任意类型的元素,并且可以根据需要动态地调整数组大小,不需要手动管理内存。
List的底层实现是一个数组,当元素数量超过当前数组大小时,List会自动创建一个更大的数组,并将原来的元素复制到新数组中。这个过程称为扩容。
List还提供了很多常见的操作方法,如添加、删除、插入、查找等,使得使用List非常方便。因此,List是C#中非常常用的数据结构之一。
map扩容为什么是2倍?
map计算添加元素的位置时,使用的位运算,这是特别高效的运算;另外,HashMap的初始容量是2的n次幂,扩容也是2倍的形式进行扩容,是因为容量是2的n次幂,可以使得添加的元素均匀分布在HashMap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询效率降低。
map的默认长度是数组长度还是链表长度?
在通常情况下,Map的默认长度是根据数组的长度来确定的。在Java中,HashMap使用数组和链表结合的方式来存储数据,当数据量达到一定程度时会触发扩容操作。
具体的扩容策略是在HashMap的构造方法中确定的,默认长度是16,当达到一定阈值时会进行扩容,这个阈值是根据负载因子和当前数组长度来计算的。
因此,在大多数情况下,Map的默认长度是根据数组的长度来确定的,而链表长度在初始时是空的。
golang切片扩容时底层内存地址是连续的么?会不会出现不连续的情况?
一定是连续的。slice 底层数组,数组寻址是通过连续的地址空间的。所以,一定是连续的,因此 append 时候,有可能出现 copy 的情况,代价是比较高的。我一般比较建议,尽可能猜测可能的容量, 提前分配,避免扩容。

