Java数据结构


Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:


 枚举(Enumeration)

枚举(Enumeration)接口虽然它本身不属于数据结构,但是它在其他数据结构的范畴里应用很广。枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。

例如,枚举定义了一个叫nextElement的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。

package pkg2020华南虎;

import java.util.Vector;
import java.util.Enumeration;

/**
 *
 * @author yl
 */
public class EnumerationDemo {

    public static void main(String[] args) {
        Enumeration<String> days;
        Vector<String> dayNames = new Vector<String>();
        dayNames.add("Sunday");
        dayNames.add("Monday");
        dayNames.add("Tueaday");
        dayNames.add("Wednsday");
        dayNames.add("Thursday");
        dayNames.add("Friday");
        dayNames.add("Saturday");
        days = dayNames.elements();
        while (days.hasMoreElements()) {
            System.out.println(days.nextElement());
        }
    }
}

 

位集合(BitSet)

 位集合类实现了一组可以单独设置和清除的位或者标志。

该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一“位”,然后对位进行适当的设置或者清除,就可以对布尔值进行操作了。

package pkg2020华南虎;

import java.util.BitSet;

/**
 *
 * @author yl
 */
public class BitSetDemo {

    public static void main(String[] args) {
        BitSet bits1 = new BitSet(16);
        BitSet bits2 = new BitSet(16);

        //set some bits
        for (int i = 0; i < 16; i++) {
            if ((i % 2) == 0) {
                bits1.set(i);
            }
            if ((i % 2) != 0) {
                bits2.set(i);
            }
        }
        System.out.println("Initial pattern in bits1:");
        System.out.println(bits1);
        System.out.println("Initial pattern in bits2");
        System.out.println(bits2);

        //AND bits
        bits2.and(bits1);
        System.out.println("bits2 and bits1 :");
        System.out.println(bits2);

        //OR bits
        bits2.or(bits1);
        System.out.println("bits2 or bits1:");
        System.out.println(bits2);

        //XOR bits
        bits2.xor(bits1);
        System.out.println("bits2 xor bits1");
        System.out.println(bits2);
    }
}
/*一个Bitset类创建一种特殊类型的数组来保存位值。Bitset中数组大小会随需要增加。这和位向量(Vector of bits)比较类似*/

 

向量(Vector)

 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。

和数组一样,Vector对象的元素也能通过索引访问。

使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。

package pkg2020华南虎;

import java.util.*;

/**
 *
 * @author yl
 */
public class VectorDemo02 {

    public static void main(String[] args) {
        //initial size is 3,imcrement is 2
        Vector v = new Vector(3, 2);
        System.out.println("Initial size:" + v.size());
        System.out.println("Initial capacity:"
                + v.capacity());
        v.addElement(new Integer(1));
        v.addElement(new Integer(2));
        v.addElement(new Integer(3));
        v.addElement(new Integer(4));
        System.out.println("Capacity after four additions:"
                + v.capacity());
        v.addElement(new Double(5.45));
        System.out.println("Current capacity:"
                + v.capacity());
        v.addElement(new Double(6.08));
        v.addElement(new Integer(7));
        System.out.println("Current capacity:"
                + v.capacity());
        v.addElement(new Float(9.4));
        v.addElement(new Integer(10));
        System.out.println("Current capacity:"
                + v.capacity());
        v.addElement(new Integer(11));
        v.addElement(new Integer(12));
        System.out.println("First element:"
                + (Integer) v.firstElement());
        System.out.println("Last element:"
                + (Integer) v.lastElement());
        if (v.contains(new Integer(3))) {
            System.out.println("Vector contains 3.");
        }
        Enumeration vEnum = v.elements();
        System.out.println("\nElements in vector:");
        while (vEnum.hasMoreElements()) {
            System.out.println(vEnum.nextElement() + " ");
        }
        System.out.println();
    }
}

 

结果:

run:
Initial size:0
Initial capacity:3
Capacity after four additions:5
Current capacity:5
Current capacity:7
Current capacity:9
First element:1
Last element:12
Vector contains 3.

Elements in vector:
1 
2 
3 
4 
5.45 
6.08 
7 
9.4 
10 
11 
12 

 

栈(Stack)

 栈(Stack)实现了一个后进先出(LIFO)的数据结构。

你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。

