首頁  >  文章  >  Java  >  分析Java資料結構實例程式碼

分析Java資料結構實例程式碼

WBOY
WBOY轉載
2023-05-09 23:25:071313瀏覽

枚舉介面(Enumeration)

枚舉(Enumeration)介面雖然它本身不屬於資料結構,但它在其他資料結構的範疇裡應用很廣。枚舉(The Enumeration)介面定義了一種從資料結構中取回連續元素的方式。例如,枚舉定義了一個叫nextElement 的方法,該方法用來得到一個包含多元素的資料結構的下一個元素。

這種傳統介面已被 Iterator (迭代器)取代,雖然Enumeration 還未被遺棄,但在現代程式碼中已經被很少使用了。儘管如此,它還是使用在諸如Vector(向量)和Properties(屬性)這些傳統類別所定義的方法中,除此之外,還用在一些API類,並且在應用程式中也廣泛被使用。下表總結了一些Enumeration宣告的方法:

##1
序號 方法及說明
#####1## ####boolean hasMoreElements( ) ,測試此枚舉是否包含更多的元素############2######Object nextElement( ) ,如果此枚舉物件至少還有一個可提供的元素,則傳回此枚舉的下一個元素############

位元集合(BitSet)

位元集合類別實作了一組可以單獨設定和清除的位元或標誌。這個類別在處理一組布林值的時候非常有用,你只需要給每個值賦值一"位",然後對位元進行適當的設定或清除,就可以對布林值進行操作了。

一個Bitset類別建立一個特殊類型的陣列來保存位元值。 BitSet中數組大小會隨需要增加。這和位元向量(vector of bits)比較類似。這是一個傳統的類,但它在Java 2中被完全重新設計。

BitSet定義了兩個建構方法

// 第一个构造方法创建一个默认的对象:
public BitSet()
// 第二个方法允许用户指定初始大小。所有位初始化为0
public BitSet(int nbits)

BitSet中實作了Cloneable介面中定義的方法如下表所列:

##4void clear( ) ,將此BitSet 中的所有位元設為false5void clear(int index) ,將索引指定處的位元設定為false6void clear(int startIndex, int endIndex) ,將指定的startIndex(包括)到指定的toIndex(不包含)範圍內的位元設定為false7Object clone( ) ,複製此BitSet,產生一個與之相等的新BitSet#8boolean equals(Object bitSet) ,將此物件與指定的物件進行比較9void flip(int index ) ,將指定索引處的位元設定為其目前值的補碼10void flip(int startIndex, int endIndex) ,將指定的fromIndex(包括)到指定的toIndex(不包括)範圍內的每個位元都設定為其當前值的補碼11boolean get(int index) ,傳回指定索引處的位元值12BitSet get(int startIndex, int endIndex) ,傳回一個新的BitSet,它由此BitSet 中從fromIndex(包括)到toIndex(不包括)範圍內的位元組成13int hashCode( ) ,傳回此位元set 的雜湊碼值14boolean intersects(BitSet bitSet) ,如果指定的BitSet 中有設定為true 的位,並且在此BitSet 中也將其設為true,則傳回true15boolean isEmpty( ) ,如果此BitSet 中沒有包含任何設定為true 的位,則傳回true #16int length( ) ,傳回此BitSet 的"邏輯大小":BitSet 中最高設定位的索引加117 int nextClearBit(int startIndex) ,傳回第一個設定為false 的位元的索引,這發生在指定的起始索引或之後的索引上18int nextSetBit(int startIndex),傳回第一個設定為true 的位元的索引,這發生在指定的起始索引或之後的索引上19void or(BitSet bitSet),對此位元set 和位元set 參數執行邏輯或操作20void set(int index),將指定索引處的位元設定為true21void set(int index, boolean v),將指定索引處的位元設為指定的值#22void set(int startIndex, int endIndex),將指定的fromIndex(包含)到指定的toIndex(不包含)範圍內的位元設為true23void set(int startIndex, int endIndex, boolean v),將指定的fromIndex(包括)到指定的toIndex(不包含)範圍內的位元設為指定的值24int size( ),傳回此BitSet 表示位元值時實際使用空間的位元數25String toString( ),傳回此位元set 的字串表示形式#26void xor(BitSet bitSet),對此位元set 和位元set 參數執行邏輯異或運算#

实例:

