java學習筆記(Core Java) 9 泛型

來源:互聯網
上載者:User

標籤:優先順序   枚舉類   interface   高效   ring   hashmap   介面與實現分離   pem   ace   

集合介面
一、引言:
介面與實現分離,使用隊列舉例
//提供介面規範
interface Queue
{...}
//具體實現
class LinkedListQueue<E> impements Queue<E> {...}
class CircularArrayQueue<E> impements Queue<E> {...}

Queue<Customer> e = new LinkedListQueue<Customer>

二、迭代器
1.集合類基本介面是Collection,該介面包括兩種基本方法:
public interface Collection
{
boolean add(E element);
Iterator<E> iterator();
...
}

public interface Iterator<E>
{
E next();
boolean hasNext();
void remove();
}
在javase 5.0起,可以使用for each的方式迴圈操作
for each可以與任何實現了Iterable介面的對象一起工作
public interface Iterable<E>
{
iterator<E> iterator();
}

C++:與C++不同。c++迭代器指標可以單獨的在stl模板上進行移動。
for(vector<int>::Iterable it = vect.begin(); it != vect.end(); it++) 通過對指標解引用可以擷取指標所引用對象的值
但是java不同,java遍曆整個集合時,必須調用next方法,指標才會向下移動。每次移動之前,都需要hasNext判斷下一個值是否存在。從某種意義上說。尋找操作指標移動時緊密相連的。

2.刪除元素
iterator介面中remove方法時刪除上次next方法返回時的元素。因此在調用remove方法時,必須首先要調用next方法。
3.泛型的實用方法(舉例)
public static <E> boolean contains(Collection<E> c, object obj)
{
for(E element:c)
if(element.equal(obj))
return true;
return false;
}
Collection介面聲明的很多類似於上述的泛型方法
比Collection更容易實現的抽象類別
public abstract class AbstractCollection<E> implements Collection<E>
{
public abstract Iterator iterator();
public boolean contance(object obj)
{
for(E element:c)
if(element.equal(obj))
return true;
return false;
}
...
}
//api 原書 567頁

三、具體集合
ArrayList 索引 vector
LinkedList 高效插入刪除 List
ArrayDeque 迴圈數組 雙端隊列
HastSet 沒有重複元素的無序集合
TreeSet 有序集合
EmnuSet 包含枚舉類型的集
LinkedHastSet 記住元素插入次序的集合
PriorityQueue 允許高效刪除最小元素的集合
HastMap 索引值對
TreeMap 有序排列的映射表
LinkedHastMap 記住索引值對插入次序的集合
WeakHashMap 值無效可以被記憶體回收期回收的映射表
IdentityHaspMap 使用==而不是equals比較索引值的映射表

set是沒有重複的元素集合

1.鏈表:
鏈表是一個有序集合,因此可以使用add方法將元素插入鏈表的任意位置。對於無序的集合HastSet則沒有該方法
ListIterator介面中也有兩個方法用於逆向遍曆
E previous(); 反向遍曆元素
boolean hasPrevious()

remove始終刪除上一次 next/previous 剛剛遍曆的元素
add方法依賴於迭代器的位置
remove方法依賴於迭代器的狀態

set的方法用於替換 next/previous 剛剛遍曆的元素
ListIterator<String> iter = list.listIterator();
String oldValue = iter.next();
iter.set(newValue);

迭代器指向兩個元素之間,因此可以返回兩個指向的對象。使用nextIndex方法返回下一個將要遍曆的元素的整數索引。previous返回剛剛遍曆元素的整數索引

get方法,效率不高。。。
簡單例子:
List<String> a = new LinkedList();
a.add("hh")
ListIterator<String> iter = a.listIterator();
while(iter.hasNext())
{
a.next();
a.remove();
}

//api 原書 575頁

C++:
list<string> list;
list<string>::iterator iter;

list.push_back("hh");

for(it = list.begin(); it != list.end; it++)
{
std::cout << *it << std::end;
}

2.數組列表 ArrayList
與list相同。但是,對於以數組為底層封裝的列表來說,set/get方法將變得非常有用

3.散列集 快速尋找需要的對象
散列表為每個對象計算一個整數,成為散列碼
散列碼是由對象的實際域產生的一個整數
具有不同資料域的對象將產生不同的散列碼
(如果自訂網域,就要實現HashCode方法。實現的方法要與equal方法相同,即a.equal(b)為true時,a,b必須有相同的散列碼) ==》具體第五章

散列表使用鏈表數組實現。每個列表稱之為桶。要尋找表中對象的位置,就要計算它的散列碼,然後與桶的餘數取餘。得到該對象元素的索引。

set是沒有重複的元素集合。contains方法重新定義可以快速查看元素是否已經插入。使用add方法添加元素。它的訪問順序幾乎是隨機的。

//api 原書 578頁

4.樹集
TreeSet與散列集十分類似,它是一個有序集合,可以以任意順序將元素插入集合。遍曆時將依次訪問。

將元素添加到TreeSet比添加到散列錶慢,但是比將元素添加到鏈表或數組的正確位置上還是快很多。並且,TreeSet還可以自動排序

TreeSet();
TreeSet(Collection<? extends E> elements);

5.對象的比較 compareTo方法和equal方法

6.隊列與雙端隊列 (不支援在隊列中間添加元素)
Javase6 引入了Deque介面,並由ArrayDeque和LinkedList類實現

 

api:
//如果滿了,拋出異常IIlegalStateException
boolean add(E element);
//如果滿了,返回false
boolean offer(E element);

//如果不為空白,刪除並返回頭部元素,如果為空白,拋出異常NoSuchElementException
E remove();
//同上,如果為空白,返回null
E poll();

//如果不為空白,返回頭部元素不刪除,如果為空白,拋出異常NoSuchElementException
E element();
//同上,如果為空白,返回null
E peek();

//如果滿了,拋出異常IIlegalStateException
void addFirst(E element)
void addLast(E element)
//如果滿了,返回false
boolean offerFirst(E element)
boolean offerLast(E element)

//如果不為空白,刪除並返回頭部元素,如果為空白,拋出異常NoSuchElementException
E removeFirst();
E removeLast();
//同上,如果為空白,返回null
E pollFirst();
E pollLast();

//如果不為空白,刪除並返回頭部元素,如果為空白,拋出異常NoSuchElementException
E getFirst();
E getLast();
//同上,如果為空白,返回null
E peekFirst();
E peekLast();

ArrayDeque();
ArrayDeque(int initialCapacity);
//初始容量16或給定初始容量構造一個無限雙端隊列

7.優先順序隊列
元素可以任意順序輸入,卻總是按照排序次序檢索。無論何時調用remove方法,總是會擷取當前優先順序隊列中最小元素,但是,優先順序隊列並沒有進行排序。
使用資料結構==》 堆
堆是一個可以自我調整的二叉樹。可以讓最小元素移動到樹根而不必花時間進行排序。

典型案例: 任務調度
PriorityQueue();

//構造一個用於存放Compareable對象的優先順序隊列
PriorityQueue(int initialCapacity);
//構造一個優先順序隊列,並用指定比較子對元素排序
PriorityQueue();

8.映射表 索引值對 --------------字典
HashMap(散列映射表)和TreeMap(樹映射表),這兩個類都實現了Map介面
散列映射表對鍵進行散列
樹映射表用鍵的整體順序進行排序,並組成搜尋樹

散列稍微快一點,如果不需要按照順序訪問,最好選擇散列

put方法新增或者更改鍵對應的值
remove();刪除鍵對應的值 size();//返回元素個數

java學習筆記(Core Java) 9 泛型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.