use*_*425 4 java treemap treeset
好的SortedMap/ SortedSet是一个接口,和TreeMap/ TreeSet是它的实现.它们都按顺序排列元素,对吧?那么为什么我们需要TreeMap/ TreeSet?
Tho*_*mas 13
接口不提供任何功能,它们只是根据它提供的方法定义类的一般大纲.但是,没有任何代码内SortedMap/ SortedSet实现如何真正实现这一功能.
事实上,您通常可以通过多种方式实现相同的功能.想想界面java.util.Set:您可以将其实现为a,TreeSet但也可以实现HashSet.通常,在不同的实现之间存在一些权衡:散列集平均可以提供更快的访问时间,而树集可以更好地保持其项目的顺序.
然而,通常情况下,开发人员并不真正关心实现细节,只要他们知道他们可以将项目存储在集合中并检索它们.接口定义了这个基本思想,但不是如何实现它.
这也是您无法实例化接口的原因.如果您尝试以下方法:
SortedSet<Integer> set = new SortedSet<Integer>();
Run Code Online (Sandbox Code Playgroud)
你的编译器会抱怨.这是因为"SortedSet"并没有真正实现一个集合本身,它只是定义了一个有序集合的实现必须在方法方面提供什么.
这是一个人为的例子.想象一下,您希望提供一种功能来计算集合中正整数的百分比.您可以定义一个方法:
public double getPercentageOfPositives(Set<Integer> set) {
if (set.size() == 0) {
return 0.0;
}
int count = 0;
for (Iterator<Integer> iter = set.iterator(); iter.hasNext();) {
if (iter.next() > 0) count++;
}
return 100.0 * count / set.size();
}
Run Code Online (Sandbox Code Playgroud)
在这里,你并不关心你的方法的用户是给你一个TreeSet还是一个HashSet.给定类使用哪个原则并不重要,因为无论如何你只是调用size()方法和iterator()方法.您所需要的只是相信任何一组都有这两种方法.界面为您提供信任.
因此,您的方法签名仅询问a Set,该接口定义实现它的所有类必须提供(以及其他)a size()和iterator()方法.如果你这样写:
public double getPercentageOfPositives(SortedSet<Integer> set) {
...
}
Run Code Online (Sandbox Code Playgroud)
我有一个实例HashSet然后我不能使用你的方法,即使HashSet提供size()和iterator()也.:-(
从这个意义上说,接口就像一个超类,它定义了所有类必须具有实现它的共性.但它本身并不提供任何功能.
因此,回到原始示例SortedSet:此接口不提供任何功能.它仅定义了排序集实现必须提供的方法.TreeSet就是这样一个实现.
同样的思路适用于SortedMap.
| 归档时间: |
|
| 查看次数: |
11409 次 |
| 最近记录: |