㈠ java語言中用LinkList實現堆棧
棧和隊列是兩種特殊的線性表,它們的邏輯結構和線性表相同,只是其運算規則較線性表有更多的限制,故又稱它們為運算受限的線性表。
LinkedList數據結構是一種雙向的鏈式結構,每一個對象除了數據本身外,還有兩個引用,分別指向前一個元素和後一個元素,和數組的順序存儲結構(如:ArrayList)相比,插入和刪除比較方便,但速度會慢一些。
棧的定義
棧(Stack)是限制僅在表的一端進行插入和刪除運算的線性表。
(1)通常稱插入、刪除的這一端為棧頂(Top),另一端稱為棧底(Bottom)。
(2)當表中沒有元素時稱為空棧。
(3)棧為後進先出(Last In First Out)的線性表,簡稱為LIFO表。
棧的修改是按後進先出的原則進行。每次刪除(退棧)的總是當前棧中"最新"的元素,即最後插入(進棧)的元素,而最先插入的是被放在棧的底部,要到最後才能刪除。
實現代碼:
package com.weisou.dataStruct;
import java.util.LinkedList;
@SuppressWarnings("unchecked")
public class MyStack {
LinkedList linkList = new LinkedList<Object>();
public void push(Object object) {
linkList.addFirst(object);
}
public boolean isEmpty() {
return linkList.isEmpty();
}
public void clear() {
linkList.clear();
}
// 移除並返回此列表的第一個元素
public Object pop() {
if (!linkList.isEmpty())
return linkList.removeFirst();
return "棧內無元素";
}
public int getSize() {
return linkList.size();
}
public static void main(String[] args) {
MyStack myStack = new MyStack();
myStack.push(2);
myStack.push(3);
myStack.push(4);
System.out.println(myStack.pop());
System.out.println(myStack.pop());
}
}
隊列定義
隊列(Queue)是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表
(1)允許刪除的一端稱為隊頭(Front)。
(2)允許插入的一端稱為隊尾(Rear)。
(3)當隊列中沒有元素時稱為空隊列。
(4)隊列亦稱作先進先出(First In First Out)的線性表,簡稱為FIFO表。
實現代碼:
package com.weisou.dataStruct;
import java.util.LinkedList;
/**
*
* @author gf
* @date 2009-11-13
*/
public class MyQueue {
LinkedList linkedList = new LinkedList();
//隊尾插
public void put(Object o){
linkedList.addLast(o);
//隊頭取 取完並刪除
public Object get(){
if(!linkedList.isEmpty())
return linkedList.removeFirst();
else
return "";
}
public boolean isEmpty(){
return linkedList.isEmpty();
}
public int size(){
return linkedList.size();
}
public void clear(){
linkedList.clear();
}
/**
* @param args
*/
public static void main(String[] args) {
MyQueue myQueue= new MyQueue();
myQueue.put(1);
myQueue.put(2);
myQueue.put(3);
System.out.println(myQueue.get());
}
}
㈡ java中常用的集合介面有哪些
集合主要有Collection和Map介面。
List特點:元素有放入順序,元素可重復
Map特點:元素按鍵值對存儲,無放入順序
Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
List介面有三個實現類:LinkedList,ArrayList,Vector
LinkedList:底層基於鏈表實現,鏈表內存是散亂的,每一個元素存儲本身內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢
ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基於線程安全的,效率低
Set介面有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet
SortedSet介面有一個實現類:TreeSet(底層由平衡二叉樹實現)
Query介面有一個實現類:LinkList
Map介面有三個實現類:HashMap,HashTable,LinkeHashMap
HashMap非線程安全,高效,支持null;HashTable線程安全,低效,不支持null
SortedMap有一個實現類:TreeMap
其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,存儲的是鍵值對
set 一般無序不重復.map kv 結構 list 有序 。
㈢ java中ArrayList和LinkedList有什麼區別,分別怎麼使用呢
ArrayList和LinkedList都實現了List介面,ArrayList的實現用的是數組,LinkedList是基於鏈表,ArrayList適合查找,LinkedList適合增刪。
ArrayList與LinkList兩者的區別:
ArrayList是基於索引的數據介面,它的底層是數組。它可以以O(1)時間復雜度對元素進行隨機訪問。
相對於ArrayList,LinkedList的插入,添加,刪除操作速度更快,因為當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。
LinkedList比ArrayList更占內存,因為LinkedList為每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
但是要刪除數據卻是開銷很大的,因為這需要重排數組中的所有數據。
2) 相對於 ArrayList , LinkedList 插入是更快的。因為 LinkedList 不像 ArrayList 一樣,不需要改變數組的大小,也不需要在數組裝滿的時候要將所有的數據重新裝入一個新的數組,這是 ArrayList 最壞的一種情況,時間復雜度是 O(n) ,而 LinkedList 中插入或刪除的時間復雜度僅為 O(1) 。 ArrayList 在插入數據時還需要更新索引(除了插入數組的尾部)。
3) 類似於插入數據,刪除數據時, LinkedList 也優於 ArrayList 。
4) LinkedList 需要更多的內存,因為 ArrayList 的每個索引的位置是實際的數據,而 LinkedList 中的每個節點中存儲的是實際的數據和前後節點的位置 ( 一個 LinkedList 實例存儲了兩個值: Node<E> first 和 Node<E> last 分別表示鏈表的其實節點和尾節點,每個 Node 實例存儲了三個值: E item,Node next,Node pre) 。
什麼場景下更適宜使用 LinkedList,而不用ArrayList
1) 你的應用不會隨機訪問數據 。因為如果你需要LinkedList中的第n個元素的時候,你需要從第一個元素順序數到第n個數據,然後讀取數據。
2) 你的應用更多的插入和刪除元素,更少的讀取數據 。因為插入和刪除元素不涉及重排數據,所以它要比ArrayList要快。