public class Test {
    public static void main(String args[]) throws IOException {
        BitSet bits1 = new BitSet(16);
        BitSet bits2 = new BitSet(16);
        // 设置一些位
        for(int i=0; i<16; i++) {
            if((i%2) == 0) bits1.set(i);
            if((i%5) != 0) bits2.set(i);
        }
        System.out.println("位集合1初始模式: ");
        System.out.println(bits1);
        System.out.println("\n位集合2初始模式: ");
        System.out.println(bits2);
        // 对此目标位 set 和参数位 set 执行逻辑与操作
        bits2.and(bits1);
        System.out.println("\n位集合2 与 位集合1 执行逻辑与操作 ");
        System.out.println(bits2);
        // 对此位 set 和位 set 参数执行逻辑或操作
        bits2.or(bits1);
        System.out.println("\n位集合2 与 位集合1 执行逻辑或操作: ");
        System.out.println(bits2);
        // 对此位 set 和位 set 参数执行逻辑异或操作
        bits2.xor(bits1);
        System.out.println("\n位集合2 与 位集合1 执行逻辑异或操作 ");
        System.out.println(bits2);
    }
}
// 程序编译运行结果如下:
// 位集合1初始模式: 
// {0, 2, 4, 6, 8, 10, 12, 14}
// 位集合2初始模式: 
// {1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
// 位集合2 与 位集合1 执行逻辑与操作 
// {2, 4, 6, 8, 12, 14}
// 位集合2 与 位集合1 执行逻辑或操作: 
// {0, 2, 4, 6, 8, 10, 12, 14}
// 位集合2 与 位集合1 执行逻辑异或操作 
// {}

向量(Vector)

向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。和数组一样,Vector对象的元素也能通过索引访问。使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。

Vector 与 ArrayList的区别

  • Vector 是同步访问的,所以线程就会安全,但是同时也会带来弊端就是效率就会降低,但 Arraylist 恰恰相反,这也就导致Arraylist的效率比 Vector 高。

  • 在进行扩容时,Vector 会增长为原来数组长的一倍,而 Arraylist 只会增长为原来的一半,所以Arraylist节约内存空间。

  • Vector 包含了许多传统的方法,这些方法不属于集合框架。

Vector 类支持 4 种构造方法

// 第一种构造方法创建一个默认的向量,默认大小为 10
Vector()
// 第二种构造方法创建指定大小的向量
Vector(int size)
// 第三种构造方法创建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素数目
Vector(int size,int incr)
// 第四种构造方法创建一个包含集合 c 元素的向量
Vector(Collection c)

除了从父类继承的方法外 Vector 还定义了以下方法:

#序號 方法及說明
1 void and(BitSet set) ,對此目標位元set 和參數位set 執行邏輯與操作
2 void andNot(BitSet set) ,清除此BitSet 中所有的位,其對應的位在指定的BitSet 中已設定
3 int cardinality( ) ,傳回此BitSet 中設定為true 的位數
##6int capacity() ,傳回此向量的目前容量7void clear() ,從此向量移除所有元素#8Object clone() ,傳迴向量的副本#9boolean contains(Object elem) ,如果此向量包含指定的元素,則傳回true10boolean containsAll(Collection c) ,如果此向量包含指定Collection 中的所有元素,則傳回true11void copyInto(Object[] anArray) ,將此向量的元件複製到指定的陣列中#12Object elementAt(int index) ,傳回指定索引處的元件13Enumeration elements() ,傳回此向量的元件的枚舉14void ensureCapacity(int minCapacity) ,增加此向量的容量(如有必要),以確保其至少能夠保存最小容量參數指定的元件數15boolean equals(Object o) ,比較指定物件與此向量的相等性16Object firstElement() ,傳回此向量的第一個元件(位於索引0) 處的項目)17# Object get(int index) ,傳迴向量中指定位置的元素18int hashCode() ,傳回此向量的雜湊碼值#19int indexOf(Object elem) ,傳回此向量中第一次出現的指定元素的索引,如果此向量不包含該元素,則傳回-120int indexOf(Object elem, int index) ,傳回此向量中第一次出現的指定元素的索引,從index 處正向搜索,如果未找到該元素,則傳回-121void insertElementAt(Object obj, int index) ,將指定物件作為此向量中的元件插入指定的index 處22boolean isEmpty() ,測試此向量是否不包含元件23Object lastElement() ,傳回此向量的最後一個元件24int lastIndexOf(Object elem) ,傳回此向量中最後一次出現的指定元素的索引;如果此向量不包含該元素,則傳回-125int lastIndexOf(Object elem, int index) ,傳回此向量中最後一次出現的指定元素的索引,從index 處逆向搜索,如果找不到該元素,則傳回-1#26Object remove(int index) ,移除此向量中指定位置的元素27boolean remove(Object o) ,移除此向量中指定元素的第一個符合項,如果向量不包含該元素,則元素保持不變28boolean removeAll(Collection c) ,從此向量移除包含在指定Collection 中的所有元素29void removeAllElements(),從此向量移除全部元件,並將其大小設為零 30boolean removeElement(Object obj) ,從此向量移除變數的第一個(索引最小的)符合項目31# void removeElementAt(int index) ,刪除指定索引處的元件#32protected void removeRange(int fromIndex, int toIndex) ,從此向量移除其索引位於fromIndex(包括)與toIndex(不包括)之間的所有元素33boolean retainAll(Collection c) ,在此向量中僅保留包含在指定Collection 中的元素34Object set(int index, Object element) ,以指定的元素取代此向量中指定位置處的元素35void setElementAt(Object obj, int index) ,將此向量指定index 處的元件設定為指定的物件 #36void setSize(int newSize) ,設定此向量的大小37int size() ,傳回此向量中的群組件數38List subList(int fromIndex, int toIndex) ,傳回此List 的部分視圖,元素範圍為從fromIndex(包含)到toIndex(不包含)39Object[] toArray() ,傳回一個數組,包含此向量中以恰當順序存放的所有元素
序號 方法及說明
#1 void add(int index, Object element) ,在此向量的指定位置插入指定的元素
2 boolean add(Object o) ,將指定元素新增至此向量的結尾
3 boolean addAll(Collection c) ,將指定Collection 中的所有元素新增至此向量的結尾,並依照指定collection 的迭代器所傳回的順序新增這些元素
4 boolean addAll(int index, Collection c) ,在指定位置將指定Collection 中的所有元素插入到此向量中
#5 void addElement(Object obj) ,將指定的元件加入到此向量的結尾,將其大小增加1
40 Object[] toArray(Object[] a) ,返回一个数组,包含此向量中以恰当顺序存放的所有元素;返回数组的运行时类型为指定数组的类型
41 String toString() ,返回此向量的字符串表示形式,其中包含每个元素的 String 表示形式
42 void trimToSize() ,对此向量的容量进行微调,使其等于向量的当前大小

实例:

public class Test {
    public static void main(String args[]) throws IOException {
        // 初始大小为3,增量为2
        Vector v = new Vector(3, 2);
        System.out.println("初始大小: " + v.size());
        System.out.println("初始容量: " + v.capacity());
        v.addElement(new Integer(1));
        v.addElement(new Double(5.45));
        v.addElement(new Double(6.08));
        v.addElement(new Integer(7));
        System.out.println("四次添加后的容量: " + v.capacity());
        v.addElement(new Float(9.4));
        System.out.println("当前容量: " + v.capacity());
        v.addElement(new Integer(10));
        System.out.println("当前容量: " + v.capacity());
        System.out.println("第一元素: " + (Integer)v.firstElement());
        System.out.println("最后一个元素: " + (Integer)v.lastElement());
        v.addElement(new Integer(3));
        // 向量包含3
        if(v.contains(new Integer(3))) {
            System.out.println("向量包含 3");
        }
        // 列举向量中的元素
        Enumeration vEnum = v.elements();
        System.out.println("\n向量中的元素:");
        while(vEnum.hasMoreElements()) {
            System.out.print(vEnum.nextElement() + " ");
        }
        System.out.println();
    }
}
// 程序编译运行结果如下:
// 初始大小: 0
// 初始容量: 3
// 四次添加后的容量: 5
// 当前容量: 5
// 当前容量: 7
// 第一元素: 1
// 最后一个元素: 10
// 向量包含 3
// 向量中的元素:
// 1 5.45 6.08 7 9.4 10 3

栈(Stack)

栈(Stack)实现了一个后进先出(LIFO)的数据结构。你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。

栈是Vector的一个子类,栈只定义了默认构造函数,用来创建一个空栈。栈除了包括由Vector定义的所有方法,也定义了自己的一些方法:

