Java之集合Collection

来源:https://www.cnblogs.com/wadmwz/archive/2018/07/12/9297595.html
-Advertisement-
Play Games

集合 初次學習集合過程中的學習筆記,學習頂層,使用底層.包括常用的API Collection介面 概述 集合 : 集合是Java中提供的一種容器,可以用來存儲多個數據. 與數組的區別: 數組的長度是固定的,集合的長度是可變的. 數組只能存儲同一種數據類型,集合可以存儲任意數據類型. 數組可以存儲基 ...


集合

初次學習集合過程中的學習筆記,學習頂層,使用底層.包括常用的API

Collection介面

概述

  • 集合 : 集合是Java中提供的一種容器,可以用來存儲多個數據.

    與數組的區別:
  • 數組的長度是固定的,集合的長度是可變的.
  • 數組只能存儲同一種數據類型,集合可以存儲任意數據類型.
  • 數組可以存儲基本數據類型和引用數據類型,集合只能存儲引用數據類型.

集合的繼承結構

集合的繼承結構

List特點 : 存儲有序(存取順序一致),有索引,可以存儲重覆的元素
Set特點 : 存儲無序(LinkedHashSet除外),沒有索引,不可以存儲重覆的元素

共性方法

  • public boolean add(E e) : 把給定的對象添加到當前集合中,可以添加給定對象以及給定對象的子類。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(Object o) : 把給定的對象在當前集合中刪除。對象不存在,返回false.
  • public boolean contains(Object o) : 判斷當前集合中是否包含給定的對象。
  • public boolean isEmpty() : 判斷當前集合是否為空。
  • public int size() : 返回集合中元素的個數。
  • public Object[] toArray() : 把集合中的元素,存儲到數組中。

迭代器

迭代器用來遍歷集合,使用下麵的方法來創建迭代器:

  • Iterator

迭代器中常用方法:

  • boolean hasNext() 如果迭代具有更多元素,則返回 true 。
  • E next() 返回迭代中的下一個元素。

如何遍歷集合? 如下:

 // 創建集合
ArrayList<Student> stuList = new ArrayList<>();
// 創建學生對象
Student stu1 = new Student("趙麗穎",23);
stuList.add(stu1);
stuList.add(new Student("鄭爽",22));
stuList.add(new Student("楊冪",34));
stuList.add(new Student("迪麗熱巴",22));
// 使用迭代器進行遍歷
Iterator<Student> iterator = stuList.iterator();
while(iterator.hasNext()){
    System.out.println(iterator.next());
}
System.out.println("=======================");
// 使用增強for迴圈的遍歷
for (Student student : stuList) {
    System.out.println(student);
}
System.out.println("=======================");
// 使用數組進行遍歷,註意的是只能用Object數組進行接收
Object[] objs = stuList.toArray();
for (int i = 0; i < objs.length; i++) {
    System.out.println(objs[i]);
}

增強for迴圈

增強for迴圈(也稱for each迴圈)是JDK1.5以後出來的一個高級for迴圈,遍歷集合內部原理其實是個Iterator迭代器,所以它只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。遍曆數組內部原理其實是個普通for迴圈.
就是上面的第二種方式

新for迴圈必須有被遍歷的目標。目標只能是Collection或者是數組。新式for僅僅作為遍歷操作出現。

泛型

概念

廣泛的數據類型,將數據類型的確認推遲到使用的時候.
泛型只能是引用數據類型.

泛型類的定義

在定義類的時候,在類名後加上

class A<E>{
}

泛型類在創建對象的時候確定類型.

定義含有泛型的方法

格式如下:
修飾符 <泛型> 返回值 方法名(泛型參數列表){}
例子:

public <E> void method1(E e){
    System.out.println(e);
}

使用的時候創建對象,調用方法,可以傳入各種數據類型.

定義泛型的介面

格式如下:
interface 介面名{}

泛型介面的子實現類有兩種方式:

  • 帶泛型的 : class 類名 implements 介面名{}
  • 不帶泛型的 : class 類名 implements 介面名

也就是說實現的子介面可以確定泛型的類型,也可以不確定,繼續使用泛型,這就是兩種方式.

泛型通配符

當使用泛型類或者介面時,傳遞的數據中,泛型類型不確定,可以通過通配符<?>表示。但是一旦使用泛型的通配符後,只能使用Object類中的共性方法,集合中元素自身方法無法使用.
不知道使用什麼類型來接收的時候,此時可以使用?,?表示未知通配符。
例子:

public static void main(String[] args) {
    Collection<Intger> list1 = new ArrayList<Integer>();
    getElement(list1);
    Collection<String> list2 = new ArrayList<String>();
    getElement(list2);
}
public static void getElement(Collection<?> coll){}
//?代表可以接收任意類型

