首页 > TAG信息列表 > newCap

golang slice 错误认知

很多人在博客看到 slice 扩容策略如下 当大于 1024 则1.5倍 大于1024则两倍 这个结论是错误的 a:= []int{1,2} a= append(a,3,4,5) // 如果是2倍应该 容量是8 但是实际 5 ####### 查阅源码 runtime/slice.go func growslice(et *_type, old slice, cap int) slice {

HashMap的put方法的扩容流程

    final Node<K,V>[] resize() { // [1,2,3,4,5,6,7,8,9,10,11,,,,] Node<K,V>[] oldTab = table; // 16 int oldCap = (oldTab == null) ? 0 : oldTab.length; // 12 int oldThr = threshold; int n

go_day02数组和切片

数组长度是数组类型的一部分 数组的定义 //声明 var a1 [3]int fmt.Print(a1) //赋值,注意要加上长度和类型 a1 = [3]int{1, 2, 3} //函数中的方法1 a2 := [3]int{1, 2, 3} //函数中的方法2 a3 := [...]int{1, 3, 4} //函数中的方法3,使用索引 a4 := [5]int{0: 1, 4: 5} fmt.Print(a

07_Go语言 ( 切片)

本文主要介绍Go语言中切片(slice)及它的基本使用。 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 例如: func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ sum = sum + v } return sum } 这个求和函数只

HashMap浅析三:扩容

前面分析了为什么HashMap的容量是2的n次幂,以及HashMap的容量初始化。在分析容量初始化的时候有提到一个装载因子。 那么这个装载因子是什么呢?还是通过源码来看看。 /** * The load factor used when none specified in constructor. */ static final floa

HashMap之resize方法

         hashmap的resize方法在初始化或者扩容的时候会调用。主要包含扩容(扩大容量capacity和threshold)及迁移元素两个过程。          迁移元素时,是先分裂链表或者红黑树,然后批量迁移。           /** * Initializes or doubles table size. If null,

Java8 HashMap 扩容之后旧元素存放位置

Java8 HashMap 扩容之后旧元素存放位置 根据源码可看出,java 在扩容的时候会新建一个新的 Node<K,V>[] 来存放扩容之后的值,并将旧有的Node数组置空; 至于旧有值移动到新的节点的时候存放于哪个节点,Java 是根据 (e.hash & oldCap) == 0 来判断的: ① 等于0时,则将该节点放到新数组时

Golang之深入剖析slice

前言 slice 是一种基于数组实现的轻量级数据结构,在源码(https://github.com/golang/go/blob/master/src/runtime/slice.go)中定义如下: type slice struct { array unsafe.Pointer len int cap int } 从定义中可以看到,slice是一种结构体类型,里面有3个元素。array是数组指针,它

Java HashMap 扩容过程分析

  1 final Node<K, V> resize(){ 2 3 // 用于存储重新散列后的数组 4 Node<K, V>[] newTab; 5 6 // 如果原来的数组是空的,则resize执行的是初始化操作,而不是扩容操作 7 if(table == null){ 8 // 初始容量为16 9 int ca

HashMap 源码阅读(1)

HashMap 源码阅读(1) 预备知识 二叉树 1. 左子树上,所有节点的值均小于或等于它的根节点的值 2. 右子树上,所有节点的值均大于或等于它的根节点的值 3. 左右子树,符合1和2 红黑树 Red-Black Tree,红黑树,一种自平衡的二叉查找树 节点是红色或黑色 根节点是黑色 所有叶子节点,都是

HashMap源码之resize()方法

/** * 这个方法是基于当前桶中所有元素的数量进行计算的使用阈值为threshold.它不同于链表转化到tree时的链表长度(可以理解为树的高度)阈值TREEIFY_THRESHOLD */ final Node<K,V>[] resize() { //----------------------------------- 新容量与阈值计算 --------------------