原文位址: http://www.work100.net/training/java-data-structure.html 更多教程: 光束雲 - 免費課程
資料結構
請參照如上
章節導航
進行閱讀
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群
