Day13_資料結構與集合(上)
阿新 • • 發佈:2020-08-21
Day13_資料結構與集合(上)
線性表
- 相同資料型別
- 序列(順序性)
- 有限
陣列
優點:按照索引查詢的效率高,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}