高級用法:

  • 泛型的上限:
    格式: 類型名稱 <? extends 類 > 對象名稱
    意義: 只能接收該類型及其子類
  • 泛型的下限:
    格式: 類型名稱 <? super 類 > 對象名稱
    意義: 只能接收該類型及其父類型
    舉個例子:

    public static void main(String[] args) {
    Collection

來個更明顯的例子,四個類,如下:

public class People {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public People() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



public class Student extends People{

    public Student(String name, int age) {
        super(name, age);
    }

    public Student() {
    }
}

public class BasicStudent extends Student{

    public BasicStudent(String name, int age) {
        super(name, age);
    }

    public BasicStudent() {
    }
}

public class DemoTest2 {

    public static void main(String[] args) {
        ArrayList<People> arrList1 = new ArrayList<>();

        //  boolean add(E e)  確保此集合包含指定的元素(可選操作)。
        // 說明add方法可以添加指定對象以及指定對象的子類
        arrList1.add(new Student("迪麗熱巴",22));
        arrList1.add(new BasicStudent("鄧倫",23));

        ArrayList<Student> arrList2 = new ArrayList<>();
        ArrayList<BasicStudent> arrList3 = new ArrayList<>();
        ArrayList<People> arrList4 = new ArrayList<>();

        //  boolean addAll(Collection<? extends E> c) 將指定集合中的所有元素添加到此集合(可選操作)。
        // 測試addAll方法
        arrList2.add(new Student("迪麗熱巴",22));
        arrList2.add(new Student("鄧倫",23));

        arrList3.add(new BasicStudent("楊冪",34));
        arrList3.add(new BasicStudent("鄭愷威",35));

        arrList4.add(new People("楊洋",24));
        arrList4.add(new People("鄭爽",23));

        // 可以添加成功
        arrList2.addAll(arrList3);
        // 報錯,添加失敗,原因是addAll方法的參數中通配符有上界的限制,只能添加該類以及該類的子類,不能添加父類等其他類
        // arrList2.addAll(arrList4);

        System.out.println(arrList2);


    }
}

最後再來個小案例,案例要求如下:
按照鬥地主的規則,完成洗牌發牌的動作。 具體規則:
使用54張牌打亂順序,三個玩家參與游戲,三人交替摸牌,每人17張牌,最後三張留作底牌。

/**
 * 鬥地主的測試類
 *  1.買牌
 *  2.洗牌
 *  3.發牌
 *  4.看牌
 *
 * @author WZLOVE
 * @create 2018-07-11 17:36
 */
public class DDZDemoTest {

    public static void main(String[] args) {

        // 買牌
        ArrayList<String> poker = new ArrayList<>();

        String[] arr1 = {"♠","♥","♣","♦"};
        String[] arr2 = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        for (String s : arr1) {
            for (String s1 : arr2) {
                poker.add(s + s1);
            }
        }
        poker.add("大王");
        poker.add("小王");
        System.out.println(poker.size());

        // 洗牌
        Collections.shuffle(poker);

        // 發牌
        ArrayList<String> people1 = new ArrayList<>();
        ArrayList<String> people2 = new ArrayList<>();
        ArrayList<String> people3 = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();

        // 自己的思路
        /*for (int i = 0; i < poker.size();) {
            if(i >= 51){
                dipai.add(poker.get(i++));
            } else{
                people1.add(poker.get(i++));
                people2.add(poker.get(i++));
                people3.add(poker.get(i++));
            }
        }*/


         // 老師的思路
        for (int i = 0; i < poker.size();i++) {
            if(i >= 51){
                dipai.add(poker.get(i));
            } else if(i % 3 == 0) {
                people1.add(poker.get(i));
            }else if(i % 3 == 1) {
                people2.add(poker.get(i));
            }else if(i % 3 == 2){
                people3.add(poker.get(i));
            }
        }
        // 看牌
        System.out.println(people1);
        System.out.println(people2);
        System.out.println(people3);
        System.out.println(dipai);

    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 組件有個屬性:hidden='' ,值為true/false ,當false的時候說明不隱藏,當true的時候說明隱藏,註意該隱藏是不保留組件位置的。 實現即 .js 配合.wxml 文件 一、在.js 文件下的 Page({}) 裡面 的data:{} 裡面 創建一個布爾類型的屬性 二、在.wxm ...
  • 1. 請求長度的限制 在HTTP協議中,從未規定GET/POST的請求長度限制,對於GET,對url的限制來源於瀏覽器或web伺服器,瀏覽器和伺服器限制了url的長度。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。對於POST,由於沒有url傳值,理論上是不會受到限制的,但是實際上各個服 ...
  • 在我們的項目經常需要監聽一些鍵盤事件來觸發程式的執行,而Vue中允許在監聽的時候添加關鍵修飾符: 對於一些常用鍵,還提供了按鍵別名: 全部的按鍵別名: .enter .tab .delete (捕獲“刪除”和“退格”鍵) .esc .space .up .down .left .right 修飾鍵: ...
  • 問題:有兩個元素: A, B。兩則是嵌套關係,A是B的父節點。A和B都是塊元素。當在A上設置:margin: 0 auto的時候,B並沒有在頁面中居中。 margin: 0 auto 為什麼沒有生效? 解決:margin:0 auto;生效,需要一定的前提條件。 1 兩者是塊元素,即 display ...
  • 下麵是在變數開始的時候定義初始值 ...
  • Description 聰聰和可可是兄弟倆,他們倆經常為了一些瑣事打起來,例如家中只剩下最後一根冰棍而兩人都想吃、兩個人都想玩兒電腦(可是他們家只有一臺電腦)……遇到這種問題,一般情況下石頭剪刀布就好了,可是他們已經玩兒膩了這種低智商的游戲。他們的爸爸快被他們的爭吵煩死了,所以他發明瞭一個新游戲:由 ...
  • 我們在上一篇搭建了一個簡單的springboot應用,這一篇將介紹使用spring-data-jpa操作資料庫。 新建一個MySQL資料庫,這裡資料庫名為springboot,建立user_info數據表,作為我們示例操作的表對象。 user_info信息如下: 資料庫及表創建成功後,回到我們的工程 ...
  • 好久不發文章了,難道是因為忙,其實是因為懶。這是一篇關於線程池使用和基本原理的科普水文,如果你經常用到線程池,不知道你的用法標準不標準,是否有隱藏的 OOM 風險。不經常用線程池的同學,還有對幾種線程的使用不甚瞭解的同學可以讀一下此文。 為什麼要使用線程池 雖然大家應該都已經很清楚了,但還是說一下。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...