首先的分析JAVA有什麼些數據類型:java
一、常見的8大數據類型和數組跨域
數組特色:連續的內存地址數組
數組分爲:有序數組、無序數組安全
有序數組: 工具
檢索方式 : 單鏈、二分法、大數據
特色:不可重複、 插入慢查找慢this
無序數組: code
特色: 能夠重複對象
詳細可參照:http://blog.jobbole.com/68023/blog
存放數據:數組、集合
通常狀況下,咱們放數據都是將數據放在容器(也就是集合裏面)裏面。
那麼大多數集合是怎麼來得呢?那麼咱們看下底層代碼是怎麼實現的
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
從源碼裏面能夠看到,也就是說所謂的集合就是無限增加的數組。
那麼集合就會存在如下幾個問題:
一、檢索速度 二、安全性
如下先介紹Collection接口 (整個集合的祖先、也是單列集合)
在這個接口下面又作了一個set接口,和List接口
那麼set接口 和List接口的區別:
Set:檢索速度快,不能重複,無順序。。
List:有下標,可存儲重複的值,檢索效率不高。又稱數組集合系列。
Set下面的操做類(經常使用的)
HashSet、
TreeSet
HashSet
它每次存放數據,會獲得這個對象的hashcode值,而後拿到這個值除以一串數,按照這個除以以後的值放在Hashcode列裏面,當hashcode值相同的時候,會調用equals()方法。
優勢:節約內存
缺點:數據大檢索快。
TreeSet
樹形的存放結構,查找速度也比較快
數據查找相似於楊輝三角型,查找數據從上面,一個一個的比較下去。雖然查找數據相對於數組來講比較快,但數據很是大的時候,也不太妥。能夠想象Oracle裏面的表分區。
缺點:費內存
優勢:數據少比較快\自帶排序(彙集排序)。
若是放的是對象(沒法天然排序),那麼就須要實現一個比較器以下:
static class Dog implements java.lang.Comparable{
public void CompareTo(){
返回 1是大於。返回0是相同。返回-1是小於
}
}
Set總結:
add()的時候,先hashcode判斷,若是一致,在調用equals()方法。equals()返回爲false則添加進去。
也就是說HashSet根據這個hashcode的值,進行一個跨域,加快了檢索的速度。
List下面操做類(經常使用的)
ArrayList
無同步
Vector
與ArrayList方法相同,只是加上了同步關鍵字
Stack
內存結構:相似於彈夾,先進後出,子彈比如與數據。
push()壓入數據
pop()出棧
peek();拿到棧頂的數據。
LinkedList (鏈表集合)
一、單向鏈表
內存結構:相似於一個盒子,有頭有尾,頭部爲值,尾部爲下一個數據的地址。
存在BUG:從上往下找方便,可是從下往上找不到。
二、雙向鏈表
內存結構:有頭,有身體,有尾巴。 頭部存儲上一個數據的內存地址,身體存放值,尾部存放下一個數據的地址。
缺點:提取值比較慢。
優勢:增加是無限的,刪除和修改是很是靈活。
鏈表集合用在發短信的地方比較多。
Iterator迭代器:
每一個單列集合都定義了一個迭代器。由於無序集合不能按下標得值,因此須要迭代器拿值。
hasNext()有對象嗎? true表示有對象,false表示無對象。
Next()獲得對象。
Collections工具類
排序只針對List 若不是天然排序的對象,則須要實現比較器
Collections.sort();排序 Collections.reverse()逆排
Map集合(雙列集合):
Hashtable
不能夠 有null值,同步安全
源碼:
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = hash(key);
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}
modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();
tab = table;
hash = hash(key);
index = (hash & 0x7FFFFFFF) % tab.length;
}
// Creates the new entry.
Entry<K,V> e = tab[index];
tab[index] = new Entry<>(hash, key, value, e);
count++;
return null;
}
也就是經過entrySet();拿到內部類,經過這個內部類取得key value
HashMap
能夠有null值,沒有同步
也就是說Map是構造一個內部類的對象的數組,這個對象存了當前的key,value等等。。。