数据结构java应用案例教程_Java入门 - 高级教程 - 01.数据结构

请参照如上章节导航进行阅读

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

枚举(Enumeration)

位集合(BitSet)

向量(Vector)

栈(Stack)

字典(Dictionary)

哈希表(Hashtable)

属性(Properties)

以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection),我们后面再讨论。

枚举(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

-----------------------

向量(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 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 v2 = new Vector<>();

List 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

------------------------

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

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

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

实例:

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

import java.util.Enumeration;

import java.util.Stack;

public class StackTest {

public static void main(String[] args) {

Stack stack1 = new Stack<>();

stack1.push("aaa");

stack1.push("bbb");

stack1.push("ccc");

System.out.println(stack1);

//显示枚举(stack )中的所有元素

Enumeration 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

---------------------

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

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

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

实例:

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

import java.util.Dictionary;

import java.util.Enumeration;

import java.util.Hashtable;

public class DictionaryTest {

private static Dictionary dic = new Hashtable();

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 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 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,

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 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 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,

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群,及时关注我们的课程更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值