国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java基礎之集合框架詳解

發(fā)布時(shí)間:2021-07-06 11:12 來(lái)源:腳本之家 閱讀:0 作者:油炸冰可樂(lè ) 欄目: 開(kāi)發(fā)技術(shù)

目錄

一、前言

本節學(xué)習到的內容有以下5類(lèi),不分先后順序:

  • 集合Collection體系結構
  • List子類(lèi)
  • 與集合結合使用的迭代器對象
  • 集合與數組的區別?
  • 常見(jiàn)的一般數據結構整理

二、集合的由來(lái)?

  • Collection
  • List

1.ArrayList

2.Vector

3.LinkedList

  • Set

1.hashSet

2.treeSet

在集合沒(méi)有出現之前,使用對象數組來(lái)存儲對象,但是,對象數組的長(cháng)度一旦確定,則不可以發(fā)生變化,所以我們希望存在一個(gè)容器就像StringBuffer一樣存儲字符串,同時(shí)依據傳入的值的個(gè)數不同,可以自動(dòng)改變自身的長(cháng)度,有這樣的東西嗎?有的,Collection就出現了,總結一下它的特點(diǎn):

  • 是一個(gè)長(cháng)度可變的容器
  • 用來(lái)存儲對象

三、集合和數組的區別?

(1)長(cháng)度區別

集合的長(cháng)度可以變化,數組無(wú)法變化

(2)內容不同

  • 數組中可以存儲的是基本類(lèi)型與引用類(lèi)型兩種
  • 集合中可以存儲的只能是引用類(lèi)型

(3)存儲元素類(lèi)別的區別

  • 數組只可以存儲相同類(lèi)型的數據
  • 集合中可以存儲不同類(lèi)型的引用對象

四、Collection集合的功能概述?

集合一般使用到的功能有:

  • boolean addAll(Collection c):添加一個(gè)集合的元素
  • boolean removeAll(Collection c):移除一個(gè)集合的元素(注意:所有),只要有一個(gè)元素被移除,則返回true
  • boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(注意:所有)
  • boolean retainAll(Collection c):兩個(gè)集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?

retainAll方法中,是再求A、B個(gè)集合的交集,返回的boolean類(lèi)型值說(shuō)明,前面的A集合是否發(fā)生過(guò)變化。

五、Collection集合存儲字符串并遍歷?(迭代器)

在集合中存儲字符串后,遍歷可以通過(guò)兩種方式實(shí)現:

  • 與集合配套的迭代器實(shí)現
  • Collection轉化為String[ ]

這里我們先使用迭代器遍歷集合,如下:

package my_work;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class IteratorAndString {
    public static void main(String[] args) {
        Collection col = new ArrayList();

        col.add("Hello");
        col.add("World");
        col.add("Java");

        Iterator it = col.iterator();
        while (it.hasNext()){
            String s = (String)it.next();// 疑問(wèn)
            System.out.println(s);
            //System.out.println(it.next());注意:使用的這個(gè)方法是不安全的
        }
    }
}

這里為什么在取出元素之后需要強制轉型為String類(lèi)型?難道我不知道我存儲的是什么嗎?

回答:因為默認的迭代器中返回的元素類(lèi)型默認是Object類(lèi)的,為了避免之后的報錯,最好將它強制轉換,這個(gè)可以從原碼中得到答案:

public Object next(){} //迭代器中next()方法返回的是一個(gè)next對象。

六、Collection集合存儲自定義對象并遍歷?(迭代器)

(1)案例演示:「IteratorDemo.java」

案例中使用到的迭代器成員方法:

  • boolena hasNext( ):判斷迭代器中是否存在元素?
  • Object next( ):以Object類(lèi)型返回這個(gè)元素

使用這兩個(gè)功能,就可以完成迭代器從集合中遍歷元素。

(2)將Collection轉換為數組后,使用For循環(huán)的遍歷

package my_work;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionToArray {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("Hello");
        c.add("World");
        c.add("Java");

        Object[] objArray = c.toArray();
        for (int x= 0;x<objArray.length;x++){
            String s = (String)objArray[x];
            System.out.println(s);
        }
    }
}

七、List集合的特有功能?

* A:添加功能
*     void add(int index,Object element):在指定位置添加元素
* B:獲取功能
*     Object get(int index):獲取指定位置的元素
* C:列表迭代器
*     ListIterator listIterator():List集合特有的迭代器
* D:刪除功能
*     Object remove(int index):根據索引刪除元素,返回被刪除的元素
* E:修改功能
*     Object set(int index,Object element):根據索引修改元素,返回被修飾的元素
*/

八、List集合存儲字符串并遍歷?(迭代器和普通for)

List集合特有的遍歷,使用到size()方法和get()方法

package my_work;
/**
 * 使用list中的size()方法與get()方法遍歷列表*/
import java.util.ArrayList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        List list = new ArrayList();

        list.add("Hello");
        list.add("Java");
        list.add("World");

        for (int x=0;x<list.size();x++){
            //System.out.println(list.get(x));

            // 推薦做法
            String s = (String)list.get(x);
            System.out.println(s);
        }
    }
}
package my_work;

import java.util.ArrayList;
import java.util.List;

