天天看點

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群

,及時關注我們的課程更新
Java入門 - 進階教程 - 01.資料結構資料結構
Java入門 - 進階教程 - 01.資料結構資料結構