成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java深入 - 深入理解Java集合

hlcfan / 3182人閱讀

摘要:集合集合類(lèi)存放于包中。迭代器,可以通過(guò)迭代器遍歷集合中的數(shù)據(jù)是映射表的基礎(chǔ)接口有序集合的是非常常用的數(shù)據(jù)類(lèi)型。按照指定的迭代器所返回的元素順序,將該中的所有元素添加到此列表的尾部。

集合
集合類(lèi)存放于Java.util包中。
集合類(lèi)型主要有3種:set(集)、list(列表包含Queue)和map(映射)。

Collection:Collection是集合的基本接口,List、Set、Queue的最基本的接口。
Iterator:迭代器,可以通過(guò)迭代器遍歷集合中的數(shù)據(jù)
Map:是映射表的基礎(chǔ)接口

List 有序集合
Java的List是非常常用的數(shù)據(jù)類(lèi)型。List是有序的Collection。Java List一共三個(gè)實(shí)現(xiàn)類(lèi):分別是ArrayList、Vector和LinkedList。
ArrayList:ArrayList是最常用的List實(shí)現(xiàn)類(lèi),內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的,它允許對(duì)元素進(jìn)行快速隨機(jī)訪問(wèn)。數(shù)組的缺點(diǎn)是每個(gè)元素之間不能有間隔,當(dāng)數(shù)組大小不滿(mǎn)足時(shí)需要增加存儲(chǔ)能力,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲(chǔ)空間中。當(dāng)從ArrayList的中間位置插入或者刪除元素時(shí),需要對(duì)數(shù)組進(jìn)行復(fù)制、移動(dòng)、代價(jià)比較高。因此,它適合隨機(jī)查找和遍歷,不適合插入和刪除。
Vector:Vector與ArrayList一樣,也是通過(guò)數(shù)組實(shí)現(xiàn)的,不同的是它支持線(xiàn)程的同步,即某一時(shí)刻只有一個(gè)線(xiàn)程能夠?qū)慥ector,避免多線(xiàn)程同時(shí)寫(xiě)而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪問(wèn)它比訪問(wèn)ArrayList慢。
LinkedList:LinkedList是用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除,隨機(jī)訪問(wèn)和遍歷速度比較慢。另外,他還提供了List接口中沒(méi)有定義的方法,專(zhuān)門(mén)用于操作表頭和表尾元素,可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。

說(shuō)明:

ArrayList在內(nèi)存不夠時(shí)默認(rèn)是擴(kuò)展50% + 1個(gè),Vector是默認(rèn)擴(kuò)展1倍。

Vector屬于線(xiàn)程安全級(jí)別的,但是大多數(shù)情況下不使用Vector,因?yàn)榫€(xiàn)程安全需要更大的系統(tǒng)開(kāi)銷(xiāo)。

一般使用ArrayList和LinkedList比較多

對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針

對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)

ArrayList
ArrayList是最常用的List實(shí)現(xiàn)類(lèi)。ArrayList內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的。所以只適合遍歷或者隨機(jī)查找。
常用的接口:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
list.add(int index,E element) 將數(shù)據(jù)新增到指定位置
list.add(E element) 將指定的元素添加到此列表的尾部。
list.addAll(Collection c) 按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。
list.addAll(int index,Collection c) 從指定的位置開(kāi)始,將指定 collection 中的所有元素插入到此列表中。
list.clear() 移除此列表中的所有元素。
list.set(int index,E element) 用指定的元素替代此列表中指定位置上的元素。
list.get(int index) 返回此列表中指定位置上的元素。
list.size() 查看元素總個(gè)數(shù)
list.contains() 包含

