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}
posted @ 2020-08-21 21:41  XLR  阅读(97)  评论(0编辑  收藏  举报