JAVA-10-算法、集合、Collection、List等、泛型入門

一. 算法介紹(棧、隊列、數組、鏈表、Hash、樹)
  (1)棧:先進後出
  (2)隊列:先進先出,橫向隊列,存入取出
  (3)數組:查詢快,增刪慢
  (4)鏈表:通過一個鏈子把多個結點(元素)連接起來,由數據和地址組成的一個元素,節點本身必須有一個地址值(就是下一個元素的地址值)。  特點:查詢慢,增刪快。
  鏈表分類:
    單向鏈表:數據+下一個元素的地址
    雙向鏈表 :數據+下一個元素的地址+上一個元素的地址
    單向循環鏈表 :最後一個元素存儲的地址是第一個元素的地址值
    雙向循環鏈表:存儲的是兩個地址,最後一個元素所存儲的兩個地址分別是上一個元素的地址和第一個元素的地址
  (5)hash:一般翻譯做“散列”,也有直接音譯爲“哈希”的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的信息壓縮到某一固定長度的消息摘要的函數。(在JAVA-11有講解)
  (6)二叉樹:(在JAVA-11有講解)
面試題要點:數據結構:存儲數據的方式 問題:常見數據結構的優缺點?

二. 集合概念
2.1 :由於數組不適應長度變化的需求,所有Java就提供了集合類供我們使用。
  數組特點:
    1.長度固定
    2.可以存儲基本類型,也可以存儲引用類型
    3.存儲元素類型一致
  集合特點:
    1.長度可變
    2.只可以存儲引用類型
    3.可以存儲多種類型
2.2 爲什麼出現集合類?
  面嚮對象語言對事物的體現都是以對象的形式,所以爲了方便對多個對象的操作,我們就需要對這多個對象進行存儲。而目前爲止我們學習過的可以存儲多個元素的東西是數組,但是呢,數組長度固定,不能適應變化的需求,所以,Java就提供了集合類供我們使用。

三.
3.1 Java提供了集合類供我們使用,而我們的需求可能是這樣的:
  元素是有序的,
  元素是無序的,
  元素是唯一的,
  元素是可以重複的。
爲了滿足不同的需求,Java就提供了不同的集合類。而這些集合類由於數據結構不同,纔可以滿足這些條件的。  數據結構:存儲元素的方式。而無論這些集合的結構是什麼樣子的,都是要裝對象的,所以,他們應該有共性的內容。
  通過不斷的向上提取,最終會形成一個集合的繼承體系圖。

3.2 java API 集合類的繼承體系圖介紹
  這裏寫圖片描述

四. 開發中常類介紹
String, Math, Scanner, List, ArrayList, 等等
集合部分:
1.Collection
  1.1 簡單介紹這個接口
    是集合的頂層結構,定義了集合的共性功能。
    可以存儲對象,這些對象也被稱爲元素。
  1.2 成員方法:(API 看到E我們先把它理解爲Object即可)
    A:添加功能
      boolean add(Object obj):往集合中添加一個元素
      boolean addAll(Collection c):往集合中添加多個元素
    B:刪除功能
      void clear():清空所有元素
      boolean remove(Object o):從集合中刪除一個元素
      boolean removeAll(Collection c):從集合中刪除另一個集合的元素
    C:判斷功能
      boolean contains(Object o):判斷集合中是否包含指定的元素
      boolean containsAll(Collection c):判斷集合中是否包含另一個集合的元素
      boolean isEmpty():判斷集合是否爲空。
    D:交集功能
      boolean retainAll(Collection c)
    E:迭代器(集合特有的遍歷方式)
      Iterator iterator()
    F:長度功能
      int size():返回集合中元素的個數
面試題:數組有length()嗎?字符串有length()嗎?集合有length()嗎?
    G:集合轉數組
      Object[]toArray():把集合轉成數組,然後遍歷數組,其實就相當於遍歷了集合。(一般不用)
  1.3 迭代器(重點):
    Iterator iterator()
    Object next():返回迭代的下一個元素,並移動指向的位置
    boolean hasNext():判斷是否有元素
    NoSuchElementException:沒有這樣的元素異常。原因是:你已經獲取到元素的末尾了,你還要繼續獲取元素,已經沒有了,所以就報錯了。
  解決方案:在拿之前判斷一下是否有元素。
  迭代器遍歷集合:
    迭代器是依賴於集合而存在的。所以,要想得到迭代器對象,必須先有集合對象。
  迭代步驟:
    A:通過集合對象獲取到迭代器對象
    B:通過迭代器對象的hasNext()方法判斷是否有元素
    C:通過迭代器對象的next()方法獲取元素
  1.4 練習:創建狗對象(帶參數),存儲到集合,用迭代器和進行遍歷並打印對象的屬性數據