例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test2 {

/** 
 * 入口函數(shù) 
 * @param args 
 */  
public static void main(String[] args) throws Exception {  

    /* 初始化一個(gè)數(shù)組 */  
    List list = new ArrayList();  

    /* 新增數(shù)據(jù) */  
    for (int j = 0; j < 5; j++) {  
        list.add(j);  
    }  

    /* 總長(zhǎng)度 */  
    System.out.println(list.size());  

    /* 刪除一條數(shù)據(jù) key=1 */  
    list.remove(1);  

    /* 遍歷 */  
    for (int i = 0; i < list.size(); i++) {  
        System.out.println("for:" + list.get(i)); //獲取值    
    }  

    /* 將一個(gè)集合合并 */  
    List list2 = new ArrayList();  
    list2.add(99);  
    list2.add(100);  
    list.addAll(list2);  

    /* 遍歷2 */  
    Iterator it = list.iterator();  
    while (it.hasNext()) {  
        System.out.println("Iterator:" + it.next()); //獲取值    
    }  

    /* 是否包含 */  
    if (list.contains(2)) {  
        System.out.println("包含");  
    }  

    /* 清空列表 */  
    list.clear(); //清除整個(gè)列表    

}  

}

LinkedList
是以鏈表的結(jié)構(gòu)進(jìn)行存儲(chǔ)對(duì)象的,動(dòng)態(tài)新增和刪除是很快,但是遍歷就很慢,并且不存在get()的操作,不能單個(gè)定位。說(shuō)白了,ArrayList是順序存儲(chǔ)結(jié)構(gòu),LinkedList是鏈表存儲(chǔ)結(jié)構(gòu)。

常用接口:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public LinkedList() 生成空的鏈表
public LinkedList(Collection col): 復(fù)制構(gòu)造函數(shù)
public boolean add(Object element) 添加元素
public boolean add(int index, Object element)
public boolean addFirst(Object element)
public boolean addLast(Object element)
list.addAll(Collection c) 按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。
list.removeFirst();
list.removeLast();
list.clear();
list.subList(2, 5).clear();
list.remove("2"); #刪除特定元素
List myList = new ArrayList(list); #轉(zhuǎn)ArrayList
lList.indexOf("2") 查找元素位置
lList.lastIndexOf("2");
lList.set(3, "Replaced");
lList.contains("4"); 確認(rèn)是否存在

例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test2 {

/** 
 * 入口函數(shù) 
 * @param args 
 */  
public static void main(String[] args) throws Exception {  

    /* 生成一個(gè)LinkedList */  
    LinkedList list = new LinkedList();  
    list.add("a");  
    list.add("b");  
    list.add("c");  
    list.add("d");  

    /* list的size */  
    int size = list.size();  
    System.out.println(size);  

    /* 獲取第一個(gè)和最后一個(gè)元素 */  
    String first = list.getFirst();  
    String last = list.getLast();  
    System.out.println("First:" + first + " Last:" + last);  

    /* 新增第一個(gè)和最后一個(gè)元素 */  
    list.addFirst("first");  
    list.addLast("last");  
    System.out.println("List內(nèi)容 :" + list);  

    /* 移除最后一個(gè)和第一個(gè) */  
    list.removeFirst();  
    list.removeLast();  
    System.out.println("List內(nèi)容 :" + list);  

    /* 刪除特定元素 */  
    list.remove("b");  
    System.out.println("List內(nèi)容 :" + list);  

    /* 查找元素位置 */  
    int i = list.indexOf("c");  
    System.out.println("位置 :" + i);  

    /* 是否包含某個(gè)元素 */  
    if (list.contains("c")) {  
        System.out.println("包含");  
    }  

    /* 設(shè)置某個(gè)元素 */  
    list.set(1, "sadsad");  
    System.out.println("List內(nèi)容 :" + list);  

    /* 轉(zhuǎn)為ArrayList */  
    List aList = new ArrayList(list);  
    for (String s : aList) {  
        System.out.println("s = " + s);  
    }  

    /* 轉(zhuǎn)為數(shù)組 */  
    String[] my = list.toArray(new String[list.size()]);  
    for (int j = 0; j < my.length; j++) {  
        System.out.println(my[j]);  
    }  

    /* 組裝list */  
    LinkedList list2 = new LinkedList();  
    list.add("ffffd");  
    list.add("111");  
    list.addAll(list2);  
    System.out.println("List內(nèi)容 :" + list);  

    /* 遍歷 */  
    Iterator lit = list.iterator();  
    while (lit.hasNext()) {  
        System.out.println(lit.next());  
    }  

    /* 清除 */  
    list.clear();  
    System.out.println("List內(nèi)容 :" + list);  
}  

}

