天天看點

00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

文章目錄

  • 1 Stack棧操作
  • 2 Queue隊列
  • 3 Properties屬性操作
  • 4 Collections工具類

1 Stack棧操作

棧是一種先進後出的資料結構,其基本操作形式如下:

00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

在Java程式裡面使用Stack來描述棧的操作,這個類的定義如下:

public class Stack<E>
extends Vector<E>
           
00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

可以發現Stack是Vector子類,但是它使用的并不是Vector類之中所提供的方法,而是采用如下的兩個方法:

(1)入棧:

public E push​(E item)

(2)出棧:

public E pop()

範例:實作棧的操作

package org.lks.demo;

import java.util.Stack;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		Stack<String> stack = new Stack<String>();
		stack.push("hello");
		stack.push("world");
		stack.push("wuwwu");
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
	}
}

/*
wuwwu
world
hello
Exception in thread "main" java.util.EmptyStackException
	at java.base/java.util.Stack.peek(Stack.java:102)
	at java.base/java.util.Stack.pop(Stack.java:84)
	at javasenior/org.lks.demo.JavaReflectDemo.main(JavaReflectDemo.java:14)
*/
           

通過此時的操作可以發現,所有的資料儲存之後将按照倒序的形式進行彈出,如果棧已經空了,則會抛出

EmptyStackException

異常。

2 Queue隊列

Queue描述的是一個隊列,而隊列的主要特點是實作先進先出的操作形式。其基本的操作形式如下:

00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

如果将隊列應用在多線線程的“生産者與消費者”的模型處理上,那麼對于生産者過快的情況下就沒有必要等待消費者擷取資料了,可以将所有的内容直接儲存在隊列之中隊列的實作可以使用LinkedList子類來完成,觀察這個類的定義:

00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

隊列的使用主要依靠Queue接口之中提供的方法來處理,提供有如下方法:

(1)向隊列之中追加資料:

boolean offer​(E e)

,可以直接使用add()方法;

(2)通過隊列擷取資料:

E poll()

,彈出後删除資料。

範例:實作隊列操作

package org.lks.demo;

import java.util.LinkedList;
import java.util.Queue;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		Queue<String> queue = new LinkedList<String>();
		queue.add("hello");  //use add() to add element, return true or false
		queue.offer("world");  //use offer() to add element. return true or false
		queue.offer("nihao");
		
		System.out.println(queue.poll());  //use poll() to get the head of the queue, if this queue is empty return null
		if(queue.peek() != null) {
			System.out.println(queue.remove());
		}
	}
}


           

除了LinkedList之類之外,還有一個優先級隊列的概念,可以使用實作優先級隊列

PriorityQueue<E>

(比較功能)。

範例:使用優先級隊列

package org.lks.demo;

import java.util.PriorityQueue;
import java.util.Queue;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		Queue<String> queue = new PriorityQueue<String>();
		queue.offer("Z");
		queue.offer("A");
		queue.offer("G");
		queue.offer("H");
		System.out.println(queue.toString());
	}
}
/*
[A, H, G, Z]
*/
           

對于隊列的選用原則也是需要根據實際項目環境來決定的。

3 Properties屬性操作

在之前學習國際化程式的時候學習過資源檔案(*.properties),那麼這類檔案的存儲結構是按照“key=value”的形式存儲的,而這種結構的儲存形式與Map集合很相似,但是唯一的差別在于其所儲存的内容隻能夠是字元串,是以為了可以友善的描述屬性的定義,java.util包裡面提供有Propertis類型,此類是Hashtable的子類。

可以發現在繼承Hashtable的時候為Hashtable中定義的泛型為Object,Properties是不需要操作泛型的,因為他可以操作的類型隻能是String類型,在Properties之中如果想要實作屬性操作可以采用如下的方法:

(1)設定屬性:

public Object setProperty​(String key, String value)

(2)取得屬性,key不存在傳回null:

public String getProperty​(String key)

(3)取得屬性,不存在傳回預設值:

public String getProperty​(String key, String defaultValue)

(4)輸出屬性内容:

public void store​(OutputStream out, String comments) throws IOException

(5)通過輸入流讀取屬性内容:

public void load​(InputStream inStream) throws IOException

範例:觀察屬性的設定和取得

package org.lks.demo;

import java.util.Properties;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		Properties prop = new Properties();
		prop.setProperty("lks", "hhy big fool");
		prop.setProperty("hhy", "you fuck!");
		System.out.println(prop.getProperty("lks"));
		System.out.println(prop.getProperty("zsl", "I'm fool"));
		System.out.println(prop.getProperty("zsl"));
	}
}

/*
hhy big fool
I'm fool
null
*/
           

通過代碼可以發現Properties裡面可以像Map集合那樣進行内容的設定與擷取,但是唯一的差别就是他隻能操作String類型,另外需要注意的是,之是以會提供有Properties類還有一個重要的功能是它可以通過輸出流輸出屬性,也可以使用輸入流讀取屬性内容。

範例:将屬性内容儲存在檔案之中

package org.lks.demo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		Properties prop = new Properties();
		prop.setProperty("lks", "hhy big fool, 哈哈");
		prop.setProperty("hhy", "you fuck!");
		try {
			prop.store(new FileOutputStream(new File("D:" + File.separator + "info.properties")), "中文注釋-English");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
           
00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

通過程式的執行可以發現,的确可以實作資源檔案的輸入處理,但是如果輸出的是中文則自動幫助使用者進行處理。

範例:讀取資源檔案

package org.lks.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		Properties prop = new Properties();
		try {
			prop.load(new FileInputStream(new File("D:" + File.separator + "info.properties")));
			System.out.println(prop.getProperty("hhy"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


           

使用Properties類型的最大特點是可以進行資源内容的輸入與輸出的處理操作,但是在實際的開發之中Properties往往用于讀取配置資源的資訊,這一點主要是在标準設計之中做程式初始化準備的時候使用。

4 Collections工具類

Collections是Java提供的一組集合資料的操作工具類,也就是說利用它可以實作各個集合的操作。

00 32Java進階之集合工具類1 Stack棧操作2 Queue隊列3 Properties屬性操作4 Collections工具類

範例:使用Collection操作List集合

package org.lks.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		List<String> list = new ArrayList<String>();
		Collections.addAll(list, "hhy", "big", "fool");
		System.out.println(list);
	}
}


           

範例:資料反轉

package org.lks.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		List<String> list = new ArrayList<String>();
		Collections.addAll(list, "hhy", "big", "fool");
		Collections.reverse(list);
		System.out.println(list);
	}
}


           

範例:使用二分查找

package org.lks.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class JavaReflectDemo {
	public static void main(String[] args) {	
		List<String> list = new ArrayList<String>();
		Collections.addAll(list, "hhy", "big", "fool");
		Collections.sort(list);
		System.out.println(list);
		System.out.println(Collections.binarySearch(list, "hhy"));
	}
}

/*
[big, fool, hhy]
2
*/
           

大部分情況下對于集合的使用可能沒有這麼多複雜要求,更多的情況下利用集合儲存資料要麼進行輸出要麼進行查詢。

面試題:請解釋Collection與Collections的差別?

(1)Collection是集合接口,允許儲存單值對象;

(2)Collections是集合操作工具類。