摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器是接口的唯一實(shí)現(xiàn),可以確保集合元素處于排序狀態(tài),底層是一棵排序樹(shù)。底層使用紅黑樹(shù)算法進(jìn)行維護(hù),因此性能相對(duì)于來(lái)說(shuō)要差一些,因?yàn)閮?nèi)部會(huì)自動(dòng)進(jìn)行排序操作。
Java知識(shí)點(diǎn)總結(jié)(Java容器-TreeSet)
@(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection, JavaSet]
TreeSetTreeSet是SortedSet接口的唯一實(shí)現(xiàn),TreeSet可以確保集合元素處于排序狀態(tài),底層是一棵排序樹(shù)。
底層使用紅黑樹(shù)算法進(jìn)行維護(hù),因此性能相對(duì)于HashSet來(lái)說(shuō)要差一些,因?yàn)閮?nèi)部會(huì)自動(dòng)進(jìn)行排序操作。
TreeSet也是線程不安全
排序分為自然排序,定制排序,自然排序是TreeSet內(nèi)部對(duì)add進(jìn)來(lái)的值進(jìn)行排序,定制排序是對(duì)排序條件的限制
手動(dòng)實(shí)現(xiàn)TreeSetpackage mySet; import java.util.Comparator; import java.util.Iterator; import java.util.NoSuchElementException; /** * 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的TreeSet * @author george */ public class MyTreeSetimplements Cloneable, java.io.Serializable { // 為set底層樹(shù)的結(jié)構(gòu)排序用的比較器 當(dāng)按照E的自然排序時(shí)為null private final Comparator super E> comparator; // 頭節(jié)點(diǎn) private transient SetNode root = null; // 節(jié)點(diǎn)個(gè)數(shù) private transient int size = 0; /** * 無(wú)參構(gòu)造,設(shè)置比較器為null */ public MyTreeSet() { comparator = null; } /** * 構(gòu)造函數(shù),傳入定義好的比較器對(duì)象 * * @param comparator * :比較器對(duì)象 */ public MyTreeSet(Comparator super E> comparator) { this.comparator = comparator; } /** * 插入對(duì)象e到MyTreeSet中 * * @param e * :要插入的對(duì)象 * @return:返回是否插入成功 */ public boolean add(E e) { SetNode n = root; if (n == null) { root = new SetNode (e, null); size = 1; return true; } int comp; SetNode parents; Comparator super E> cptor = comparator; // 若比較器不為空 用Comparator進(jìn)行比較 if (cptor != null) { do { parents = n; comp = cptor.compare(e, n.e); if (comp < 0) n = n.left; else if (comp > 0) n = n.right; else { return false; } } while (n != null); } else { if (e == null) throw new NullPointerException(); // 用定義好的自然順序方法進(jìn)行排序比較 Comparable super E> cpb = (Comparable super E>) e; do { parents = n; comp = cpb.compareTo(n.e); if (comp < 0) n = n.left; else if (comp > 0) n = n.right; else { return false; } } while (n != null); } // 找到新元素將來(lái)位置的父結(jié)點(diǎn)后,將元素實(shí)例化成結(jié)點(diǎn)插入到樹(shù)中 SetNode newNode = new SetNode (e, parents); if (comp < 0) parents.left = newNode; else parents.right = newNode; size++; return true; } /** * 返回是否含有元素e * * @param e * @return */ public boolean contains(E e) { return getNode(e) != null; } /** * 刪除元素e所在的結(jié)點(diǎn) * * @param e * @return */ public boolean remove(E e) { SetNode node = getNode(e);// 找到元素e所在節(jié)點(diǎn) if (node == null) return false; deleteNode(node);// 進(jìn)行刪除 return true; } /** * 找到元素e在樹(shù)中的結(jié)點(diǎn) * * @param e * @return */ private SetNode getNode(E e) { SetNode n = root; int comp; SetNode parents; Comparator super E> cptor = comparator; // 若比較器不為空 用Comparator進(jìn)行比較 if (cptor != null) { do { parents = n; comp = cptor.compare(e, n.e); if (comp < 0) n = n.left; else if (comp > 0) n = n.right; else { return parents; } } while (n != null); } else { if (e == null) throw new NullPointerException(); // 用定義好的自然順序方法進(jìn)行排序比較 Comparable super E> cpb = (Comparable super E>) e; do { parents = n; comp = cpb.compareTo(n.e); if (comp < 0) n = n.left; else if (comp > 0) n = n.right; else { return parents; } } while (n != null); } return null; } /** * 刪除樹(shù)中的節(jié)點(diǎn)node 當(dāng)結(jié)點(diǎn)node有左右子女時(shí),往下所搜與node中的元素最為接近的元素的結(jié)點(diǎn) * 找到后將該結(jié)點(diǎn)的元素值賦給node,讓node指向該結(jié)點(diǎn), 接下來(lái)刪除這個(gè)結(jié)點(diǎn)。 注意:最后要去掉的節(jié)點(diǎn)的子女個(gè)數(shù)都是小于2的 * * @param node */ void deleteNode(SetNode node) { size--; SetNode rep; if (node.left != null && node.right != null) { rep = replaceNode(node); node.e = rep.e; node = rep; } rep = (node.left != null ? node.left : node.right); if (rep != null) { rep.parents = node.parents; if (node.parents == null) root = rep; else if (node == node.parents.left) node.parents.left = rep; else if (node == node.parents.right) node.parents.right = rep; } else { if (node.parents == null) { root = null; } if (node.parents != null) { if (node == node.parents.left) node.parents.left = null; else if (node == node.parents.right) node.parents.right = null; } } } /** * 找到距離node中的元素大小最近的結(jié)點(diǎn) * * @param node * @return */ SetNode replaceNode(SetNode node) { if (node == null) return null; else if (node.right != null) { SetNode p = node.right; while (p.left != null) p = p.left; return p; } else { SetNode p = node.parents; SetNode ch = node; while (p != null && ch == p.right) { ch = p; p = p.parents; } return p; } } /** * 清空set集合 */ public void clear() { size = 0; root = null; } /** * 返回結(jié)點(diǎn)的個(gè)數(shù) * * @return */ public int size() { return size; } /** * 找到最小的元素 * * @return */ public E first() { SetNode p = root; if (p != null) while (p.left != null) p = p.left; if (p.e == null) throw new NoSuchElementException(); else return p.e; } /** * 找到最大的元素 * * @return */ public E last() { SetNode p = root; if (p != null) while (p.right != null) p = p.right; if (p.e == null) throw new NoSuchElementException(); else return p.e; } /** * 找到最小的元素所在的結(jié)點(diǎn) * * @return */ public SetNode firstNode() { SetNode p = root; if (p != null) while (p.left != null) p = p.left; if (p.e == null) throw new NoSuchElementException(); else return p; } /** * 迭代器 * @return */ public Iterator iterator() { return new KeyIterator(firstNode(), this); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69630.html
摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器是一種不包括重復(fù)元素的。由于接口的特殊性,所有傳入集合中的元素必須不同。集合判斷兩個(gè)對(duì)象是否相同,是使用方法,而不是使用運(yùn)算符的。只能存儲(chǔ),所以只會(huì)在存儲(chǔ)的情況下使用。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Set) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection, JavaSet] Set Set是一種不包括重復(fù)元素的Col...
摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器函數(shù)庫(kù)是包下的一些接口和類(lèi),類(lèi)是用來(lái)產(chǎn)生對(duì)象存放數(shù)據(jù)用的,而接口是訪問(wèn)數(shù)據(jù)的方式。底層也是數(shù)組實(shí)現(xiàn),線程安全,效率低效率高,線程不安全。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Collection) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection] [toc] Collection Collection函數(shù)庫(kù)是java.uti...
摘要:概述集合類(lèi)主要有大分支,及。不能保證元素的排列順序,順序有可能發(fā)生變化不是同步的集合元素可以是但只能放入一個(gè)是接口的唯一實(shí)現(xiàn)類(lèi),可以確保集合元素處于排序狀態(tài)。如果這兩個(gè)的通過(guò)比較返回,新添加的將覆蓋集合中原有的,但不會(huì)覆蓋。 概述 Java集合類(lèi)主要有2大分支,Collection及Map。Collection體系如下: https://upload-images.jianshu......
摘要:是哈希表實(shí)現(xiàn)的,中的數(shù)據(jù)是無(wú)序的,可以放入,但只能放入一個(gè),兩者中的值都不能重復(fù),就如數(shù)據(jù)庫(kù)中唯一約束。四和的相同點(diǎn)和區(qū)別相同兩者都是基于哈希表實(shí)現(xiàn)的內(nèi)部也都是通過(guò)單鏈表解決沖突問(wèn)題同樣實(shí)現(xiàn)了序列化和克隆接口區(qū)別繼承的父類(lèi)不同。 一.Arraylist與LinkedList有什么區(qū)別? 1、ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),因?yàn)榈刂愤B續(xù),一旦數(shù)據(jù)存儲(chǔ)好了,查詢操作效率...
摘要:集合中成員很豐富,常用的集合有,,等。實(shí)現(xiàn)接口的集合主要有。集合中不能包含重復(fù)的元素,每個(gè)元素必須是唯一的。而以作為實(shí)現(xiàn)的構(gòu)造函數(shù)的訪問(wèn)權(quán)限是默認(rèn)訪問(wèn)權(quán)限,即包內(nèi)訪問(wèn)權(quán)限。與接口不同,它是由一系列鍵值對(duì)組成的集合,提供了到的映射。 原文地址 Java集合 Java集合框架:是一種工具類(lèi),就像是一個(gè)容器可以存儲(chǔ)任意數(shù)量的具有共同屬性的對(duì)象。 Java集合中成員很豐富,常用的集合有Arra...
閱讀 1340·2019-08-30 15:44
閱讀 1391·2019-08-29 18:42
閱讀 446·2019-08-29 13:59
閱讀 784·2019-08-28 17:58
閱讀 2824·2019-08-26 12:02
閱讀 2425·2019-08-23 18:40
閱讀 2418·2019-08-23 18:13
閱讀 3118·2019-08-23 16:27