Set 集合
Set集合的幾個(gè)特點(diǎn):

Set集合不允許出現(xiàn)重復(fù)數(shù)據(jù)

允許包含值為null的元素,但最多只能有一個(gè)null元素。

TreeSet
TreeSet的幾個(gè)特點(diǎn):

TreeSet中不能有重復(fù)的元素;

TreeSet具有排序功能,缺省是按照自然排序進(jìn)行排列

TreeSet中的元素必須實(shí)現(xiàn)Comparable接口并重寫(xiě)compareTo()方法,TreeSet判斷元素是否重復(fù) 、以及確定元素的順序 靠的都是這個(gè)方法

基于TreeMap實(shí)現(xiàn)
例子:

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {

public static void main(String[] agrs) {  
    /** 
     * TreeSet中不能有重復(fù)的元素; 
     * TreeSet具有排序功能; 
     * TreeSet中的元素必須實(shí)現(xiàn)Comparable接口并重寫(xiě)compareTo()方法,TreeSet判斷元素是否重復(fù) 、以及確定元素的順序 靠的都是這個(gè)方法 
     * 如果自定義類(lèi),則可以實(shí)現(xiàn)Comparable接口,并且實(shí)現(xiàn)compareTo,完成自定義去重 
     */  
    TreeSet set = new TreeSet();  

    /* 新增數(shù)據(jù) */  
    set.add("abc");  
    set.add("xyz");  
    set.add("bcd");  
    set.add("bac");  

    TreeSet set2 = new TreeSet();  
    set2.add("TTT");  
    set2.add("zzz");  
    set2.add("zzz");  

    /* 新增一個(gè)集合 */  
    set.addAll(set2);  

    Iterator it = set.iterator();  
    while (it.hasNext()) {  
        System.out.println(it.next());  
    }  

    /* 獲取第一個(gè)元素 */  
    String first = set.first();  
    System.out.println("first:" + first);  

    /* 獲取最后一個(gè)元素 */  
    String last = set.last();  
    System.out.println("last:" + last);  

    /* 是否包含某個(gè)元素 */  
    if (set2.contains("TTT")) {  
        System.out.println("contains:true");  
    }  

    /* 判斷是否為空 */  
    if (set.isEmpty()) {  
        System.out.println("空");  
    }  

    /* 元素個(gè)數(shù) */  
    System.out.println("元素個(gè)數(shù):" + set.size());  

    /* 清空集合 */  
    set.clear();  

}  

}

HashSet
HashSet的幾個(gè)特點(diǎn):

HashSet中不能有重復(fù)的元素;

HashSet是無(wú)序的

HashSet也是基于HashMap實(shí)現(xiàn)
例子:

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {

public static void main(String[] agrs) {  
    /** 
     * HashSet中不能有重復(fù)的元素; 
     * HashSet是無(wú)序的 
     * HashSet也是基于HashMap實(shí)現(xiàn) 
     */  
    Set set = new HashSet();  

    /* 新增數(shù)據(jù) */  
    set.add("abc");  
    set.add("xyz");  
    set.add("bcd");  
    set.add("bac");  

    Set set2 = new HashSet();  
    set2.add("TTT");  
    set2.add("zzz");  
    set2.add("zzz");  

    /* 新增一個(gè)集合 */  
    set.addAll(set2);  

    /* 判斷是否為空 */  
    if (set.isEmpty()) {  
        System.out.println("空");  
    }  

    /* 元素個(gè)數(shù) */  
    System.out.println("元素個(gè)數(shù):" + set.size());  

    /* 移除元素 */  
    set.remove("zzz");  

    Iterator it = set.iterator();  
    while (it.hasNext()) {  
        System.out.println(it.next());  
    }  

    /* 是否包含某個(gè)元素 */  
    if (set2.contains("TTT")) {  
        System.out.println("contains:true");  
    }  

    /* 清空集合 */  
    set.clear();  

}  

}

