對於切片的一些理解

2021-10-23 08:08:19 字數 2025 閱讀 8135

使用技巧

type

struct

乙個切片是由資料指標加上長度和容量組成的,類似與c++中的vector。

var

( a [

]int

// 等價於nil

b =int// 表示乙個空的切片,不等於nil

c =int// len,cap都為3的切片

d = c[:2

]// cap為3,len為2。與c共享一片記憶體位址

e = c[0:

2:cap(c)

]// cap為3,len為2。與c共享一片記憶體位址

f = c[:0

]// cap為3,len為0。

g =make([

]int,3

)// cap為3,len為3。裡面的引數都是nil

h =make([

]int,2

,3)// cap為3,len為2。裡面引數前兩個是nil

)

a =

(a,0

)a =(0

,a)

第二行是在開頭插入元素,一般會導致記憶體的重新分配,從而效能比較差。

a =

(a,0

)copy

(a[i+1:

0],a[i:])

// a[i:]向後移動乙個位置

a[i]

= x

copy可以避免多個切片拷貝的時候共享一片記憶體時進行修改導致的bug。

在對於切片進行新增的時候,會自動觸發切片的擴容的操作。

對於具體的擴容策略,最基本的是當cap小於1024時,每次翻倍。大於1024時每次變為原來的1.25倍。

但是這個策略只適用於每次增加乙個元素的情況,如果一次增加多個元素的時候,就不一定是這個擴容策略了。

並且具體的slice的型別對於cap也有關係。

package main

import

"fmt"

func

main()

a =(a,1,1

,1) fmt.

println

("cap of a is "

,cap

(a))

b :=

int b =

(b,4,5

,6) fmt.

println

("cap of b is "

,cap

(b))

c :=

int32

c =(c,2,5

,6) fmt.

println

("cap of c is "

,cap

(c))

type d struct

d :=d

,,} d =

(d, d

, d, d

) fmt.

println

("cap of d is "

,cap

(d))

}cap of a is 8

cap of b is 6

cap of c is 8

cap of d is 5

這裡面的基本原理涉及到go的記憶體管理操作,不是很懂。

a =

inta = a[

:len

(a)- n]

// 刪除尾部n個元素

a = a[n:

]// 刪除頭部n個元素

a = a[

:i+copy

(a[i:

],a[i+n:])

]// 刪除中間的n個元素

因為go的gc機制,只要存在記憶體引用,整片記憶體都不會被釋放掉。可能會降低整體的系統效能。最好是只把感興趣的資料單獨寸乙個切片。

對於java 集合的一些理解

list set繼承自collection儲存引用型別 且只能乙個乙個儲存 arraylist linkedlist vector 都是繼承自list arraylist linkedlist初始化為10 擴容後為1.5倍 vector 為2倍 arraylist 底層採用的資料結構為陣列儲存元素,...

對於多執行緒的一些理解

實現多執行緒的兩種方法 繼承thread類 實現runnable介面 jdk1.5之後提供了乙個心得callable介面 在啟動多執行緒的時候必須通過start 方法,而不能直接呼叫run 方法 原因 先來看下start 方法在thread類中的定義 public synchronized void...

對於sortBy運算元的一些理解

package day03 import org.apache.spark.ranagepartitioner採用的是 水塘抽樣 演算法,可以對資料進行相對均勻的分配 原理是,在分配之前對資料進行抽樣 與hashpartitioner不同的是,hashpartitioner是根據key取hashco...