序号 方法及说明
1 boolean empty() ,测试栈是否为空
2 Object peek( ) ,查看栈顶部的对象,但不从栈中移除它
3 Object pop( ) ,移除栈顶部的对象,并作为此函数的值返回该对象
4 Object push(Object element) ,把项压入堆栈顶部
5 int search(Object element) ,返回对象在堆栈中的位置,以 1 为基数

字典(Dictionary)

字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary。由于Dictionary类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现

Dictionary类已经过时了。在实际开发中,你可以实现 Map 接口来获取键/值的存储功能。

哈希表(Hashtable)

Hashtable类提供了一种在用户定义键结构的基础上来组织数据的手段。例如,在地址列表的哈希表中,你可以根据邮政编码作为键来存储和排序数据,而不是通过人名。哈希表键的具体含义完全取决于哈希表的使用情景和它包含的数据。

Hashtable是原始的java.util的一部分, 是一个Dictionary具体的实现 。然而,Java 2 重构的Hashtable实现了 Map 接口,因此,Hashtable 现在集成到了集合框架中。它和HashMap类很相似,但是它支持同步

像HashMap一样,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。

Hashtable定义了四个构造方法

// 默认构造方法
public Hashtable()
// 创建指定大小的哈希表
public Hashtable(int initialCapacity)
// 创建了一个指定大小的哈希表,并且通过fillRatio指定填充比例
// 填充比例必须介于0.0和1.0之间,它决定了哈希表在重新调整大小之前的充满程度
public Hashtable(int initialCapacity, float loadFactor)
// 创建了一个以 t 中元素为初始化元素的哈希表,哈希表的容量被设置为 t 的两倍
public Hashtable(Map<? extends K, ? extends V> t)

Hashtable中除了从Map接口中定义的方法外,还定义了以下方法:

序号 方法及说明
1 void clear( ) ,将此哈希表清空,使其不包含任何键
2 Object clone( ) ,创建此哈希表的浅表副本
3 boolean contains(Object value) ,测试此映射表中是否存在与指定值关联的键
4 boolean containsKey(Object key) ,测试指定对象是否为此哈希表中的键
5 boolean containsValue(Object value) ,如果此 Hashtable 将一个或多个键映射到此值,则返回 true
6 Enumeration elements( ) ,返回此哈希表中的值的枚举
7 Object get(Object key) ,返回指定键所映射到的值,如果此映射不包含此键的映射,则返回 null. 更确切地讲,如果此映射包含满足 (key.equals(k)) 的从键 k 到值 v 的映射,则此方法返回 v;否则,返回 null
8 boolean isEmpty( ) ,测试此哈希表是否没有键映射到值
9 Enumeration keys( ) ,返回此哈希表中的键的枚举
10 Object put(Object key, Object value) ,将指定 key 映射到此哈希表中的指定 value
11 void rehash( ) ,增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素
12 Object remove(Object key) ,从哈希表中移除该键及其相应的值
13 int size( ) ,返回此哈希表中的键的数量
14 String toString( ) ,返回此 Hashtable 对象的字符串表示形式,其形式为 ASCII 字符 ", " (逗号加空格)分隔开的、括在括号中的一组条目

属性(Properties)

Properties 继承于 Hashtable。Properties 类表示了一个持久的属性集。属性列表中每个键及其对应值都是一个字符串。Properties 类被许多Java类使用。例如,在获取环境变量时它就作为System.getProperties()方法的返回值。

Properties 定义如下实例变量.这个变量持有一个 Properties 对象相关的默认属性列表:

protected Properties defaults;

Properties类定义了两个构造方法

// 第一个构造方法没有默认值
public Properties()
// 第二个构造方法使用propDefault 作为默认值
public Properties(Properties defaults)

除了从 Hashtable 中所定义的方法,Properties 还定义了以下方法:

序号 方法及说明
1 String getProperty(String key), 用指定的键在此属性列表中搜索属性
2 String getProperty(String key, String defaultProperty),用指定的键在属性列表中搜索属性
3 void list(PrintStream streamOut),将属性列表输出到指定的输出流
4 void list(PrintWriter streamOut),将属性列表输出到指定的输出流
5 void load(InputStream streamIn) throws IOException,从输入流中读取属性列表(键和元素对)
6 Enumeration propertyNames( ),按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)
7 Object setProperty(String key, String value),调用 Hashtable 的方法 put
8 void store(OutputStream streamOut, String description),以适合使用 load(InputStream)方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流

以上是分析Java資料結構實例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除