【发布时间】:2013-05-28 16:59:39
【问题描述】:
java.util.BitSet 类上的 size() 方法是否有用例?
我的意思是——JavaDoc 清楚地表明它依赖于实现,它返回内部long[] 存储的大小(以位为单位)。从上面的内容可以得出结论,您将无法设置比size() 更高的索引的位,但事实并非如此,BitSet 可以自动增长:
BitSet myBitSet = new BitSet();
System.out.println(myBitSet.size()); // prints "64"
myBitSet.set(768);
System.out.println(myBitSet.size()); // prints "832"
在我一生中每次遇到BitSet 时,我一直想使用length(),因为它返回BitSet 的逻辑大小:
BitSet myBitSet = new BitSet();
System.out.println(myBitSet.length()); // prints "0"
myBitSet.set(768);
System.out.println(myBitSet.length()); // prints "769"
尽管过去 6 年我一直在编程 Java,但这两种方法总是让我很困惑。我经常把它们混在一起,顺便用错了,因为在我的脑海里,我认为BitSet 是一个聪明的Set<boolean>,我会使用size()。
就像ArrayList 让length() 返回元素的数量,size() 返回底层数组的大小。
现在,我缺少 size() 方法的用例吗?它有什么用处吗?有没有人用过它?对于一些手动操作或类似的东西可能很重要吗?
编辑(经过更多研究)
我意识到BitSet 是在 Java 1.0 中引入的,而包含我们使用的大多数类的 Collections 框架是在 Java 1.2 中引入的。所以基本上在我看来,size() 是由于遗留原因而被保留的,它没有真正的用处。新的 Collection 类没有这样的方法,而一些旧的(例如Vector)有。
【问题讨论】:
-
This bug 包含原始理由! Josh Blosh(被我缩短了,消息的精神保持不变):“
size方法......被严重低估了。......假设 *ANYTHING* 关于返回的值是...危险...值可能...在平台之间有所不同。反复或两个BitSets 可能导致值...无限制地增长... ...无法修复.. .,因此我们添加了一个新的、精确指定的方法 (length),它返回有用的信息...... [并且] 取代了size方法。”