1. 程式人生 > 實用技巧 >Day13_資料結構與集合(上)

Day13_資料結構與集合(上)

Day13_資料結構與集合(上)

線性表

  1. 相同資料型別
  2. 序列(順序性)
  3. 有限

陣列

優點:按照索引查詢的效率高,O(1)

不按照索引,陣列無序:O(n)

不按照索引,陣列有序:二分法查詢 O(log2n)

連結串列

  • 單向連結串列:每個結點只有一個指標域,指向下一個結點

  • 雙向連結串列:每個結點有兩個指標域,一個指向上一個結點,一個指向下一個結點。其中第一個結點指向上一結點的指標域為空,最後一個結點指向下一結點的指標域為空

  • 迴圈連結串列: 首尾相連

棧和佇列

棧和佇列,是操作受限制的線性表。

特點:先進後出,後進先出。

簡單應用

  • 網路瀏覽器將使用者最近訪問過的網址組織為一個棧。使用者每按一次“後退”按鈕,即可沿相反次序訪問剛訪問過的頁面。
  • 文字編輯器中的撤銷和恢復功能,使用者編輯操作被依次記錄在一個棧中,使用者每按一次“後退”按鈕,即可取消最近一次操作。

佇列

特點:先進先出。

雙端佇列:兩端都可以進行進隊,出隊的佇列。

結點的度(Degree):節點擁有的子樹數目。

樹的度:樹內各結點的度的最大值。

二叉樹

每個結點的度均不超過2有序樹。以左孩子為根的子樹稱為左子樹,以右孩子為根的子樹稱為右子樹。

滿二叉樹

  • 高度為k且有(2^k+1)-1個結點的二叉樹。
  • 在滿二叉樹中,每層結點都達到最大數,即每層結點都是滿的,因此成為滿二叉樹。

完全二叉樹

若在一棵滿二叉樹中,在最下層從最右側起去掉相鄰的若干葉子結點,得到的二叉樹即為完全二叉樹。

滿二叉樹必為完全二叉樹,完全二叉樹不一定是滿二叉樹。

二叉樹的儲存結構

  • 順序儲存結構
  • 鏈式儲存結構

二叉樹的遍歷

  • 先序遍歷:根->左子樹->右子樹
  • 中序遍歷:左子樹->根->右子樹
  • 後序遍歷:左子樹->右子樹->根

平衡二叉樹

左右兩個子樹的高度差(平衡因子)的絕對值不超過1。

紅黑樹:一種特殊的平衡二叉樹。

集合

上層介面(collection)

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

public class Demo01 {
    public static void main(String[] args) {
        /*
        介面中常用的方法:
        增加:add(E e) addAll(Collection<? extends E> c)
        刪除:clear() remove(Object o)
        修改:
        檢視:iterator() size()
        判斷:contains(Object o) equals(Object o) isEmpty()
         */
        Collection col=new ArrayList();
        col.add("java");
        //集合內只能放引用資料型別,此時自動裝箱Integer i=12;
        col.add(12);
        col.add(9.8);
        System.out.println(col);
        System.out.println(col.size());
        System.out.println(col.isEmpty());
        //清空集合
        //col.clear();
        //遍歷集合
        //方式一:無法使用普通for迴圈,因為無法獲取集合索引
        //方式二:增強for迴圈
        for(Object o:col){
            System.out.print(o+"\t");
        }
        //方式三:
        Iterator it = col.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+"\t");
        }
    }
}

輸出:

[java, 12, 9.8]
3
false
java	12	9.8	java	12	9.8	

List

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

public class Demo02 {
    public static void main(String[] args) {
        List list=new ArrayList();
        list.add("java");
        list.add("html");
        list.add("css");
        list.add("js");
        System.out.println(list);
        //在索引1處新增元素
        list.add(1,"oracle");
        System.out.println(list);
        //修改指定索引處的元素
        list.set(1,"servlet");
        System.out.println(list);
        //查詢指定索引的元素
        System.out.println(list.get(0));
        //遍歷
        //方式一:普通for迴圈
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+"\t");
        }
        System.out.println();
        //方式二:增強for迴圈
        for(Object o:list){
            System.out.print(o+"\t");
        }
        System.out.println();
        //方式三:
        Iterator it = list.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+"\t");
        }
    }
}

