analyse de code source Java Collections Framework (5.1 - Carte, TreeMap, arbre rouge-noir)
Map
connaissances liées Design Java Collections Framework dans plus de structures de données, que ce soit au travail ou à des entrevues seront souvent impliqués. En apprenant Map
le code source, nous avons pu une connaissance approfondie et la compréhension des structures de données, une grande partie des compétences de codage. Dans les prochains articles introduiront une certaine connaissance des structures de données, j'espère que vous ne vous ennuierez pas, parce que cette partie de la capacité est utilisée comme compétences de base programmeur. À la connaissance même temps de cette partie est en fait pas si profonde, je vais essayer de vous aider avec la manière la plus simple à comprendre.
carte Interface
Map
Caractéristiques de la structure de données est claire, il nous permet d'utiliser de stockage de clés et de lire des éléments, et ne permet pas de clé en double. Différentes Map
mises en œuvre pour la clé de traitement séquentiel est incompatible. Par exemple, HashMap
nous ne pouvons pas garantir l'ordre de la clé et TreeMap
la clé est mis en œuvre conformément à Comparator
la méthode d'interface pour déterminer l'ordre.
Map
Sur chacun définit également des données de valeur clé correspondante doit implémenter Entry
l'interface, la méthode définie ci - dessus est également très simple, essentiellement l'opération pour la clé et la valeur.
Map
La méthode définie sur l'interface, nous devrions tous être plus familier avec, je ne suis pas ici de longue haleine. En particulier, je mentionnerai plusieurs méthodes JDK8 ajouté, plus pratiques dans leur travail quotidien. Si vous ne rencontrez pas JDK8 avant, vous pouvez trouver.
* `getOrDefalut(Object key, V defaultValue)`:当 `Map` 中有 key 对应的 value 时返回 `Map` 中的 value, 否则返回 `defaultValue` 。
* `V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)`:将 `Map` 中的 key 和对应的 value 作为参数,调用 `remappingFunction` 方法获得 newValue,如果 newValue 不为 null,则替换原来的 value。
* `V putIfAbsent(K key, V value)`:如果当前 `Map` 中没有 key 对应的 value,则执行 put 操作。
* `V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)`:如果当前没有 key 对应的 value,则将参数 value 放入 `Map` 中,否则将原来 key 对应的 value 和新的 value 作为参数调用 `remappingFunction` ,将结果 put 入 `Map` 中。
复制代码
La mise en œuvre de ces méthodes dans Map
l'interface, JDK8 nouvelle utilisation de default
mots - clés afin de maintenir la compatibilité ascendante, le code spécifique est très simple, il n'y a pas de longue haleine.
TreeMap
En comparaison HashMap
, la TreeMap
connaissance impliquée dans certains moins appropriés comme familier avec la Map
structure de données de la pierre à pas. Le regard de déposons sur un diagramme de classes:
On peut voir TreeMap
inherits AbstractMap
et met en œuvre l' NavigableMap
interface. AbstractMap
La méthode fournit une partie du modèle pour les développeurs de mettre en œuvre leur propre Map
et NavigableMap
fournir les analogues mentionné précédemment NavigableSet
à ces méthodes, vous pouvez retourner une gamme de clé ou une valeur. Donc , nous nous dirigeons tout droit à TreeMap
des détails de mise en œuvre de spécifiques.
Connue depuis le début d'un commentaire, TreeMap
est atteint par la structure de données d'arbre rouge-noir, il est possible d'assurer containsKey
, get
, put
, remove
la complexité du temps est log(n)
. Et même, TreeMap
n'est pas thread-safe. Alors , vraiment comprendre TreeMap
la clé est de comprendre et de saisir la structure de données d'arbre rouge-noir. Ainsi , la partie suivante, je vais passer un peu de longueur pour vous aider à la brosse sur les propriétés des arbres rouge-noir, ne pense pas que ce soit une tâche très difficile, je vous garantis que , après avoir lu la série d'articles sera en mesure d'arbre rouge-noir avec écriture Java.
arbre binaire équilibré
Une phrase arbre rouge-noir est un arbre binaire équilibré . Le concept d'un arbre binaire nous devrions tous savoir que chaque parent n'a pas plus de deux nœuds enfants de l'arbre. Le solde signifie que la hauteur des sous - arbres gauche et droite ne diffèrent pas de plus d'un. En même temps , la valeur de tous les sous - arbre gauche de nœuds plus petits que le courant et la valeur du nœud enfant de l'arbre à droite que le grand courant. look Let quelques exemples.
Peut voir la figure 1 est un arbre binaire équilibré, conformément aux conditions dont nous avons parlé avant, mais non conforme à la figure 2, parce que les sous-arbres gauche et à droite diffèrent de plus que la hauteur d'un.
Le but est de ne pas maintenir un dégénérés d'arbres binaires équilibrés dans une liste chaînée, de sorte que vous pouvez effectuer une recherche binaire pour trouver le temps de garder la complexité log(n)
. Mais cela signifie aussi une augmentation ou les noeuds supprimés lorsque la nécessité de faire une opération spéciale pour maintenir l'équilibre de l'ensemble arbre binaire, ce qui est une structure de données arbre rouge-noir.
arbre rouge-noir
Comme mentionné précédemment, l'arbre rouge-noir est un arbre binaire équilibré lui-même, il a toutes les caractéristiques d'un arbre binaire équilibré. Sur cette base, il a des contraintes avec leurs caractéristiques propres.
Chaque nœud supplémentaire arbre rouge-noir ajoute une couleur caractéristique, à savoir rouge, ou noir, une seule de ces deux dans, qui est aussi l'origine de son nom dans l' arbre rouge-noir. Nous regardons la TreeMap
source du nœud de l' arbre rouge-noir:
static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
V value;
Entry<K,V> left;
Entry<K,V> right;
Entry<K,V> parent;
boolean color = BLACK;
}
复制代码
TreeMap
Chaque nœud met en œuvre Map
les interfaces d' entrée, en plus des nœuds enfants gauche et à droite sous le nœud représentant la clé actuelle, la valeur deux éléments de données, ainsi que le code lui - même nœuds left
et right
, ainsi que leur nœud parent parent
. Le dernier est de représenter la couleur du nœud courant color
, où les mêmes définitions figurant dans TreeMap
le code source:
private static final boolean RED = false;
private static final boolean BLACK = true;
复制代码
Ensuite, nous examinons les caractéristiques de l'arbre rouge-noir:
* 根节点(root node) 的颜色始终为黑色
* 两个相邻的节点(即连接在一起的节点)不能同为红色
* 从根节点出发,到某个子节点的每条路径上的黑色节点数量都相同
复制代码
Que diriez-vous? Assez simple! Alors regardons un exemple.
D'après le tableau de vue ci-dessus avant de rencontrer les trois caractéristiques énumérées, assurez-vous de vérifier la bonne compréhension du concept d'arbre rouge-noir.
Le fonctionnement de base des trois arbres rouge-noir
Grâce à la description ci-dessus, vous devriez avoir maîtrisé le concept d'arbre rouge-noir, vous savez ce qui est un arbre rouge-noir. Avant l'introduction de l'insert d'arbre rouge-noir et les opérations de suppression, nous avons appris trois opérations de base qui changent de couleur (flip couleur), rotation gauche (rotation gauche) et rotation droite (rotation à droite).
changement de couleur
Très simple, la couleur actuelle du noeud rouge, la couleur des nœuds enfants gauche et à droite sont changées en noir. Dans la figure.
Rotation à gauche et à droite
Il peut y avoir quelques mots pour décrire l'abstrait, nous regardons l'image par exemple, l'image de wikipedia.
S'il vous plaît Duokanjibian cette image, assurez-vous de comprendre la rotation gauche dans le sens horaire et sens anti-horaire, parce que ces trois opérations de base est la base de l'insert après arbre rouge-noir et les opérations de suppression.
épilogue
Le principal introduit Map
et TreeMap
quelques fonctions de base et TreeMap
les concepts de base qui sous - tendent l' arbre rouge-noir. arbre rouge-noir est une structure de données de niveau plus importants pour les développeurs devraient connaître, ce qui introduit la base de concepts de base et des opérations. Et insérer l'algorithme spécifique Ensuite , nous allons être impliqués dans les opérations de suppression d' arbres rouge-noir, avant d' entrer dans cette partie, je souligne encore une fois de vous familiariser avec le contenu de cet article, car il est la base de cette fondation.
Dans le prochain article , je vais contrôler TreeMap
le code source algorithme arbre rouge-noir introduction, j'espère que vous ne manquez pas!
Je me félicite de l'attention sur le micro-signal « et le lys du peuple » pour des articles de qualité plus élevés