`
- 浏览:
55715 次
- 性别:
- 来自:
上海
-
今天设计写到采集内容对象时,卡了壳,迟迟不能定下存储数据的容器。原因就是我需要内部对象能够从小到大或从大到小排序,至少也要能保持原序。之前设计中使用的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
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在IT领域,Java容器是一个非常重要的概念,尤其对于软件开发者来说,它们是理解和构建高效、可扩展的应用程序的关键。本文将深入探讨Java容器,并结合标签“源码”和“工具”,从源码层面和实用工具角度来分析这些...
Java 类容器是 Java 编程中非常重要的一个概念,它主要指的是 Java 集合框架中的各种类,如 ArrayList、LinkedList、HashSet、HashMap 等,这些类用于存储和管理对象。本文将深入探讨这些常用的Java类容器,帮助...
Java容器是一种基本的数据结构,用于存储和管理对象。Java容器主要分为两大类:Collection和Map。 Collection Collection是一个独立元素的序列,这些元素都服从一条或多条规则。Collection接口提供了基本的操作...
在Java编程语言中,容器(Container)是一种用来存储和管理数据结构的重要概念,它提供了组织、存储和操作数据的方式。容器通常指的是集合框架中的各种类,如List、Set、Map等,它们允许开发者以不同的方式存储和...
通过以上解析,我们可以看到Java容器的强大功能和灵活性,它们不仅能够高效地存储和操作数据,还能适应不同的应用场景,是Java程序员不可或缺的工具箱。掌握并灵活运用这些容器,将极大地提升编程效率和代码质量。
在Java编程中,容器是用来存储和管理对象的类或接口,它们使得我们可以在程序中方便地组织和操作数据。在Java中,常见的容器主要分为三类:List、Set和Map,这些都是Java集合框架的重要组成部分。 首先,我们来看...
在Java编程中,容器对象是用于存储其他对象的类,它们是Java集合框架的重要组成部分。这篇博客"JAVA容器对象整理"可能涵盖了关于Java中的不同容器类、接口以及它们的使用方式。在这里,我们将深入探讨一些核心的Java...
Java容器是Java编程中至关重要的一个...掌握这些Java容器的知识点,将有助于你更高效地组织和操作数据,提升代码质量,更好地应对各种编程挑战。在实际项目中,灵活运用这些容器,可以大大提高代码的灵活性和可维护性。
在Java编程语言中,容器是用于存储对象的集合框架,它们提供了一种高效且灵活的方式来组织和管理数据。本练习题旨在帮助你深入理解和熟练掌握Java中的容器使用,特别是其核心类库`java.util`中的ArrayList、...
在这个“java泛型容器堆栈代码”中,我们将会探讨Java如何利用泛型来创建高效且类型安全的容器,特别是堆栈数据结构。 堆栈是一种基于“后进先出”(LIFO)原则的数据结构,常用于实现函数调用栈、内存管理等场景。...
Java中的同步容器与并发容器是处理多线程环境下数据安全的重要工具。同步容器,如`Vector`和`HashTable`,通过在每个方法上添加`synchronized`关键字实现了线程安全,但这种方式存在性能瓶颈,因为每次操作都需要...
Java容器是Java编程中至关重要的一个概念,它们是用来存储、管理和操作对象的工具,使得开发者可以更加方便地组织代码和数据。在这个“JAVA的容器自学”资料中,我们将深入探讨Java容器的基本概念、主要类型以及如何...
《Java数据编程指南》是一本深入探讨如何在Java环境中处理数据的专业书籍,由Danny Ayers撰写。这本书的主要目标是帮助开发者掌握在Java平台上的数据操作技术,包括数据存储、数据检索、数据处理以及数据传输等多个...
- **STL(Standard Template Library)**:提供容器(如vector、list)、迭代器、算法和函数对象,极大地简化了数据结构和算法的实现。 - **模板**:允许创建泛型代码,适用于多种数据类型。 4. **Java特有**: ...
Java对象容器是Java编程语言中用于存储和管理对象的关键组件,它们提供了灵活的方式来组织和操作数据,弥补了数组在某些场景下的不足。本篇文章将详细探讨Java中的对象容器,包括其核心特性、主要类型以及如何根据...
Java集合容器是Java编程语言中用于存储和管理对象的核心组件。在Java中,集合框架提供了多种数据结构,如列表(List)、集(Set)和映射(Map),以适应不同的数据处理需求。以下是对这些主要知识点的详细说明: 1....
在Java编程中,容器是用于存储对象的集合,它们提供了数据结构和算法,使得我们可以方便地组织和管理数据。本文将深入分析Java中的List接口及其常见的实现类,如ArrayList、LinkedList和Vector,探讨它们的效率差异...
Java 容器详解 Java 容器是 Java 语言中的一种集合类库,主要包括 Collection 和 Map 两种类型。Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection Collection 是一种集合接口...
Java并发容器CopyOnWriteArrayList实现原理及源码分析 Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。...
本资源“java数据结构源代码”聚焦于用Java实现的数据结构,包括树、排序、查找以及容器等核心概念。下面将对这些知识点进行详细的解读。 首先,**树数据结构**是计算机科学中非常重要的一种非线性结构,它由节点...