mirror of
https://gitee.com/lauix/HFish
synced 2025-05-11 12:28:02 +08:00
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
package LinkedHashMap
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type LinkedHashMapNode struct {
|
|
linklistNode *LinkListNode
|
|
val interface{}
|
|
}
|
|
|
|
type LinkedHashMap struct {
|
|
linklist *LinkList
|
|
hashmap map[string]interface{}
|
|
mutex *sync.RWMutex
|
|
}
|
|
|
|
func NewLinkedHashMap() *LinkedHashMap {
|
|
return &LinkedHashMap{
|
|
linklist: NewLinkList(),
|
|
hashmap: make(map[string]interface{}),
|
|
mutex: &sync.RWMutex{},
|
|
}
|
|
}
|
|
|
|
func (this *LinkedHashMap) Lock() {
|
|
this.mutex.Lock()
|
|
}
|
|
|
|
func (this *LinkedHashMap) Unlock() {
|
|
this.mutex.Unlock()
|
|
}
|
|
|
|
func (this *LinkedHashMap) RLock() {
|
|
this.mutex.RLock()
|
|
}
|
|
|
|
func (this *LinkedHashMap) RUnlock() {
|
|
this.mutex.RUnlock()
|
|
}
|
|
|
|
func (this *LinkedHashMap) Add(key string, val interface{}) bool {
|
|
_, isExists := this.hashmap[key]
|
|
if isExists {
|
|
return false
|
|
}
|
|
|
|
linkListNode := this.linklist.AddToTail(key)
|
|
this.hashmap[key] = &LinkedHashMapNode{
|
|
linklistNode: linkListNode,
|
|
val: val,
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (this *LinkedHashMap) Get(key string) interface{} {
|
|
originLinkedHashMapNode, isExists := this.hashmap[key]
|
|
if !isExists {
|
|
return nil
|
|
}
|
|
|
|
return (originLinkedHashMapNode.(*LinkedHashMapNode)).val
|
|
}
|
|
|
|
func (this *LinkedHashMap) Len() int {
|
|
return len(this.hashmap)
|
|
}
|
|
|
|
|
|
func (this *LinkedHashMap) Remove(key string) (bool, interface{}) {
|
|
originLinkedHashMapNode, isExists := this.hashmap[key]
|
|
if !isExists {
|
|
return false, nil
|
|
}
|
|
|
|
linkedHashMapNode := originLinkedHashMapNode.(*LinkedHashMapNode)
|
|
|
|
delete(this.hashmap, key)
|
|
this.linklist.RemoveNode(linkedHashMapNode.linklistNode)
|
|
return true, linkedHashMapNode.val
|
|
}
|
|
|
|
func (this *LinkedHashMap) GetLinkList() *LinkList {
|
|
return this.linklist
|
|
} |