栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Slice

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Slice

Slice
  • 实现原理数据结构
type slice struct{
    array unsafe.Pointer			//指向底层数组
    len 	int						//切片长度
    cap		int						//底层数组的容量
}
  • 切片操作

    1. 使用make()创建slice,可以同时指定长度和容量,创建时底层会分配一个数组,数组的长度即为容量。

    2. 使用数组创建切片,使用数组创建slice时,slice将与原数组共用部分内存

      array := [10]int
      slice := array[5:7]  
      len(slice) = 2  
      cap(slice) = 5
      

      数组和数组的切片共享底层存储空间这是使用过程中需要额外注意的地方

  • slice扩容

    ​ 扩容实际上时重新分配一块更大的内存,将原slice的数据拷贝进新slice,然后返回新slice,扩容后在将数据追加进去;

    ​ 扩容只关心容量,追加数据由append在扩容结束后完成。

    • 扩容规则:
      1. 如果原slice的容量小于1024,则新的slice的容量扩大为原来的2倍
      2. 如果原slice的容量大于或等于1024,则新slice的容量将扩大为原来的1.25倍
  • slice拷贝

    ​ 使用copy()内置函数拷贝两个切片时,会将源切片的数据逐个拷贝到目的切片指向的数组中,拷贝数量取两个切片长度的最小值。

    ​ 也就是说拷贝过程不发生扩容

  • 小结

    1. 每个切片指向一个底层数组
    2. 每个切片都保存了当前切片的长度,底层数组的可用容量
    3. 使用len()和cap()时间复杂度都为O(1)
    4. 通过函数传递切片时,不会拷贝整个切片,因为切片本身只是一个结构体
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/287962.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号