public class ListAndFor {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("hello");
        list.add("world");
        list.add("java");


        for (int x = 0; x < list.size(); x++) {
            String s = (String) list.get(x);
            System.out.println(s);
        }
    }
}

九、List集合存儲自定義對象并遍歷?(迭代器和普通for)

package my_work;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListAndUserObject {
    public static void main(String[] args) {
        List list = new ArrayList();

        Student s1 = new Student(18, "wzy");
        Student s2 = new Student(19, "wzy");
        Student s3 = new Student(20, "wzy");

        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(new Student(24, "wzy"));
        
        // 遍歷方式1:while
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Student s = (Student) it.next();
            System.out.println(s.getAge() + "- - - " + s.getName());
        }
        // 遍歷方式2:size與get
        for (int x = 0; x < list.size(); x++) {
            Student stu = (Student) list.get(x);
            System.out.println(stu);
        }
    }
}

十、并發(fā)修改異常ConcurrentModificationException出現的原因?解決方案?

出現在當迭代器對進(jìn)行遍歷時(shí),我想在程序中加入一個(gè)判斷,如果這個(gè)判斷成立,則在集合中添加一個(gè)新的元素,這時(shí)就會(huì )出現并發(fā)修改異常錯誤ConcurrentModificationException:

  • 迭代器拿到的只是一個(gè)集合的拷貝,但是此時(shí)已經(jīng)出現了一個(gè)新的集合
  • 迭代器在進(jìn)行迭代時(shí)并不知道集合已經(jīng)發(fā)生了變化
  • 迭代器依舊按照原始計劃工作

如何解決?

(1)在循環(huán)中使用List類(lèi)特有的迭代器ListIterator()添加新的元素,如下:

package my_work;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListExcepiton {
    public static void main(String[] args) {
        List list = new ArrayList();

        list.add("Hello");
        list.add("world");
        list.add("java");

        ListIterator lit = list.listIterator();

        while (lit.hasNext()){
            if ("world".equals(lit.next())){
                lit.add("JavaSE");
            }
        }
        System.out.println(list); // [Hello, world, JavaSE, java],雖然是在迭代器中添加,但是,也會(huì )在最終的打印環(huán)節顯示。
    }
}

(2)使用普通的for循環(huán),在list里直接添加

package my_work;

import java.util.ArrayList;
import java.util.List;

public class ListExceptionFor {
    public static void main(String[] args) {
        List list = new ArrayList();

        list.add("Hello");
        list.add("world");
        list.add("java");

        for (int x = 0; x < list.size(); x++){
            if ("world".equals(list.get(x))){
                list.add("JavaSE");
            }
        }
        System.out.println(list);
    }
}

十一、常見(jiàn)的數據結構的特點(diǎn)?

(1)棧:

就像一個(gè)步槍彈匣,出口和入口為同一個(gè),遵循先進(jìn)后出原則,進(jìn)出對應著(zhù)入棧和彈棧

(2)隊列:

隊列就像隧道里的汽車(chē),遵循先后規則進(jìn)出,入口與出口不共用

(3)數組:

存儲同一種數據類(lèi)型的容器,具備索引下標,但是刪除指定元素和增加指定元素耗時(shí),查詢(xún)快,增刪慢

(4)鏈表:

鏈表和結點(diǎn)一起出現;

鏈表:將結點(diǎn)串起來(lái)的鏈子,使用地址值充當這個(gè)串起來(lái)的鏈子;

結點(diǎn):結點(diǎn)中存儲著(zhù)地址與數據,多個(gè)節點(diǎn)之間的地址存放總是相互關(guān)聯(lián)的;

鏈表也分為雙向鏈表、單向鏈表…

鏈表的存儲快,刪除快,查詢(xún)慢。

十二、List集合的子類(lèi)特點(diǎn)

(1)ArrayList:底層數據類(lèi)型是數組結構,增刪慢,查詢(xún)快,線(xiàn)程不安全,執行效率高;

(2)Vector:底層數據類(lèi)型是數組結構,增刪慢,查詢(xún)快,線(xiàn)程安全,執行效率低;

(3)LinkedList:底層數據結構是鏈表,增刪快,查詢(xún)慢,線(xiàn)程不安全,執行效率高

十三、List的三個(gè)兒子你準備使用誰(shuí)?請說(shuō)明理由。

有關(guān)List的使用,

(1)在存儲需求出現時(shí),優(yōu)先考慮LinkedList;

(2)在查詢(xún)需求出現時(shí),優(yōu)先考慮ArrayList;

Vector類(lèi)一般不使用,它出現在JDK1.0,古老的玩意,ArraysList的出現就是為了代替Vector類(lèi),雖然說(shuō)Vector是List的兒子,但是兒子和兒子之間,Vector卻是LinkedList和ArrayList的爺爺;

到此這篇關(guān)于Java基礎之集合框架詳解的文章就介紹到這了,更多相關(guān)Java集合框架內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

4HU44四虎WWW在线影院麻豆| 亚洲 日本 欧美 中文字幕| 亚洲私人无码综合久久网| 久久久免费精品RE6| 老太婆裸体BBWBBW| 日本无遮真人祼交视频|