今天设计写到采集内容对象时,卡了壳,迟迟不能定下存储数据的容器。原因就是我需要内部对象能够从小到大或从大到小排序,至少也要能保持原序。之前设计中使用的HashMap会把所有顺序彻底打乱,放弃;Hashtable的元素数量在20个以内时还有个序,但一旦超过20个,顺序又乱了,放弃;ArrayList能保持原序,但它的key只是个index,所以index必须要小于size,放弃;TreeMap可以排序,不过排得很郁闷,不是按照整个数字的大小排,而是按数字单个位数的顺序排,不过仔细想想,它确实是只能这样排法,毕竟它的key是Object。看来只能用两个Vector分别装OID和值了。
下面这篇文章是在搜索如何解决这个问题的时候,找出来的。觉得还不错,把几种容易混淆的容器都归纳出来了。
1. Collection: 一组各自独立对象
List: 以特定次序存储一组元素 [原序]
常用举例: ArrayList, LinkedList
Set: 元素不得重复 [重排序]
常用举例: HashSet
最常用界面: add(element)
get()
iterator()
2. Map: key-value paris, 也被称为关联式数组(associative array) [重排序]
常用举例: HashMap
最常用界面: put(key, value)
get()
[容器打印]
由各容器缺省的toString()提供
Set和Map都具有内部的排列(Ordering)机制
[容器缺点: 元素型别未定]
一旦将元素放入容器,它将丧失它的型别信息,都变成了Object
这样从容器中取出元素时首先要转换为原有型别,唯有String例外:
编译器会自动调用toString()函数
[迭代器 Iterators]
迭代器是一个对象,其职责是走访以及选择序列(sequence)中的一连串对象
而且迭代器是“轻量级”对象,产生的代价极小
Collention.iterator() 返回一个Iterator对象
java.util.Iterator [class]
next() 取得序列中下一个元素,第一次调用将返回第一个元素
hasNext() 检查序列中是否还有下一个元素
remove() 移去迭代器最新传回的元素
对于List还有一个更复杂的ListIterator
java.util.ListIterator [class]
add(), remove(), set(),
hasNext(), next(), nextIndex(),
hasPrevious(), previous(), previousIndex()
旧版迭代器为Enumeration
[容器分类 Container taxonomy]
[Collection机能]
boolean add(Object)* 若未能将引数加入,则返回false
boolean addAll(Collection)* 只要引数Collection中有一个元素成功能加入就返回true
void clear()* 移除(remove)容器内所有元素
boolean contains(Object) 若容器内含引数所代表的对象,返回true
boolean containsAll(Collection) 若容器内含引数所含的所有元素,返回true
boolean isEmpty()
Iterator iterator()
boolean remove(Object)* 若引数值位于容器中,则移出该元素(或其中之一)。若已发生移除动作,则返回true
boolean removeAll(Collection)* 移除容器内所有元素。动作发生返回true
boolean retainAll(Collection)* 只保留引数容器内的元素(交集 intersection)。动作发生返回true
int size() 返回容器中元素个数
Object[] toArray() 返回一个Array,内含容器内所有元素
Object[] toArray(Object[] a) 同上,但Array的中元素型别和引数a的元素型别相同(你仍需自己改变Array的型别)
*optional
[List机能]
List 次序(order)是List最重要的特性;特有的ListIterator(见前述)
ArrayList* 允许快速随机访问;安插/移除发生在List中央位置时效率极差
LinkedList 最佳顺序循环访问,易于安插/移除;随机访问缓慢,特有机能如下:
addFirst(), addLast(), getFirst(), getLast(), removeFirst(), removeLast()
易于使用LinkedList实现stack, queue, deque
*缺省最佳选择
[Set机能]
Set [interface] Set具有和Collection一模一样的interface
加进Set的每一元素必须独一无二——即每个元素必须定义equals()以判断独一性
HashSet* 一种把查找时间看得很重要的Set, 每个元素必须定义hashCode()
TreeSet 底层结构为tree的一种有序(ordered)Set,可从Set中萃取出一个带次序性的序列(ordered sequence)
*缺省最佳选择
SortedSet [interface] (TreeSet是其唯一实现)
Comparator comparator() 产生一个"被此Set所使用"的Comparator,或者返回null表示以"自然方式"排序。
Object first() 产生lowest element
Object last() 产生highest element
SortedSet subSet(fromElement, toElement) 产生Set子集,范围从fromElement(含)到toElement(不含)
SortedSet headSet(toElement) 产生Set子集,所有元素都小于toElement
SortedSet tailSet(fromElement) 产生Set子集,所有元素都大于或等于fromElement
first last
[ 0 1 2 3 4 5 6 7 8 ]
low high
开发自己的型别(type)时注意:
1. Set需要以某种方式维护其元素次序,这意味着你必须实现 Comparable interface, 并定义compareTo()
2. 不要在compareTo()中使用简单明了的比较形式: return i1-i2。
这种写法是常见的错误。因为只有i1和i2都是无符号(unsigned, 但Java中无此关键字)的int,这种写法才是正确的。面对Java中带正负号的int会出错。原因是带正负号的int,其容量不足以表示两个同型数值相减的结果。如果i是一个足够大的正整数,而j是一个绝对值足够大的负整数,那么i-j的结果将会造成溢出,并返回负值,导致错误。
[Map机能]
Map [interface] 维护key-value的关联性,使你可以用key来查找value
HashMap* 基于hash table的实现,可用于取代Hashtable。
在常量时间内安插元素;可通过构造函数,设定capacity, load factor来调整效能。
TreeMap 基于red-black tree的实现。
结果以排序形式出现(次序由Comparable[interface]或者Comparator[class]决定);唯一具有subMap()的一个Map
*缺省最佳选择
Map [interface]
put(Object key, Object value)
get(Object key)
containsKey(Object key)
containsValue(Object value)
SortedMap [interface] (TreeMap是其唯一实现)
Comparator comparator();
Object firstKey();
Object lastKey();
SortedMap subMap(fromKey, toKey);
SortedMap headMap(toKey);
SortedMap tailMap(fromKey);
[容器库: 公用函数]
Java 2 容器库: java.util.Collections [class]
(不要和Collection混!)
enumeration(Collection) 产生一个旧式(Java 1.0/1.1)的Enumeration
max(Collection[, Comparator]) 未指定Comparator时则使用natural comparison
min(Collection[, Comparator])
reverse() 逆序
copy(List dest, List src)
fill(List list, Object o) (只对List有效)替换掉List中原有的元素, 将o的reference复制到List的每个位置上
nCopies(int n, Object o) 返回一个"大小为n, 内容不再变动"的List, 其中所有的reference都指向o
产生只读版本:
unmodifiableCollection(Collection c)
unmodifiableList(List l)
unmodifiableSet(Set s)
unmodifiableMap(Map m)
Thinking in Java 补充容器库: com.bruceeckel.util.Collection2 [class]
fill(Collection, Generator, int) 使用自动产生器generator向容器内加入指定个数元素
除了在 com.bruceeckel.util.Arrays2 中定义的 RandXXXGenerator [class]还能继续使用外,
(Boolean, Byte, Char, Short, Int, Long, Float, Double, String)
还重新为Map提供了
RandStringPairGenerator [class] 产生指定个数的,随机字符串对(String pairs)
StringPairGenerator [class] 将给定的二维字符串数组(2D String Arrays)转为字符串对(String pairs)
预定义产生器对象:
rsp RandStringPairGenerator的对象,产生10组String pairs
geography StringPairGenerator的对象
countries StringGenerator的对象
capitals StringGenerator的对象
[Java 1.0/1.1 旧式容器]
Vector 对应旧式迭代器Enumeration的容器,"函数名称又长又不好用的ArrayList"
elements() 返回Enumeration
addElement()
Enumeration [interface]
boolean hasMoreElements()
Object nextElement()
Hashtable 类似HashMap
Stack
BitSet
java数据容器
猜你喜欢
转载自1185734295.iteye.com/blog/1927599
今日推荐
周排行