ホームページ >Java >&#&チュートリアル >Java データ構造を分析するサンプル コード

Java データ構造を分析するサンプル コード

WBOY
WBOY転載
2023-05-09 23:25:071365ブラウズ

列挙型インターフェイス (Enumeration)

列挙型 (Enumeration) インターフェイス自体はデータ構造に属しませんが、他のデータ構造のカテゴリで広く使用されています。 Enumeration インターフェイスは、データ構造から連続した要素を取得する方法を定義します。たとえば、列挙型は nextElement というメソッドを定義します。このメソッドは、複数の要素を含むデータ構造の次の要素を取得するために使用されます。

この従来のインターフェイスは Iterator に置き換えられました。Enumeration は廃止されていませんが、最新のコードではほとんど使用されません。それにもかかわらず、一部の API クラスに加えて、Vector や Properties などの従来のクラスで定義されたメソッドでも使用され、アプリケーションで広く使用されています。次の表は、Enumeration によって宣言されたいくつかのメソッドをまとめたものです。

#boolean hasMoreElements()、この列挙にさらに要素が含まれているかどうかをテストします。
2 Object nextElement()、この列挙オブジェクトに少なくとも次の要素が含まれているかどうかをテストします。要素が利用可能な場合、この列挙の次の要素が返されます

BitSet

Bit Set クラスは、個別に設定およびクリアできる一連のビットまたはフラグ を実装します。このクラスは、一連のブール値を処理する場合に非常に便利です。各値に「ビット」を割り当て、ブール値を操作するためにビットを適切に設定またはクリアするだけで済みます。

Bitset クラスは、ビット値を保持する特別なタイプの配列を作成します。 BitSet 内の配列のサイズは、必要に応じて増加します。これはビットのベクトルに似ています。これは伝統的なクラスですが、Java 2 では完全に再設計されました。

#BitSet は 2 つの構築メソッドを定義します:

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

BitSet は、次の表に示すように、Cloneable インターフェイスで定義されたメソッドを実装します:

シリアル番号メソッドと説明1void and(BitSet set)、このターゲットビットセットとパラメータ用ビット セットは論理 AND 演算 2void andNot(BitSet set) を実行し、この BitSet 内のすべてのビットをクリアします。対応するビットは指定された BitSet に既に存在します。 Set3int Cardinality( ) は、この BitSet で true に設定された桁数を返します4void clear()、この BitSet のすべてのビットを false に設定します5void clear(int index)、指定されたインデックスを設定しますビットが false に設定されている6void clear(int startIndex, int endIndex)、指定された startIndex (包括的) から指定された toIndex (排他的) 範囲ビットまでになります。 falseに設定されている7Object clone()は、このBitSetをコピーし、それと等しい新しいBitSetを生成します8booleanquals(Object bitSet)、このオブジェクトを指定されたオブジェクトと比較します9void flick(int index )、現在の値の補数に対する指定されたインデックスのビット #10void flick(int startIndex, int endIndex)、指定された fromIndex( の各ビットを設定します指定された toIndex (範囲を含む) を現在の値の補数に設定します。 #11boolean get(intindex)、次のビット値を返します。指定されたインデックス 12BitSet get(int startIndex, int endIndex) は、fromIndex( からの範囲内のビット) から取得される新しい BitSet を返します。 #1314##15boolean isEmpty( ) は、この BitSet に true に設定されたビットが含まれていない場合、true16## を返します。 #int length() は、この BitSet の「論理サイズ」を返します。BitSet 内の最も高いセット ビットのインデックスに 1 を加えたものです。 int nextClearBit( int startIndex)、false に設定された最初のビットのインデックスを返します。これは、指定された開始インデックス以降に発生しますint nextSetBit(int startIndex),指定された開始インデックス void or(BitSet bitSet) 以降に発生する、true に設定された最初のビットのインデックスを返します。論理 OR 演算を実行します。このビット セットとビット セット パラメータ void set(intindex) でインデックスを指定します。指定されたインデックスのビットを true に設定します。 #21void set(intindex, boolean v)、指定されたインデックスのビットを指定された値に設定します に設定します。 ##25String toString( )、このビット セットの文字列表現を返します。 26void xor(BitSet bitSet)、このビットセットとビットセット パラメータは、排他的論理和演算

实例:

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 还定义了以下方法:

int hashCode() 形式で toIndex (除外) に変換し、このビット セットのハッシュ コード値を返します
boolean intersects(BitSet bitSet)、指定された BitSet に true に設定されたビットがあり、この BitSet でも true に設定されている場合、true を返します
17
#18
19
20
#22 void set(int startIndex, int endIndex)、指定された fromIndex (この値を含む) から指定された toIndex (この値を含まない) までの範囲のビットを true
23 void set(int startIndex, int endIndex, boolean v)、指定された fromIndex (この値を含む) から指定された toIndex (この値を含まない) までの範囲のビットを指定された値
24 int size( ) は、この BitSet がビット値を表すときに実際に使用される空間のビット数を返します
##18int hashCode()、ハッシュ コード値を返します。 this Vector19int indexOf(Object elem) は、このベクトルに指定された要素が最初に出現するインデックスを返します (このベクトルに要素、-120intindexOf(Object elem, int Index) を返し、このベクトル内に初めて出現する指定された要素のインデックスを返します、要素が見つからない場合はインデックスから前方に検索します。要素が見つかった場合は、-121void insertElementAt(Object obj, int Index) が返され、指定された要素が挿入されます。オブジェクトをこのベクトルのコンポーネントとして指定したインデックスに挿入します。#22boolean isEmpty() は、このベクトルにコンポーネントが含まれているかどうかをテストします23Object lastElement()、このベクトルの最後のコンポーネントを返します 24int lastIndexOf(Object elem) 、このベクトルに現れる最後に指定された要素のインデックスを返します。 出現する指定された要素のインデックス。インデックスから逆方向に検索します。要素が見つからない場合は、-1# を返します。 ##26##27boolean Remove(Object o ) は、ベクトルに指定された要素が含まれていない場合、このベクトル内で最初に出現した要素を削除します。要素が含まれていない場合、要素は変更されません。28boolean RemoveAll(コレクション c)、指定されたコレクションに含まれるすべての要素をこのベクトルから削除します29void RemoveAllElements()、このベクトルからすべてのコンポーネントを削除し、そのサイズを次のように設定しますzero 30boolean replaceElement(Object obj) 、このベクトルから変数の最初 (最も低いインデックス) の出現を削除します31 void RemoveElementAt(int index) 、指定されたインデックスにあるコンポーネントを削除します 32protected void RemoveRange(int fromIndex, int toIndex) 、このベクトルからそのインデックスを削除します fromIndex (包括的) と toIndex (包括的) の間にあるすべての要素 33booleantainAll(Collection c) 、inこのベクトルは Collection に含まれる要素のみを指定します。指定された要素を持つベクトル35void setElementAt(Object obj, int Index)、このベクトルの指定されたインデックスにあるコンポーネントを指定されたオブジェクトに設定します36void setSize(int newSize) は、このベクトルのサイズを設定します 37int size() は、このベクトル内のグループを返します。 項目数38List subList(int fromIndex, int toIndex) は、このリストの部分ビューを返します。要素の範囲は fromIndex (包含) から toIndex (包含) までです。)39Object[] toArray() は、このベクトル内のすべての要素を含む配列を返します。適切な順序で保存されます
シリアル番号 メソッドと説明
1 void add(int インデックス, オブジェクト要素) 、指定された要素をこのベクトルの指定された位置に挿入します。
2 boolean add(Object o) 、指定された要素をこのベクトルの末尾に追加します
3 boolean addAll(Collection c)、指定された Collection 内のすべての要素をこのベクトルの末尾に追加し、これらの要素を反復子によって返された順序で追加します。指定された collection
4 boolean addAll(intindex, Collection c)、指定された Collection 内のすべての要素をこのベクトルの指定された位置に挿入します
5 void addElement(Object obj) は、指定されたコンポーネントをこのベクトルの末尾に追加し、サイズを 1
だけ増やします。 6 int Capacity()、このベクトルの現在の容量を返します
7 void clear()、このベクトルからすべての要素を削除します
8 Object clone() は、ブール値に含まれるベクトルのコピーを返します。 (Object elem) 、このベクトルに指定された要素が含まれている場合は true を返します
10 boolean containsAll(Collection c) 、このベクトルに指定された要素がすべて含まれている場合は true を返します指定された Collection を返し、true
11 void copyInto(Object[] anArray) を返し、このベクトルのコンポーネントを指定された配列にコピーします
12 Object elementAt(int index) は、指定されたインデックスのコンポーネントを返します。
13 Enumeration elements() 、このベクトルを返します。 コンポーネントの列挙
14 void ensureCapacity(int minCapacity) 、このベクトルの容量を (必要に応じて) 増加させて、確実に保持できるようにします。最小の最小容量 パラメーターで指定されたコンポーネントの数
15 booleanquals(Object o)、指定されたオブジェクトがこのベクトルと等しいかどうかを比較します
16 Object firstElement() は、このベクトルの最初のコンポーネント (インデックス 0 の項目) を返します
17 Object get(int index)、ベクトル内の指定された位置にある要素を返します。
Object replace(intindex), move このベクトル内の指定された位置にある要素を削除します
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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。