JAVA的Collections類
阿新 • • 發佈:2018-11-21
1.shuffle的用法
就是隨機打亂原來的順序,和洗牌一樣。有人戲稱轉為打麻將設計的,如:
// ShuffleTest.java import java.util.*; public class ShuffleTest { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10; i++) list.add(new Integer(i)); System.out.println("打亂前:"); System.out.println(list); for (int i = 0; i < 5; i++) { System.out.println("第" + i + "次打亂:"); Collections.shuffle(list); System.out.println(list); } } }
2.Queue中 add/offer,element/peek,remove/poll區別
1、add()和offer()區別:
add()和offer()都是向佇列中新增一個元素。一些佇列有大小限制,因此如果想在一個滿的佇列中加入一個新項,呼叫 add() 方法就會丟擲一個 unchecked 異常,而呼叫 offer() 方法會返回 false。因此就可以在程式中進行有效的判斷!
2、poll()和remove()區別:
remove() 和 poll() 方法都是從佇列中刪除第一個元素。如果佇列元素為空,呼叫remove() 的行為與 Collection 介面的版本相似會丟擲異常,但是新的 poll() 方法在用空集合呼叫時只是返回 null。因此新的方法更適合容易出現異常條件的情況。
3、element() 和 peek() 區別:
element() 和 peek() 用於在佇列的頭部查詢元素。與 remove() 方法類似,在佇列為空時, element() 丟擲一個異常,而 peek() 返回 null。
正兒八經的用法,我來設計一個權重:
/** * 選取一個合適的address,可以隨機獲取等,內部可以使用合適的演算法. * * @return */ InetSocketAddress selector(); --------------- // 用來儲存當前provider所接觸過的地址記錄,當zookeeper叢集故障時,可以使用trace中地址,作為"備份" private Set<String> trace = new HashSet<String>(); private final List<InetSocketAddress> container = new ArrayList<InetSocketAddress>(); private Queue<InetSocketAddress> inner = new LinkedList<InetSocketAddress>(); @Override public InetSocketAddress selector() { if (inner.isEmpty()) { if (!container.isEmpty()) { inner.addAll(container); } else if (!trace.isEmpty()) { synchronized (lock) { for (String hostname : trace) { container.addAll(transfer(hostname)); } Collections.shuffle(container); inner.addAll(container); } } } return inner.poll(); }
-----
更多關於Java的程式碼講解:https://github.com/singgel/Java-algorithms/tree/master/src/test/java/com/hks/eightsortingalgorithms