1、LinkedList鏈表
序列分先進先出FIFO,先進后出FILO
FIFO在Java中又叫Queue 隊列
FILO在Java中又叫Stack 棧
- (1) LinkedList 與 List接口
與ArrayList一樣,LinkedList也實現(xiàn)了List接口,諸如add,remove,contains等等方法。 詳細使用,請參考 ArrayList 常用方法。
接下來是LinkedList的一些特別的地方
- (2)雙向鏈表 Deque
除了實現(xiàn)了List接口外,LinkedList還實現(xiàn)了雙向鏈表結(jié)構(gòu)Deque,可以很方便的在頭尾插入刪除數(shù)據(jù)
public static void Deque(){
//LinkedList是一個雙向鏈表結(jié)構(gòu)的list
LinkedList<Hero> linkedList = new LinkedList<>();
linkedList.add(new Hero("hero1"));
linkedList.addLast(new Hero("hero2"));
linkedList.add(new Hero("hero3"));
System.out.println(linkedList);
linkedList.addFirst(new Hero("hero0"));
System.out.println(linkedList);
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
System.out.println(linkedList.removeFirst());
System.out.println(linkedList.removeLast());
System.out.println(linkedList);
}
- (3)隊列 Queue
LinkedList 除了實現(xiàn)了List和Deque外,還實現(xiàn)了Queue接口(隊列)。
Queue是先進先出隊列 FIFO,常用方法:
offer 在最后添加元素
poll 取出第一個元素
peek 查看第一個元素
public static void Quene(){
LinkedList linkedList = new LinkedList<Hero>();
Queue<Hero> q = new LinkedList<Hero>();
q.offer(new Hero("Hero1"));
q.offer(new Hero("Hero2"));
q.offer(new Hero("Hero3"));
q.offer(new Hero("Hero4"));
System.out.println(q);
//取出第一個Hero,F(xiàn)IFO 先進先出
Hero h = q.poll();
System.out.println(q);
System.out.println(h);
//把第一個拿出來看一看,但是不取出來
h = q.peek();
System.out.println(q);
System.out.println(h);
}
2、二叉樹
- (1)二叉樹概念
二叉樹由各種節(jié)點組成
二叉樹特點:
每個節(jié)點都可以有左子節(jié)點,右子節(jié)點
每一個節(jié)點都有一個值
public class Node {
// 左子節(jié)點
public Node leftNode;
// 右子節(jié)點
public Node rightNode;
// 值
public Object value;
}
- (2)二叉樹排序 插入和遍歷
public class Node {
public Node leftNode;
public Node rightNode;
public Object value;
public void add(Object v){
if(null == value)
value = v;
else {
if((Integer)v-(Integer)value <= 0){
if(null == leftNode)
leftNode = new Node();
leftNode.add(v);
}
else {
if (null == rightNode)
rightNode = new Node();
rightNode.add(v);
}
}
}
public List<Object> values(){
List<Object>values = new ArrayList<>();
if(null != leftNode)
values.addAll(leftNode.values());
values.add(value);
if(null != rightNode)
values.addAll(rightNode.values());
return values;
}
public static void main(String[] args) {
int randoms[] = new int[]{67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
Node roots = new Node();
for(int number: randoms){
roots.add(number);
}
System.out.println(roots.values());
}
}
3、HashMap
HashMap儲存數(shù)據(jù)的方式是—— 鍵值對
對于HashMap而言,key是唯一的,不可以重復的。
所以,以相同的key 把不同的value插入到 Map中會導致舊元素被覆蓋,只留下最后插入的元素。
不過,同一個對象可以作為值插入到map中,只要對應(yīng)的key不一樣
public class HashMapTest
{
public static void main(String[] args) {
HashMap<String,String> dict = new HashMap<>();
dict.put("abc" ,"物理英雄");
dict.put("apc","魔法英雄");
dict.put("t", "坦克");
System.out.println(dict.get("t"));
}
}
4、HashSet
Set中的元素,不能重復
Set中的元素,沒有順序。
嚴格的說,是沒有按照元素的插入順序排列
public class TestCollection {
public static void main(String[] args) {
HashSet<String> names = new HashSet<String>();
names.add("gareen");
System.out.println(names);
//第二次插入同樣的數(shù)據(jù),是插不進去的,容器中只會保留一個
names.add("gareen");
System.out.println(names);
}
}
- Set不提供get()來獲取指定位置的元素
所以遍歷需要用到迭代器,或者增強型for循環(huán)
//遍歷Set可以采用迭代器iterator
for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) {
Integer i = (Integer) iterator.next();
System.out.println(i);
}
//或者采用增強型for循環(huán)
for (Integer i : numbers) {
System.out.println(i);
}