java数据容器

 今天设计写到采集内容对象时,卡了壳,迟迟不能定下存储数据的容器。原因就是我需要内部对象能够从小到大或从大到小排序,至少也要能保持原序。之前设计中使用的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

猜你喜欢

转载自1185734295.iteye.com/blog/1927599