当你从栈中获取元素,就从栈顶取一个元素,换句话说,最后进栈的元素最先被取出。

package pkg2020华南虎;

import java.util.*;

/**
 *
 * @author yl
 */
public class StackDemo {

    static void showpush(Stack<Integer> st, int a) {
        st.push(new Integer(a));
        System.out.println("push(" + a + ")");
        System.out.println("stack:" + st);
    }

    static void showpop(Stack<Integer> st) {
        System.out.println("pop->");
        Integer a = (Integer) st.pop();
        System.out.println(a);
        System.out.println("stack:" + st);
    }

    public static void main(String[] args) {
        Stack<Integer> st = new Stack<Integer>();
        System.out.println("stack:" + st);
        showpush(st, 42);
        showpush(st, 66);
        showpush(st, 99);
        showpop(st);
        showpop(st);
        showpop(st);
        try {
            showpop(st);
        } catch (EmptyStackException e) {
            System.out.println("empty stack");
        }
    }
}

  

结果:

run:
stack:[]
push(42)
stack:[42]
push(66)
stack:[42, 66]
push(99)
stack:[42, 66, 99]
pop->
99
stack:[42, 66]
pop->
66
stack:[42]
pop->
42
stack:[]
pop->
empty stack
成功构建 (总时间: 0 秒)

 

字典(Dictionary)

 字典(Dictionary)类是一个抽象类,它定义了键映射到值得数据结构。

当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用DIctionary。

由于Dictionary类是抽象类,所以它只提供了键映射到值得数据结构,而没有提供特定得实现。

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


 

哈希表(Hashtable)

 Hashtable类提供了一种在用户定义键结构的基础上来组织数据的手段。

例如,在地址列表的哈希表中,你可以根据邮政编码作为键来存储和排序数据,而不是通过人名。

哈希表键的具体含义完全取决于哈希表的使用场景和它包含的数据。

 

package pkg2020华南虎;

import java.util.*;

/**
 *
 * @author yl
 */
public class HashTableDemo {
    
    public static void main(String[] args) {
        //Create a hash map
        Hashtable balance = new Hashtable();
        Enumeration names;
        String str;
        double bal;
        
        balance.put("Zara", new Double(3434.34));
        balance.put("Mahnaz", new Double(123.22));
        balance.put("Ayan", new Double(1378.00));
        balance.put("Daisy", new Double(99.22));
        balance.put("Qadir", new Double(-19.08));

        //Show all balances in hash table.
        names = balance.keys();
        while (names.hasMoreElements()) {
            str = (String) names.nextElement();
            System.out.println(str + ":"
                    + balance.get(str));
        }
        System.out.println();
        //Deposit 1,000 into Zara's account
        bal = ((Double) balance.get("Zara")).doubleValue();
        balance.put("Zara", new Double(bal + 1000));
        System.out.println("Zara's new balance:" + balance.get("Zara"));
        
    }
}

 

结果:

run:
Qadir:-19.08
Zara:3434.34
Mahnaz:123.22
Daisy:99.22
Ayan:1378.0

Zara's new balance:4434.34
成功构建 (总时间: 0 秒)

 

属性(Properties)

 Properities继承于Hashtable.Properties类表示了一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。

 Properties类被许多Java类使用。例如,在获取环境变量时它就作为System.getProperties()方法的返回值。

package pkg2020华南虎;

import java.util.*;

/**
 *
 * @author yl
 */
public class PropDemo {

    public static void main(String[] args) {
        Properties capitals = new Properties();
        Set states;
        String str;

        capitals.put("Illinois", "Springfield");
        capitals.put("Missouri", "Jefferson City");
        capitals.put("Washington", "Olympia");
        capitals.put("California", "Sacramento");
        capitals.put("Indiana", "Indianapolis");

        //Show all states and capitals in hashtable.
        states = capitals.keySet();
        Iterator itr = states.iterator();
        while (itr.hasNext()) {
            str = (String) itr.next();
            System.out.println("The capital of"
                    + str + "is" + capitals.getProperty(str) + "."
            );
        }
        System.out.println();
        str = capitals.getProperty("Florida", "Not Found");
        System.out.println("The capital of Florida is"
                + str + "."
        );
    }
}

 

posted @ 2020-02-10 17:52  yl新蜜蜂  阅读(165)  评论(0编辑  收藏  举报