文章目錄
- 1 Stack棧操作
- 2 Queue隊列
- 3 Properties屬性操作
- 4 Collections工具類
1 Stack棧操作
棧是一種先進後出的資料結構,其基本操作形式如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB1keNpWTyMmeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5ADN4ITM0ETMxMzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在Java程式裡面使用Stack來描述棧的操作,這個類的定義如下:
public class Stack<E>
extends Vector<E>
可以發現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描述的是一個隊列,而隊列的主要特點是實作先進先出的操作形式。其基本的操作形式如下:
如果将隊列應用在多線線程的“生産者與消費者”的模型處理上,那麼對于生産者過快的情況下就沒有必要等待消費者擷取資料了,可以将所有的内容直接儲存在隊列之中隊列的實作可以使用LinkedList子類來完成,觀察這個類的定義:
隊列的使用主要依靠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();
}
}
}
通過程式的執行可以發現,的确可以實作資源檔案的輸入處理,但是如果輸出的是中文則自動幫助使用者進行處理。
範例:讀取資源檔案
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提供的一組集合資料的操作工具類,也就是說利用它可以實作各個集合的操作。
範例:使用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是集合操作工具類。