Java学习笔记之数据结构
java.util包提供的数据结构的功能非常强大,具备众多的功能。这些数据结构包括接口Iterator、Map以及下述类:
l BitSet
l Vector
l Stack
l Hashtable
1、 BitSet 位组
需要表示大量的二进制数据(即只可以为1或0的比特值)时,BitSet类很有用。这些值也被称为开/关值(1表示开,0表示关)或布尔值。
使用类BitSet的优点在于,可以使用位来存储布尔值,而无需通过按位运算来提取位值。您只需使用索引来引用每一位。另一个优点是,它可以自动增大,以表示程序所需的位数。
创建方法:
BitSet connex = new BitSet();
BitSet connex = new BitSet(int);
常用的方法:
(1)boolean isWriteable = connex.get(int);
使用get方法,可以用来获得位组中对应位的值。
(2)int numBits = connex.size();
使用size方法,可以确定位组表示了多少位。
(3)connex.set(int);
使用set方法,把位组中相应位的值设置为1。
2、 Vector 向量
类Vector实现了可扩展的对象数组。由于类Vector是负责在需要时进行扩展以支持更多的元素。所以它必须决定新元素被加入时,什么时候进行扩展以及扩展多少。您可以在创建时很容易地控制向量的这个方面。
创建方法:
Vector v = new Vector();
创建一个不含任何元素的默认向量。
Vector v = new Vector(25);
创建一个指定容量的向量。
Vector v = new Vector(25,5);
创建一个指定容量的向量,并指定向量每次的增长量。
常用的方法:
(1)v.add(“MaXiaolong”);
用于将元素加入到向量中。
(2)v.add(1,”MaXiaolong”);
用于将元素加入到向量中指定位置,后面的依次向后移。
(3)v.remove(3);
删除指定索引的元素。
(4)v.removeElement(“MaXiaolong”);
删除指定的元素,而不是指定索引处的元素。
(5)v.clear();
删除向量中的所有元素。
(6)String s1 = (String)v.get(0);
使用get方法,让您能够通过索引来检索向量中的元素。
(7)String s1 = (String)v.lastElement();
用于检索最后加入的元素。
(8)v.set(1,”MaXiaolong”);
用来修改指定位置的元素。
(9)boolean isThere = v.contains(“MaXiaolong”);
检验向量中是否包含指定的元素。
(10)int i = v.indexOf(“MaXiaolong”);
找出元素对应的索引,如果没有,则返回-1。
(11)int size = v.size();
判断向量中的元素数目。
(12)v.setSize(10);
显式地设置向量的大小。如果向量被扩展,将插入空元素;如果向量被压缩,索引值超过指定大小的元素都将被丢弃。
(13)v.trimToSize();
向量有两个与大小相关的不同属性:大小和容量。大小是向量中的元素数目,而容量是分配用来存储元素的内存量。容量总是大于或等于大小。可以使用方法trimToSize()来使容量与大小相等。
(14)int capacity = v.capacity();
查看向量的容量。
3、 Stack 堆栈
堆栈是一种经典的数据结构,用于模拟以特定顺序进行访问的信息。在Java中,Stack类被实现成一个后进先出(LIFO)的堆栈,这意味着最后加入的项将首先被弹出。
创建方法:
Stack s = new Stack();类Stack只定义了一个构造函数,这是一个默认构造函数,它创建一个空栈。
常用的方法:
(1)s.push(“MaXiaolong”);
使用方法push()将新的元素加入到堆栈中。
(2)String s1 = (String)s.pop();
使用方法pop()将元素从堆栈中弹出。
(3)String s2 – (String)s.peek();
使用方法peek()获得栈顶元素,而并不将它从栈中弹出。
(4)int i = s.search(“MaXiaolong”);
使用方法search()在堆栈中搜索元素。如果找到,则返回该元素离栈顶的距离(从0开始);如果没找到,则返回-1。
4、 Hashtable 哈希表
类Hashtable是从Dictionary派生而来的,它实现了接口Map,并提供了键映射数据结构的完整实现。哈希表让您能够基于某种类型的键值来存储数据,并具有由负载系数定义的效率。负载系数是一个0.0~1.0的数,它决定了哈希表如何以及何时为更多的元素分配空间。
与向量一样,哈希表也有容量(分配的内存量)。哈希表通过将表的当前大小同容量和负载系数的乘积进行比较来分配内存。如果哈希表的大小超过了这个乘积,哈希表将通过重新散列(rehash)来增加容量。
负载系数越接近1.0,内存使用效率越高,但代价是查找元素的时间越长;同样,负载系数越接近0.0,查找的效率越高,但浪费的内存越多。决定哈希表的负载系数时,取决于您将如何使用哈希表以及您看重的是性能还是内存的使用效率。
创建方法:
Hashtable hash = new Hashtable();
创建默认的哈希表。
Hashtable hash = new Hashtable(20);
创建具有指定的初始容量的哈希表。
Hashtable hash = new Hashtable(20,0.75F);
创建具有指定初始容量和负载系数的哈希表。
常用的方法:
(1)Float price = new Float(3.00F);
hash.put(“MaXiaolong”,price);
将使用字符串“MaXiaolong”为键值的元素加入到操纵字典中。
(2)Float price1 = (Float)hash.get(“MaXiaolong”);
获取指定键值的元素。
(3)hash.remove(“MaXiaolong”);
删除指定键值的元素。
(4)int size = hash.size();
获悉结构中有多少元素。
(5)boolean isEmpty = hash.isEmpty();
检查结构是否为空。
(6)hash.clear();
删除哈希表中的所有键值和元素。
(7)boolean isThere = hash.contains(new Rectangle(0,0,5,5));
检查哈希表中是否包含指定的对象。该方法在哈希表中查找对象而不是键值。
(8)hash.rehash();
强行重新散列。
哈希表的实际用处在于,它能够表示那些根据值进行查找或引用时太耗时的数据。换句话说,处理复杂数据时,如果使用键值比对数据对象本身进行比较来访问这些数据的效率更高,则哈希表将很有用。
另外,哈希表通常计算元素的键值,这被称为散列码。例如,字符串可以有一个整数散列码,它能够唯一地表示该字符串。当一组字符串被存储在哈希表中后,该表可以通过整数散列码(而不是字符串本身的内容)来访问这些字符串。这样,搜索和检索时,效率将高得多。