java红黑树代码 java红黑树实现

java map .put 方法

Map.Put方法原理:

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、做网站、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的曲麻莱网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

Map将对象table赋值给tab,并以tab是否为空作为是否第一次调用此方法的判断,是则resize()并给tab,n赋值;

获取tab的第i个元素:根据 (n - 1) hash 算法 ,计算出i找到,如果为空,调用newNode() ,赋值给tab第i个;

如果不为空,可能存在2种情况:hash值重复了,也就是put过程中,发现之前已经有了此key对应的value,则暂时e = p;

至于另外一种情况就是位置冲突了,即根据(n - 1) hash算法发生了碰撞,再次分情况讨论;

1、以链表的形式存入;

2、如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树;

3、最后,如果e不为空,将e添加到table中(e.value 被赋值为 putVal()中的参数 value);

扩展资料:

HashMap存储键值对时,发现找到的位置上已经存储了元素。

情况一:调用该元素键的equals方法与该位置上元素的键进行比较,如果返回ture,则视新键与已经存在的键相同,用新值去更新旧值,然后put方法返回旧值。

情况二:调用该元素键的equals方法与该位置上元素的键进行比较,如果返回false,则新键与已经存在的键不相同,任然可以将新的元素存储在该位置。

HashMap的put()方法返回null的特殊情况:

要是已经存在键的映射,但是值是null,那么调用put()方法再更新键的值时,put()方法会把旧值null返回,这是返回null的特殊情况。存在元素时,要是找到的位置上没有键的映射,put()方法也是返回null。

参考资料:Map (Map接口)_百度百科

Java中,一个类维护了另外一个类中的对象,这句话的维护是啥意思

可以这样理解,就是一个类中持有一个类的引用。比如栈实际上持有一个数组的引用,对数据的操作都是通过这个数组来操作的,缓存类一般都会持有一个HashMap的对象,也叫做维护这个对象。TreeMap中维护着一个红黑树,我给你写个代码你就理解了:

import java.util.HashMap;

public class CachedClass {

private HashMapString, String cache; //持有HashMap的对象

public void init(){

cache=new HashMapString, String();//初始化

}

public void put(String key,String value){

cache.put(key, value); //实现缓存放入的功能

}

public void clear(){

cache.clear(); //实现删除的功能

}

public String get(String key){ //直接从缓存中取

String res= "";

if (cache.get(key)!=null) {

 res = cache.get(key);

}

return res;

}

}

仔细看这样一个例子,这样做的目的就是操作数据实际上是通过引入的那个类来实现的,你看所有的方法其实封装的都是引入类的方法,这样也是引入它的目的。java中这样的情况很常见,比如各种设计模式,一般会维护一个接口,然后方法实际调用的时候去调用的是接口的实现类的方法!

在linux操作系统内核实现里经常使用的红黑树

在linux操作系统内核实现里经常使用的红黑树如下:

二叉树,按中序遍历后为一递增数组,自平衡意味着树的高度有一个上限,对于红黑树,其为2log(n+1),所以时间复杂度为最差为Olog(n)。

赋予二叉搜索树自平衡特性的方法有多种,红黑树通过一下4条约束实现自平衡:

Every node is either red or black.

All NIL nodes (figure 1) are considered black.

A red node does not have a red child.

Every path from a given node to any of its descendant NIL nodes goes through the same number of black nodes.

其中根节点为黑色。

红黑树的搜索与二叉搜索树无异,但是插入和删除可能会违背上述四条原则。需要用到左旋右旋操作。左旋右旋上图,可以看到左旋右旋本身不改变二叉搜索树的特性,旋转后必要时改变节点的颜色可消除插入或者删除带来的红冲突和黑冲突,有时红黑树的重新平衡需要迭代进行。

红黑树比较适合的应用场景:

需要动态插入、删除、查找的场景,包括但不限于:

某些数据库的增删改查,比如select * from xxx where 这类条件检索。

linux内核中进程通过红黑树组织管理,便于快速插入、删除、查找进程的task_struct。

linux内存中内存的管理:分配和回收。用红黑树组织已经分配的内存块,当应用程序调用free释放内存的时候,可以根据内存地址在红黑树中快速找到目标内存块。

hashmap中(key,value)增、删、改查的实现;java 8就采用了RBTree替代链表。

Ext3文件系统,通过红黑树组织目录项。


分享名称:java红黑树代码 java红黑树实现
分享URL:http://pwwzsj.com/article/ddohdjd.html