輸出:

[java, html, css, js]
[java, oracle, html, css, js]
[java, servlet, html, css, js]
java
java	servlet	html	css	js	java	servlet	html	css	js	
java	servlet	html	css	js	

ArrayList類

底層結構:陣列

原理:陣列的擴容

Vector類(現在已淘汰)

底層結構:陣列

原理:陣列的擴容

ArrayList類:效率高,執行緒不安全

Vector:效率低,執行緒安全

泛型

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

public class Demo03 {
    public static void main(String[] args) {
        //多型,擴充套件性好
        List list=new ArrayList();
        //不需要擴充套件性好,想用ArrayList中特有的方法的時候,用這個方式
        ArrayList al=new ArrayList();
        al.add("java");
        al.add(12);
        al.add(9.8);
        System.out.println(al);

        /*泛型:加入<>表示的泛型之後,說明集合內只能放這種資料型別
        在沒有加入泛型時,會報黃色的警告
         */
        ArrayList<String> al1=new ArrayList();
        al1.add("java");
        al1.add("html");
        al1.add("css");
        al1.add("js");
        //al1.add(12);報錯,因為12的型別不是String
        for(String a:al1){
            System.out.print(a+"\t");
        }

    }
}

輸出:

[java, 12, 9.8]
java	html	css	js	

泛型類

import java.util.ArrayList;

public class Demo04<AA> {
    //普通的類Demo04後面加上一個泛型,泛型的類不確定,就變成了一個泛型類
    //並且AA的型別不確定,什麼時候才確定?建立物件的時候確定的
}

class Demo05 {
    public static void main(String[] args) {
        //在建立物件時,不使用泛型,可以,但是有黃色警告
        Demo04 demo01=new Demo04();
        //在建立物件時,使用泛型
        Demo04<String> demo02=new Demo04<String>();
        Demo04<Integer> demo03=new Demo04<Integer>();
        Demo04<Double> demo04=new Demo04<Double>();
        //泛型類的應用
        ArrayList al=new ArrayList();
        ArrayList<String> al1=new ArrayList<String>();
        ArrayList<Integer> al2=new ArrayList<Integer>();
    }
}

泛型的高階應用

泛型的上限、下限

建立一個Person類

public class Person {
    private String name;
    private int age;

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

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public Person (String name,int age){
        super();
        this.name=name;
        this.age=age;
    }

    public Person (){
        super();
    }


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

建立一個Person的子類Student類

public class Student extends Person{
    private String name;
    private double height;

    @Override
    public String getName() {
        return name;
    }

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public Student(String name,double height){
        super();
        this.name=name;
        this.height=height;
    }

    public Student(){
        super();
    }

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

示例:

import java.util.ArrayList;

public class Demo06 {

    public static void main(String[] args) {
        ArrayList<Person> al=new ArrayList<Person>();
        al.add(new Person("lili",19));
        al.add(new Person("nana",23));
        al.add(new Person("lulu",20));

        bianLi(al);

        ArrayList<Student> al2=new ArrayList<Student>();
        al2.add(new Student("lili",170.5));
        al2.add(new Student("nana",168.9));
        al2.add(new Student("lulu",172.4));

        bianLi(al2);
    }
    //泛型的上限,ArrayList<? extends Person> al表示只要是Person的子類,就可以使用
    //泛型的下限,ArrayList<? super Person> al表示只要是Person的父類,就可以使用
    public static void bianLi(ArrayList<? extends Person> al){
        for (Object p:al) {
            System.out.println(p);
        }
    }
}

輸出:

Person{name='lili', age=19}
Person{name='nana', age=23}
Person{name='lulu', age=20}
Student{name='lili', height=170.5}
Student{name='nana', height=168.9}
Student{name='lulu', height=172.4}