溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java數(shù)據(jù)結(jié)構(gòu)之List怎么用

發(fā)布時間:2021-11-24 16:28:04 來源:億速云 閱讀:149 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Java數(shù)據(jù)結(jié)構(gòu)之List怎么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

    Java數(shù)據(jù)結(jié)構(gòu)之List怎么用

    泛型

    什么是泛型

    泛型:即通過參數(shù)化類型來實現(xiàn)在同一份代碼上操作多種數(shù)據(jù)類型。泛型是在C#2.0引入的。泛型(Genericity)的字面意思是指具有在多種數(shù)據(jù)類型上皆可操作的含意,與模板有些相似。

    優(yōu)點(diǎn):泛型類和泛型方法同時具備可重用性、類型安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用于集合的方法一起使用。

    泛型的分類

    泛型類泛型方法

    泛型的定義簡單演示

    • 1. 尖括號 <> 是泛型的標(biāo)志

    • 2. E 是類型變量(Type Variable),變量名一般要大寫

    • 3. E 在定義時是形參,代表的意思是 MyArrayList 最終傳入的類型,但現(xiàn)在還不知道

       public class MyArrayList<E> { 
       private E[] array; 
       private int size;
        ... 
        }

    泛型背后作用時期和背后的簡單原理

    • 泛型是作用在編譯期間的一種機(jī)制,即運(yùn)行期間沒有泛型的概念。

    • 泛型代碼在運(yùn)行期間,就是我們上面提到的,利用 Object 達(dá)到的效果(這里不是很準(zhǔn)確,后期會專門寫一篇博客講泛型)。

    • < T > 代表當(dāng)前類是一個泛型類。

    • new T[10]; 不能new泛型類型的數(shù)組 T[] t = new T[];

    • 泛型的意義: ①在存儲元素的時候,可以自動進(jìn)行類型檢查 ②在獲取元素的時候,可以進(jìn)行自動類型的轉(zhuǎn)換

    • 泛型類型的參數(shù):不能是簡單類型

    • 泛型類型的參數(shù),是不參與類型的組成的

    面試問題:

    泛型到底是怎么編譯的?

    1、泛型只在編譯的時候,起作用。在運(yùn)行的時候,是沒有泛型的概念的!??!

    2、擦除機(jī)制 -> Object -> 不嚴(yán)謹(jǐn)-> 我們可以給定一個擦除邊界

    泛型類的使用

    // 定義了一個元素是 Book類 引用的 MyArrayList 
    MyArrayList<Book> books = new MyArrayList<Book>(); 
    books.add(new Book()); 
    
    // 會產(chǎn)生編譯錯誤,Person 類型無法轉(zhuǎn)換為 Book 類型 
    books.add(new Person()); 
    
    // 不需要做類型轉(zhuǎn)換 
    Book book = book.get(0); 
    
    // 會產(chǎn)生編譯錯誤,Book 類型無法轉(zhuǎn)換為 Person 類型 
    Person person = book.get(0);

    通過以上代碼,我們可以看到泛型類的一個使用方式:只需要在所有類型后邊跟尖括號,并且尖括號內(nèi)是人為限定所需要傳入的類型,即 E 可以看作的最后的類型。

    注意:

    • Book 只能想象成 E 的類型,但實際上 E 的類型還是 Object。

    • Java中的泛型僅僅是一個編譯時的概念,在運(yùn)行時,所有的泛型信息都被消除了,這被稱為泛型擦除。

    泛型總結(jié)

    • 泛型是為了解決某些容器、算法等代碼的通用性而引入,并且能在編譯期間做類型檢查,如果用使用Object類,當(dāng)傳入了非法參數(shù)時,編譯器是不會報錯的。

    • 泛型利用的是 Object 是所有類的祖先類,并且父類的引用可以指向子類對象的特定而工作。

    • 泛型是一種編譯期間的機(jī)制,即 MyArrayList<Person>MyArrayList<Book> 在運(yùn)行期間是一個類型。

    • 泛型是 java 中的一種合法語法,標(biāo)志就是尖括號 < >

    包裝類

    Object 引用可以指向任意類型的對象,但有例外出現(xiàn)了,8 種基本數(shù)據(jù)類型不是對象,那豈不是剛才的泛型機(jī)制要失效了?

    實際上也確實如此,為了解決這個問題,java 引入了一類特殊的類,即這 8 種基本數(shù)據(jù)類型的包裝類,在使用過程中,會將類似 int 這樣的值包裝到一個對象中去

    基本數(shù)據(jù)類型和包裝類直接的對應(yīng)關(guān)系

    基本就是類型的首字母大寫,除了 Integer 和 Character。

    包裝類的使用,裝箱(boxing)和拆箱(unboxing)

    有手動裝箱 也有 自動裝箱,拆箱 也一樣

    Java數(shù)據(jù)結(jié)構(gòu)之List怎么用

    可以看到在使用過程中,裝箱和拆箱帶來不少的代碼量,所以為了減少開發(fā)者的負(fù)擔(dān),java 提供了自動機(jī)制。

    注意:自動裝箱和自動拆箱是工作在編譯期間的一種機(jī)制

    List的使用

    List常用方法


    使用示例

    import java.util.List;
    import java.util.ArrayList;
    import java.util.LinkedList;
    public class ListDemo {
        public static void main(String[] args) {
            List<String> courses = new ArrayList<>();
            courses.add("Kobe");
            courses.add("Jordan");
            courses.add("Westbrook");
            courses.add("Durant");
    
            // 和數(shù)組一樣,允許添加重復(fù)元素
            courses.add("Kobe");
    
            // 按照添加順序打印
            System.out.println(courses);
    
            // 類似數(shù)組下標(biāo)的方式訪問
            System.out.println(courses.get(0));
    
            //給目標(biāo)位置設(shè)置新元素
            courses.set(0, "Jordan");
            System.out.println(courses);
    
            // 截取部分 [1, 3) 注意這里是左開右閉區(qū)區(qū)間
            List<String> subCourses = courses.subList(1, 3);
            System.out.println(subCourses);
    
            // 重新構(gòu)造
            List<String> courses2 = new ArrayList<>(courses);
            System.out.println(courses2);
            List<String> courses3 = new LinkedList<>(courses);
            System.out.println(courses3);
    
            // 引用的轉(zhuǎn)換
            ArrayList<String> courses4 = (ArrayList<String>)courses2;
            System.out.println(courses4);
            //LinkedList<String> c = (LinkedList<String>)course2; 錯誤的類型
            LinkedList<String> courses5 = (LinkedList<String>)courses3;
            System.out.println(courses5);
            //ArrayList<String> c = (ArrayList<String>)course3; 錯誤的類型
    
            }
        }

    運(yùn)行結(jié)果如下:

    Java數(shù)據(jù)結(jié)構(gòu)之List怎么用

    自動發(fā)牌案例

    分為三個java文件

    Java數(shù)據(jù)結(jié)構(gòu)之List怎么用

    import java.util.ArrayList;
    import java.util.List;
    
    public class TestDemo {
        public static void main(String[] args) {
            List<Card> deck = CardDemo.buyDeck();
            System.out.println("買來的新牌");
            System.out.println(deck);
    
            System.out.println("===========================");
            CardDemo.shuffle(deck);
            System.out.println("洗過后的牌");
            System.out.println(deck);
            System.out.println("===========================");
    
            //三個人,每個人輪流抓牌,一個人五張牌
            List<List<Card>> hands = new ArrayList<>();//二維數(shù)組的思維
            hands.add(new ArrayList<>());//加一個人
            hands.add(new ArrayList<>());//再加一個人
            hands.add(new ArrayList<>());//再加一個人,共三個人
    
            for (int i = 0; i < 5 ; i++){
                for (int j = 0; j < 3; j++){
                    hands.get(j).add(deck.remove(0));
                    //這里的remove返回順序表里被移除的元素,剛好牌堆里少一張牌
                }
            }
    
            System.out.println("剩余的牌");
            System.out.println(deck);
            System.out.println("A手中的牌");
            System.out.println(hands.get(0));
            System.out.println("B手中的牌");
            System.out.println(hands.get(1));
            System.out.println("C手中的牌");
            System.out.println(hands.get(2));
    
        }
    }
    public class Card {
        private int rank;//牌值
        private String suit;//花色
    
        public Card(int rank, String suit) {
            this.rank = rank;
            this.suit = suit;
        }
    
        @Override
        public String toString() {
            return String.format("[%s %d]", suit, rank);
        }
    }
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    public class CardDemo {
        private static final String[] suits = {"?", "?", "?", "?"};
    
        //買一副牌
        public static List<Card> buyDeck() {
            List<Card> deck = new ArrayList<>(52);
            for (int i = 0; i < 4; i++) {
                for (int j = 1; j <= 13; j++) {
                    String suit = suits[i];
                    int rank = j;
                    deck.add(new Card(rank, suit));//順序表默認(rèn)是尾插
                }
            }
            return deck;
        }
    
        public static void swap(List<Card> deck, int i, int j) {
            Card temp = deck.get(i);
            deck.set(i, deck.get(j));
            deck.set(j, temp);
        }
    
        public static void shuffle(List<Card> deck){
            Random rand = new Random(20211122);
            for (int i = deck.size() - 1; i > 0; i--){
                int r = rand.nextInt(i);//生成0~i的隨機(jī)正整數(shù)
                swap(deck, i ,r);
            }
        }

    看完了這篇文章,相信你對“Java數(shù)據(jù)結(jié)構(gòu)之List怎么用”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI