mysql存储map数据结构_map数据结构

Go map实现原理 - 恋恋美食的个人空间 - OSCHINA - 中文开源技术交流社区 https://my.oschina.net/renhc/blog/2208417

// A header for a Go map.

type hmap struct {

// Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.

// Make sure this stays in sync with the compiler's definition.

count int // # live cells == size of map. Must be first (used by len() builtin)

flags uint8

B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items)

noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details

hash0 uint32 // hash seed

buckets unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.

oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing

nevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated)

extra *mapextra // optional fields

}

Golang的map使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,也即bucket,而每个bucket就保存了map中的一个或一组键值对。

map数据结构由runtime/map.go:hmap定义:

type hmapstruct{

countint//当前保存的元素个数

...

B         uint8

...

bucketsunsafe.Pointer// bucket数组指针,数组的大小为2^B

...

}

下图展示一个拥有4个bucket的map:

551baa31e47f0ff66d4c45d9e5c2452b.png

本例中, hmap.B=2, 而hmap.buckets长度是2^B为4. 元素经过哈希运算后会落到某个bucket中进行存储。查找过程类似。

bucket很多时候被翻译为桶,所谓的哈希桶实际上就是bucket。

2. bucket数据结构

bucket数据结构由runtime/map.go:bmap定义:

type bmapstruct{

tophash [8]uint8//存储哈希值的高8位

databyte[1]//key value数据:key/key/key/.../value/value/value...

overflow *bmap//溢出bucket的地址

}

每个bucket可以存储8个键值对。

tophash是个长度为8的数组,哈希值相同的键(准确的说是哈希值低位相同的键)存入当前bucket时会将哈希值的高位存储在该数组中,以方便后续匹配。

data区存放的是key-value数据,存放顺序是key/key/key/…value/value/value,如此存放是为了节省字节对齐带来的空间浪费。

overflow 指针指向的是下一个bucket&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 JSP 中显示数据库中的树形结构,需要先将树形结构存储在数据库中。MySQL 中可以使用以下两种方法来实现树形结构: 1. 使用嵌套集模型(Nested Set Model):该模型将每个节点表示为一对数字,即左值和右值。每个节点都有一个左值和右值,代表该节点在树形结构中的位置。使用该模型可以方便地查询子节点和父节点,但是需要在插入、删除、移动节点时维护左值和右值的正确性。 2. 使用邻接表模型(Adjacency List Model):该模型将每个节点表示为一行记录,每行记录包含节点的 ID、父节点的 ID 和节点的名称等信息。使用该模型可以方便地查询子节点和父节点,但是查询多层子节点时需要使用递归查询,效率较低。 在 JSP 中显示树形结构可以使用递归查询进行实现。例如,可以使用 Java 的 List 和 Map 数据结构存储数据库中的树形结构,并使用递归函数将树形结构转换为 HTML 中的 ul 和 li 标签,从而实现树形结构的展示。以下是一个简单的示例代码: ``` <%@ page import="java.util.List" %> <%@ page import="java.util.Map" %> <% // 获取数据库中的树形结构并存储到 List 和 Map 中 List<Map<String, Object>> treeData = getTreeData(); Map<Integer, List<Map<String, Object>>> childMap = getChildMap(treeData); // 使用递归函数将树形结构转换为 HTML 标签 out.print("<ul>"); printTree(treeData, childMap, 0); out.print("</ul>"); // 递归函数,将树形结构转换为 HTML 标签 void printTree(List<Map<String, Object>> treeData, Map<Integer, List<Map<String, Object>>> childMap, int parentId) { List<Map<String, Object>> children = childMap.get(parentId); if (children != null) { for (Map<String, Object> child : children) { int id = (Integer) child.get("id"); String name = (String) child.get("name"); out.print("<li>" + name + "</li>"); out.print("<ul>"); printTree(treeData, childMap, id); out.print("</ul>"); } } } // 获取数据库中的树形结构 List<Map<String, Object>> getTreeData() { // TODO: 从数据库中查询树形结构并返回 } // 将树形结构存储Map 中,以便递归查询子节点 Map<Integer, List<Map<String, Object>>> getChildMap(List<Map<String, Object>> treeData) { Map<Integer, List<Map<String, Object>>> childMap = new HashMap<>(); for (Map<String, Object> node : treeData) { int parentId = (Integer) node.get("parent_id"); if (!childMap.containsKey(parentId)) { childMap.put(parentId, new ArrayList<>()); } childMap.get(parentId).add(node); } return childMap; } %> ``` 在以上代码中,getTreeData() 函数用于从数据库中获取树形结构并返回,getChildMap() 函数用于将树形结构存储Map 中以便递归查询子节点,printTree() 函数用于递归转换树形结构为 HTML 标签,并最终输出到 JSP 页面中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值