讲个大部分数据结构和算法教科书中都不会讲的问题

// …more fields…

}

不过,你可能会有疑问,既然在真实的软件开发中,数据结构和算法要处理的都是对象,那为啥书本中都可以按照拿整数(或字符串)类型,而不是对象来讲解呢?

我们知道,数据结构和算法要解决的都是”更快“、”更省“的问题。更快指代码的执行速度,更省指存储空间的消耗。

”更快“这里你先简单理解为”查找更快“,当然还有增删改以及一些统计操作,不过,都差不多,你理解了”查找“,其他的操作也就都理解了。我们在一组数据中,查找一个想要的数据的时候,都是通过某个键值(key)来查找的。

这里的键值怎么理解呢?我们拿刚刚的订单的例子来说明一下。我们希望在这组订单中,按照订单ID来快速的查找订单。那我们就把订单的ID看做键值(key),并且按照key来组织成红黑树这种数据结构。红黑树中存储的是key值和订单对象的内存地址,而订单对象本身是存储在另外的内存空间中的(像Java这种语言,就是存储在堆内存中的)。

为了方便你理解,我画了一张图,你可以对比着文字描述看下。

讲个大部分数据结构和算法教科书中都不会讲的问题

那你可能说,那我要是再想通过订单的用户ID来查找订单呢?这个时候该怎么办呢?

你就可以再以用户ID作为键值,创建另外一个红黑树。实际上,这就是我们之前文章中提到的多重索引结构。如果翻译成Java代码的话,就是下面这一个样子。

// 两个索引

private TreeMap<long, Order> id2OrderMap = new TreeMap<>();

private TreeMap<long, Order> userId2OrderMap = new TreeMap<>();

public void add(Order order) {

// order在外部创建,内存中只有一份

id2OrderMap.put(order.id, order);

userId2OrderMap.put(order.userId, order);

}

private class Order {

public long id;

public long userId;

public long createTime;

// …more fields.

}

如果画成图的话,就是下面这个样子。你会发现,订单对象是只有一份的,而索引结构有两份,一份是按照订单的ID作为键值创建的,另一份是按照订单的用户ID作为键值创建的。

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

更多JVM面试整理:

-UL5HGWZ0-1720129748329)]

更多JVM面试整理:

[外链图片转存中…(img-tPaAOPEc-1720129748329)]

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值