package com.edu_05;
//創建Dog類
public class Dog {
    private String name;
    private int age;
    private String type;
    public Dog(String name, int age, String type) {
        super();
        this.name = name;
        this.age = age;
        this.type = type;
    }
    public Dog() {
        super();
        // TODO Auto-generated constructor stub
    }
    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;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
}
package com.edu_05;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class DogTest {
    public static void main(String[] args) {
        /**
         * 1.創建dog對象
         * 2.創建集合
         * 3.將dog對象添加到集合
         * 4.獲取迭代器對象
         * 5.調用方法進行遍歷
         */
        //1.創建dog對象
        Dog d1 = new Dog("小黑", 1, "藏獒");
        Dog d2 = new Dog("小黃", 1, "金毛");
        Dog d3 = new Dog("小白", 2, "薩摩耶");

        //2.創建集合
        Collection c = new ArrayList();

        //3.將dog對象添加到集合
        c.add(d1);
        c.add(d2);
        c.add(d3);

        //4.獲取迭代器對象,該集合對應的迭代器對象
        Iterator it = c.iterator();

        // 5.調用方法進行遍歷
        while (it.hasNext()) {
            Dog d = (Dog) it.next();//獲取下一個元素並進行強轉
            System.out.println(d.getName()+"  "+d.getAge()+"  "+d.getType());
        }
        System.out.println("----------------");
        for (Object obj : c) {
            Dog d = (Dog)obj;
            System.out.println(d.getName()+"  "+d.getAge()+"  "+d.getType());
        }
    }
}

2. List
  (1) List集合的元素有序(存儲和取出順序一致),元素可重複
  (2) List的特有功能:
      A:添加功能
        void add(int index,Object obj):在指定的位置添加元素
      B:刪除功能
        Object remove(int index):通過指定的索引刪除元素,並把刪除的元素返回
      C:獲取功能
        get(int index) 返回列表中指定位置的元素。
      D:替換功能
        Object set(int index,Object obj)
  (3) List的倒序與洗牌
    List中元素順序可以被洗牌Collections.shuffle(list)
    List中元素順序可以被倒序Collections.reverse(list)
    Collections.sort(list)對List元素排序(字母數字分別進行測試)
  (4) List的遍歷(掌握)
    1.for(普通for)
    2.Iterator(迭代器)
    3.foreach(增強for)
3. ArrayList
    基本用法和List相同
4. LinkedList
    LinkedList特有功能:
      public void addFirst(E e)
      public void addLast(E e)
      public E getFirst()
      public E getLast()
      public E removeFirst()
      public E removeLast()
5. ArrayList與LinkedList的相同點與不同點 (面試題)**
  相同點:有順序的,元素可以重複
    (1)ArrayList特點:
      底層數據結構是數組,查詢快,增刪慢
      線程不安全,效率高
    (2)LinkedList特點:
      底層數據結構是鏈表,查詢慢,增刪快
      線程不安全,效率高

6. 泛型入門
泛型(掌握)
  (1)是一種把明確數據類型的工作推遲到創建對象或者調用方法的時候纔去明確類型的特殊類型
  (2)格式:
    <數據類型>
    默認情況下,是Object類型。
    這裏數據類型只能是引用類型。如果你看到寫基本類型也行,其實這裏使用了自動裝箱。
  (3)好處:
    A:把運行時期問題提前到了編譯時期
    B:避免了強制類型轉換
    C:優化程序設計,解決了黃色警告線問題
  (4)在哪裏用?
    一般來說就是在集合中用的多。
    看API,如果類或者接口或者方法出現了<>說明這裏就有泛型。
  (5)泛型的概述(瞭解)
    A:泛型類(把泛型定義在類上)
    B:泛型方法(把泛型定義在方法上)
    C:泛型接口(泛型定義在接口上)
  (6)泛型通配符(先不進行講解,後面會根據實例一一進行講解)
    

發佈了41 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章