Java入門 - 高級教程 - 01.數據結構

原文地址:http://www.work100.net/training/java-data-structure.html
更多教程:光束雲 - 免費課程

數據結構

序號 文內章節 視頻
1 概述 -
2 枚舉 -
3 向量 -
4 -
5 字典 -
6 哈希表 -
7 屬性 -

請參照如上章節導航進行閱讀

1.概述

Java工具包提供了強大的數據結構。在Java中的數據結構主要包括以下幾種接口和類:

  • 枚舉(Enumeration)
  • 位集合(BitSet)
  • 向量(Vector)
  • 棧(Stack)
  • 字典(Dictionary)
  • 哈希表(Hashtable)
  • 屬性(Properties)

以上這些類是傳統遺留的,在Java2中引入了一種新的框架-集合框架(Collection),我們後面再討論。

2.枚舉(Enumeration)

枚舉(Enumeration)接口雖然它本身不屬於數據結構,但它在其他數據結構的範疇裏應用很廣。 枚舉(The Enumeration)接口定義了一種從數據結構中取回連續元素的方式。

例如,枚舉定義了一個叫 nextElement 的方法,該方法用來得到一個包含多元素的數據結構的下一個元素。

實例:

創建一個 EnumTest.java 類文件,定義一個 Lang 枚舉,代碼如下:

public class EnumTest {

    enum Lang{
        zh_CN,
        en
    }

    public static void main(String[] args) {
        System.out.println("Lang: " + Lang.zh_CN);
        System.out.println("-----------------------");
    }
}

運行結果如下:

Lang: zh_CN
-----------------------

現在定義個功能增強的、可獲取語言編碼的 LanguageEnum 枚舉,代碼如下:

public class EnumTest {
    enum LanguageEnum {

        /**
         * 英文
         */
        LANGUAGE_EN("en"),
        /**
         * 簡體中文
         */
        LANGUAGE_ZH_CN("zh_CN"),
        /**
         * 繁體中文
         */
        LANGUAGE_ZH_TW("zh_TW");

        private String language;

        LanguageEnum(String language) {
            this.language = language;
        }

        /**
         * 獲取指定語言類型(如果沒有對應的語言類型,則返回中文)
         *
         * @param language 語言類型
         * @return
         */
        public static String getLanguage(String language) {
            if (isEmpty(language)) {
                return LANGUAGE_ZH_CN.language;
            }
            for (LanguageEnum languageEnum : LanguageEnum.values()) {
                if (languageEnum.language.equalsIgnoreCase(language)) {
                    return languageEnum.language;
                }
            }
            return LANGUAGE_ZH_CN.language;
        }
    }

    public static void main(String[] args) {
        System.out.println("默認語言:" + LanguageEnum.getLanguage(""));
        System.out.println("語言:" + LanguageEnum.getLanguage("en"));
        System.out.println("語言:" + LanguageEnum.getLanguage("none"));
        System.out.println("-----------------------");
    }

    public static boolean isEmpty(Object str) {
        return str == null || "".equals(str);
    }
}

運行結果如下:

默認語言:zh_CN
語言:en
語言:zh_CN
-----------------------

枚舉還可以定義多屬性,代碼如下:

public class EnumTest {

    enum HttpStatus{
        OK(200, "OK"),
        BAD_REQUEST(400, "BAD REQUEST"),
        UNAUTHORIZED(401, "UNAUTHORIZED"),
        PAYMENT_REQUIRED(402, "PAYMENT REQUIRED"),
        FORBIDDEN(403, "FORBIDDEN"),
        NOT_FOUND(404, "NOT FOUND");

        /**
         * 返回碼
         */
        private int code;

        /**
         * 返回信息
         */
        private String message;

        HttpStatus(int code, String message){
            this.code = code;
            this.message = message;
        }

        public int getCode() {
            return code;
        }

        public String getMessage() {
            return message;
        }
    }

    public static void main(String[] args) {
        System.out.println("HttpStatus Code: " + HttpStatus.OK.getCode() + ", Message: " + HttpStatus.OK.getMessage());
        System.out.println("HttpStatus Code: " + HttpStatus.NOT_FOUND.getCode() + ", Message: " + HttpStatus.NOT_FOUND.getMessage());
        System.out.println("-----------------------");
    }
}