Map
Map集合主要有:HashMap,TreeMap

HashMap
HashMap特點(diǎn):

HashMap是無(wú)序的散列映射表;

HashMap通過(guò)Hash 算法來(lái)決定存儲(chǔ)位置

底層實(shí)現(xiàn)是哈希表
例子:

[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {

public static void main(String[] agrs) {  
    /** 
     * HashMap是無(wú)序的散列映射表; 
     * HashMap通過(guò)Hash 算法來(lái)決定存儲(chǔ)位置 
     */  
    HashMap map = new HashMap();  

    /* 填充數(shù)據(jù) */  
    map.put("username", "initphp");  
    map.put("age", "100");  

    /* 獲取元素個(gè)數(shù) */  
    System.out.println(map.size());  

    /* put all */  
    HashMap map2 = new HashMap();  
    map2.put("username2", "initphp2");  
    map2.put("age2", "1002");  
    map.putAll(map2);  

    /* 通過(guò)Key遍歷HashMap */  
    Iterator it = map.keySet().iterator();  
    while (it.hasNext()) {  
        String key = (String) it.next();  
        System.out.println("key:" + key + " value:" + map.get(key));  
    }  

    /* 是否包含某個(gè)key */  
    if (map.containsKey("age")) {  
        System.out.println("是否包含某個(gè)key");  
    }  

    /* 判斷是否為空 */  
    if (map.isEmpty()) {  
        System.out.println("空");  
    }  

    /* 刪除某個(gè)元素 */  
    map.remove("age");  

    /* 清空Map表 */  
    map.clear();  

}  

}

TreeMap
TreeMap的特點(diǎn):

適用于按自然順序或自定義順序遍歷鍵(key)。

底層是二叉樹(shù)

提供compareTo,可以定義排序方法
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片

public class Test {

public static void main(String[] agrs) {  
    /** 
     * 1. 適用于按自然順序或自定義順序遍歷鍵(key)。 
     * 2. 底層是二叉樹(shù) 
     * 3. 提供compareTo,可以定義排序方法 
     */  
    TreeMap map = new TreeMap();  

    /* 填充數(shù)據(jù) */  
    map.put("username", "initphp");  
    map.put("age", "100");  

    /* 獲取元素個(gè)數(shù) */  
    System.out.println(map.size());  

    /* put all */  
    TreeMap map2 = new TreeMap();  
    map2.put("username2", "initphp2");  
    map2.put("age2", "1002");  
    map.putAll(map2);  

    /* 通過(guò)Key遍歷HashMap,是有序的 */  
    Iterator it = map.keySet().iterator();  
    while (it.hasNext()) {  
        String key = (String) it.next();  
        System.out.println("key:" + key + " value:" + map.get(key));  
    }  

    /* 是否包含某個(gè)key */  
    if (map.containsKey("age")) {  
        System.out.println("是否包含某個(gè)key");  
    }  

    /* 判斷是否為空 */  
    if (map.isEmpty()) {  
        System.out.println("空");  
    }  

    String first = map.firstKey();  
    String last = map.lastKey();  
    System.out.println("first:" + first);  
    System.out.println("last" + last);  

    /* 刪除某個(gè)元素 */  
    map.remove("age");  

    /* 清空Map表 */  
    map.clear();  

}  

}

Queue
LinkedList就是一個(gè)Queue。
常用的Queue有:PriorityQueue、ConcurrentLinkedQueue、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue

PriorityQueue
例子:
[java] view plain copy print?在CODE上查看代碼片派生到我的代碼片
public class Test {

public static void main(String[] agrs) {  

    /* 生成一個(gè)LinkedList */  
    PriorityQueue queue = new PriorityQueue();  
    queue.add("a");  
    queue.add("b");  
    queue.add("c");  
    queue.add("d");  

    /* queue的size */  
    int size = queue.size();  
    System.out.println(size);  

    /* 刪除特定元素 */  
    queue.remove("b");  
    System.out.println("List內(nèi)容 :" + queue);  

    /* 是否包含某個(gè)元素 */  
    if (queue.contains("c")) {  
        System.out.println("包含");  
    }  

    /* 組裝list */  
    PriorityQueue queue2 = new PriorityQueue();  
    queue2.add("ffffd");  
    queue2.add("111");  
    queue.addAll(queue2);  
    System.out.println("List內(nèi)容 :" + queue);  

    /* 遍歷 */  
    Iterator lit = queue.iterator();  
    while (lit.hasNext()) {  
        System.out.println(lit.next());  
    }  

    /* 從隊(duì)列頭部彈出一個(gè)元素 */  
    String string = queue.poll();  
    System.out.println("poll:" + string);  
    string = queue.poll();  
    System.out.println("poll:" + string);  

    /* 從尾部頭部彈出一個(gè)元素 */  
    string = queue.peek();  
    System.out.println("peek:" + string);  

    System.out.println("List內(nèi)容 :" + queue);  

    /* 清除 */  
    queue.clear();  
    System.out.println("List內(nèi)容 :" + queue);  
}  

}
轉(zhuǎn)載自:http://blog.csdn.net/initphp/...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66946.html

相關(guān)文章

  • java源碼

    摘要:集合源碼解析回歸基礎(chǔ),集合源碼解析系列,持續(xù)更新和源碼分析與是兩個(gè)常用的操作字符串的類(lèi)。這里我們從源碼看下不同狀態(tài)都是怎么處理的。 Java 集合深入理解:ArrayList 回歸基礎(chǔ),Java 集合深入理解系列,持續(xù)更新~ JVM 源碼分析之 System.currentTimeMillis 及 nanoTime 原理詳解 JVM 源碼分析之 System.currentTimeMi...

    Freeman 評(píng)論0 收藏0
  • 我的阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開(kāi)始了螞蟻金...

    姘擱『 評(píng)論0 收藏0
  • Java相關(guān)

    摘要:本文是作者自己對(duì)中線(xiàn)程的狀態(tài)線(xiàn)程間協(xié)作相關(guān)使用的理解與總結(jié),不對(duì)之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時(shí)搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個(gè)接口,程序可以通過(guò)...

    wangtdgoodluck 評(píng)論0 收藏0
  • 深入理解Java集合中的Iterator

    摘要:深入理解集合中的問(wèn)題由來(lái)之所以今天想寫(xiě)這篇文章完全是一個(gè)偶然的機(jī)會(huì)。昨晚,微信技術(shù)群里的一位猿友我,問(wèn)了我一個(gè)問(wèn)題,代碼如下。他問(wèn)我,這樣寫(xiě)有沒(méi)有問(wèn)題,會(huì)不會(huì)報(bào)錯(cuò)然后他說(shuō)這是他今天去面試的面試官出的題目,結(jié)果他回答不出來(lái)。 深入理解Java集合中的Iterator 問(wèn)題由來(lái) 之所以今天想寫(xiě)這篇文章完全是一個(gè)偶然的機(jī)會(huì)。昨晚,微信技術(shù)群里的一位猿友@我,問(wèn)了我一個(gè)問(wèn)題,代碼如下。他問(wèn)我,...

    leonardofed 評(píng)論0 收藏0
  • Java 總結(jié)

    摘要:中的詳解必修個(gè)多線(xiàn)程問(wèn)題總結(jié)個(gè)多線(xiàn)程問(wèn)題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開(kāi)源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡(jiǎn)的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...

    caspar 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

hlcfan

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<