`
Messi光明
  • 浏览: 53859 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    Java数据编程指南

    J2EE通信 通信概述 JMS的详细情况 消息驱动EJB 小结 第24章 Java数据对象(JDO) 概述 JDO对象模型 JDO API JDO实例的生命周期 JDO和EJB 开发可持久类 范例应用程序 配置FFJ...

    java数据结构源代码

    java数据结构 树 排序 查找 容器,还有数组之类的,全是用Java源代码写的。

    dt-1.1.0.0 数据转发JAVA运行容器

    dt-1.1.0.0 数据转发JAVA运行容器 源码下载: http://git.oschina.net/ifinder/dt-main 、dt-processor、dt-processor-default、dt-config 4个子项目

    JAVA容器的作用和概览

    Collection 表示一组对象,它是集中,收集的意思,就是把一些数据收集起来 Collection接口的两个子接口: Set中的数据没有顺序,不可重复。 List中的数据有顺序,可重复。

    秘钥容器排序源代码JAVA

    密钥是一种参数,它是在明文转换为密文或将密文转换为明文的...将秘钥容器中的所有秘钥按照f(k)升序排列,以便观察秘钥的安全性。 数据结构综合应用、排序算法综合应用、算法设计 程序可在eclipse直接导入,亲测可用

    基础深化和提高-java容器

    在Java中,容器(Container)指的是用于存储和管理对象的数据结构。Java容器提供了一种统一的方式来组织和管理多个对象,使得开发者能够更加方便地对这些对象进行操作和处理。 Java容器主要分为两大类:Collection ...

    Java数据结构与算法

    多种数据结构的Java实现(精),JAVA数据结构与算法,基本数据结构的JAVA实现,JAVA容器分析,HASHSET,堆栈STACK结构,链表QUEUE,算法研究

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java 常见并发容器总结

    Java 常见并发容器总结 JDK 提供的这些容器大部分在 `java.util.concurrent` 包中。 - **`ConcurrentHashMap`** : 线程安全的 `HashMap` - **`CopyOnWriteArrayList`** : 线程安全的 `List`,在读多写少的场合性能...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Java集合容器面试题(2023最新版)-重点

    Java集合容器面试题(2023最新版)-重点 **集合框架:**用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合...

    think in java线程和容器2

    java线程中容器使用技术,比如List接口是在Collection的基础上添加了大量方法,有两种基本类型:ArrayList,它擅⻓于随机访问元素,但是List中间插入或移除元 素时较慢;LinkedList,它和ArrayList的特性正好相反。...

    java线程和容器专题课程第一部分

    java线程和容器专题课程第一部分,共两部分。详细讲解java线程的一些知识和技术原理。从性能的⻆度看,如果没有任务会阻塞,那么在单处理器机器上就没有意义使用多线程。java的线程机制是抢占式的,这表示调试 机制...

    java容器超详细

    java容器是前人为我们提供的一套用于存储数据和对象的工具。如果你学过C++的STL,可以与之类比。java容器又可以称为Java Collection Framework(JCF)。里面除了存储对象的容器之外,还提供了一套用于处理和操作容器...

    Java容器

    Java容器 有两种容器:一个是Collection容器,存放对象的集合;另一种是Map容器,存放键值对(Key-value)集合 Collection容器 从图上我们可以看到Collection接口下有三个儿子,分别是Set,List,Queue;下面我来逐个...

    JAVA_API1.6文档(中文)

    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...

    JTreeMap树形结构的Java 容器

    JTreeMap是一个使用 Map 的数据结构来表示树形结构的 Java 容器。

    Java并发容器,底层原理深入分析

    ConcurrentHashMapConcurrentHashMap底层具体实现JDK1.7底层实现将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap...

    深入理解Java中的容器

    在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体之所以需要容器:1、数组的长度难以扩充2、数组中数据的...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

Global site tag (gtag.js) - Google Analytics