運行結果如下:

HttpStatus Code: 200, Message: OK
HttpStatus Code: 404, Message: NOT FOUND
-----------------------

3.向量(Vector)

向量(Vector)類和傳統數組非常相似,但是 Vector 的大小能根據需要動態的變化。

和數組一樣,Vector 對象的元素也能通過索引訪問。

使用 Vector 類最主要的好處就是在創建對象的時候不必給對象指定大小,它的大小會根據需要動態的變化。

實例:

新建 VictorTest.java 文件,代碼如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class VictorTest {
    public static void main(String[] args) {
        Vector<Integer> v1 = new Vector<>();

        v1.addElement(new Integer(1));
        v1.add(1, new Integer(20));
        System.out.println(v1);
        System.out.println(v1.get(0));
        System.out.println(v1.get(1));
        System.out.println("------------------------");

        Vector<String> v2 = new Vector<>();
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        v2.addAll(list);
        System.out.println(v2);
        System.out.println(v2.firstElement());
        System.out.println(v2.lastElement());
        System.out.println("------------------------");
    }
}

運行結果如下:

[1, 20]
1
20
------------------------
[aaa, bbb, ccc]
aaa
ccc
------------------------

4.棧(Stack)

棧(Stack)實現了一個後進先出(LIFO)的數據結構。

你可以把棧理解爲對象的垂直分佈的棧,當你添加一個新元素時,就將新元素放在其他元素的頂部。

當你從棧中取元素的時候,就從棧頂取一個元素。換句話說,最後進棧的元素最先被取出。

實例

新建 StackTest.java 文件,代碼如下:

import java.util.Enumeration;
import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        Stack<String> stack1 = new Stack<>();
        stack1.push("aaa");
        stack1.push("bbb");
        stack1.push("ccc");
        System.out.println(stack1);
        //顯示枚舉(stack )中的所有元素
        Enumeration<String> elements1 = stack1.elements();
        while (elements1.hasMoreElements())
        {
            System.out.print(elements1.nextElement() + " ");
        }
        System.out.println();
        System.out.println(stack1.peek()); // 返回棧頂元素,不移除
        System.out.println(stack1.search("ccc"));

        System.out.println(stack1.pop()); // 彈出棧頂元素
        System.out.println(stack1.search("ccc"));
        System.out.println(stack1.pop());
        System.out.println(stack1.pop());
        System.out.println("---------------------");

        Stack stack2 = new Stack();
        stack2.push(123);
        stack2.push("abc");
        stack2.push(123.05f);
        System.out.println(stack2);
        System.out.println(stack2.pop());
        System.out.println(stack2.pop());
        System.out.println(stack2.pop());
        System.out.println("---------------------");
    }
}

運行結果如下:

[aaa, bbb, ccc]
aaa bbb ccc 
ccc
1
ccc
-1
bbb
aaa
---------------------
[123, abc, 123.05]
123.05
abc
123
---------------------

5.字典(Dictionary)

字典(Dictionary) 類是一個抽象類,它定義了鍵映射到值的數據結構。

當你想要通過特定的鍵而不是整數索引來訪問數據的時候,這時候應該使用 Dictionary

由於 Dictionary 類是抽象類,所以它只提供了鍵映射到值的數據結構,而沒有提供特定的實現。

實例

新建 DictionaryTest.java 文件,代碼如下:

import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;

public class DictionaryTest {
    private static Dictionary<String, Object> dic = new Hashtable<String, Object>();

    public static void main(String[] args) {
        dic.put("key1", 123);
        dic.put("key2", "abc");
        dic.put("key3", 123.05f);

        System.out.println(dic);
        System.out.println("size: " + dic.size());
        Enumeration<Object> elements = dic.elements();
        while (elements.hasMoreElements()) {
            System.out.print(elements.nextElement() + " ");
        }
        System.out.println();
        System.out.println("key1=" + dic.get("key1"));
        System.out.println("key2=" + dic.get("key2"));
        System.out.println("key3=" + dic.get("key3"));
        Enumeration<String> keys = dic.keys();
        while (keys.hasMoreElements()){
            String key = keys.nextElement();
            System.out.print(key + "=" + dic.get(key) + ", ");
        }
        System.out.println();
    }
}

運行結果如下:

{key3=123.05, key2=abc, key1=123}
size: 3
123.05 abc 123 
key1=123
key2=abc
key3=123.05
key3=123.05, key2=abc, key1=123, 

6.哈希表(Hashtable)

Hashtable 類提供了一種在用戶定義鍵結構的基礎上來組織數據的手段。

例如,在地址列表的哈希表中,你可以根據郵政編碼作爲鍵來存儲和排序數據,而不是通過人名。

哈希表鍵的具體含義完全取決於哈希表的使用情景和它包含的數據。

實例:

新建 HashtableTest.java 文件,代碼如下:

import java.util.Enumeration;
import java.util.Hashtable;

public class HashtableTest {
    public static void main(String[] args) {
        Hashtable ht = new Hashtable();
        ht.put("key1", 123);
        ht.put("key2", "abc");
        ht.put("key3", 123.05f);

        System.out.println(ht);
        System.out.println("size: " + ht.size());
        Enumeration<Object> elements = ht.elements();
        while (elements.hasMoreElements()) {
            System.out.print(elements.nextElement() + " ");
        }
        System.out.println();
        System.out.println("key1=" + ht.get("key1"));
        System.out.println("key2=" + ht.get("key2"));
        System.out.println("key3=" + ht.get("key3"));
        Enumeration<String> keys = ht.keys();
        while (keys.hasMoreElements()){
            String key = keys.nextElement();
            System.out.print(key + "=" + ht.get(key) + ", ");
        }
        System.out.println();
    }
}

運行結果如下:

{key3=123.05, key2=abc, key1=123}
size: 3
123.05 abc 123 
key1=123
key2=abc
key3=123.05
key3=123.05, key2=abc, key1=123, 

7.屬性(Properties)

Properties 繼承於 Hashtable.Properties 類表示了一個持久的屬性集.屬性列表中每個鍵及其對應值都是一個字符串。

Properties 類被許多Java類使用。例如,在獲取環境變量時它就作爲 System.getProperties() 方法的返回值。

實例:

新建 PropertiesTest.java 文件,代碼如下:

import java.io.*;
import java.util.Date;
import java.util.Properties;

public class PropertiesTest {
    public static void main(String[] args) {
        // 寫入屬性
        writeProperties();
        System.out.println("---------------------");

        // 讀取屬性
        readProperties();
        System.out.println("---------------------");
    }

    static void writeProperties() {
        Properties properties = new Properties();
        OutputStream output = null;
        try {
            output = new FileOutputStream("config.properties");
            properties.setProperty("url", "jdbc:mysql://localhost:3306/");
            properties.setProperty("username", "root");
            properties.setProperty("password", "root");
            properties.setProperty("database", "users");//保存鍵值對到內存
            properties.store(output, "Xiaojun modify" + new Date().toString());
            // 保存鍵值對到文件中
            System.out.println("寫入完成");
        } catch (IOException io) {
            io.printStackTrace();
        } finally {
            if (output != null) {
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static void readProperties() {

        try {
            InputStream in = new BufferedInputStream(new FileInputStream(new File("config.properties")));
            Properties prop = new Properties();

            prop.load(in);
            System.out.println("url: " + prop.getProperty("url"));
            System.out.println("username: " + prop.getProperty("username"));
            System.out.println("password: " + prop.getProperty("password"));
            System.out.println("database: " + prop.getProperty("database"));
            System.out.println("讀取完成");
        } catch (FileNotFoundException e) {
            System.out.println("properties文件路徑書寫有誤,請檢查!");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

運行結果如下:

寫入完成
---------------------
url: jdbc:mysql://localhost:3306/
username: root
password: root
database: users
讀取完成
---------------------

下一篇:集合


如果對課程內容感興趣,可以掃碼關注我們的 公衆號QQ羣,及時關注我們的課程更新

公衆號
QQ交流羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章