Java学习与复习笔记--Day09

数据结构部分:

栈:后进先出

队列:先进先出

数组:

查询快:数组的地址是连续的,我们可以通过数组的首地址找到数组,通过数组的索引可以快速查找某一个元素

增删慢:数组的长度是固定的,我们想要增加/删除一个元素,必须创建一个新数组,把原数组的数据复制过来

链表:

查询慢:链表中的地址不是连续的,每次查询元素,都必须从头开始查询

增删快:链表结构,增加或者删除一个元素,对链表的整体结构没有影响,所以增删快。

单向链表:链表只有一条链子,不能保证元素的顺序(存储元素和取出元素的顺序可能不一致)

双向链表:链表中有两条链子,有一条链子是专门记录元素的顺序,是一个有序的集合。

红黑树:特点:趋近于平衡树,查询的速度非常快,查询叶子节点最大次数和最小次数不能超过2倍

约束条件:

1.节点可以是红色的或者黑色的

2.根节点是黑色的

3.叶子结点(空节点)是黑色的

4.每个红色的节点的子节点都是黑色的

5.任何一个节点到其每一个叶子节点的所有路径上黑色节点数量相同(数据结构内容很少,详细可以看对应书籍)

List集合:

/*
* java.util.List接口extends Collection接口
* List接口的特点:
* 1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
* 2.有索引,包含了一些带索引的方法
* 3.允许存储重复的元素
*
* List接口中带索引的方法(特有)
* -public void add(int index,E element):将指定的元素,添加到该集合的指定位置上
* -public E get(int index):返回集合中指定位置的元素
* -public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素
* -public E set(int index,E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素
* 注意事项:
* 操作索引的时候,一定要防止索引越界异常
* IndexOutOfBoundsException:索引越界异常,集合会报
* ArrayIndexOutOfBoundsException:数组索引越界异常
* StringIndexOutOfBoundsException:字符串索引越界异常
* */
public class Demo01List {
    public static void main(String[] args) {
        //创建一个List集合对象,多态
        List<String> list=new ArrayList<>();
        //使用add方法往集合中添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("a");
        System.out.println(list);//[a, b, c, d, a],不是地址,重写了toString方法
        //public void add(int index,E element):将指定的元素,添加到该集合的指定位置上
        //c,d之间添加元素
        list.add(3,"haha");
        System.out.println(list);//[a, b, c, haha, d, a]
        //public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素
        //移除c元素
        String remove = list.remove(2);
        System.out.println("被移除的元素:"+remove);//被移除的元素:c
        System.out.println(list);//[a, b, haha, d, a]
        //public E set(int index,E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素
        //把最后一个a,替换为A
        String setE = list.set(4, "A");
        System.out.println("被替换的元素:"+setE);//被替换的元素:a
        System.out.println(list);//[a, b, haha, d, A]
        //List集合遍历有三种方式
        //使用普通for循环
        for (int i = 0; i <list.size(); i++) {
            //public E get(int index):返回集合中指定位置的元素
            String getE = list.get(i);
            System.out.println(getE);
        }
        System.out.println("--------");
        //使用迭代器
        Iterator<String> it=list.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("----------");
        //使用增强for循环
        for (String s : list) {
            System.out.println(s);
        }
    }
}

ArrayList集合:集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据所以ArrayList是最常用的集合。但需要增删时,应慎重选择。

LinkedList集合:

/*
* java.util.LinkedList集合 implements List接口
* LinkedList集合的特点:
* 1.底层是一个链表结构:查询慢,增删快
* 2.里面包含了大量操作首尾元素的方法
* 注意:使用LinkedList集合特有的方法,不能使用多态
* addFirst(E e) :在该列表开头插入指定的元素。
* addLast(E e) :将指定的元素追加到此列表的末尾。
* push(E e) :将元素推送到由此列表表示的堆栈上。
* getFirst(): 返回此列表中的第一个元素。
* getLast() :返回此列表中的最后一个元素
* removeFirst() :从此列表中删除并返回第一个元素。
* removeLast() :从此列表中删除并返回最后一个元素。
* pop() :从此列表表示的堆栈中弹出一个元素。
* */
public class Demo02LinkedList {
    public static void main(String[] args) {
        //show01();
        //show02();
        show03();

    }
    /*removeFirst() :从此列表中删除并返回第一个元素。
     * removeLast() :从此列表中删除并返回最后一个元素。
     * pop() :从此列表表示的堆栈中弹出一个元素。
     * */
    private static void show03() {
        //创建LinkedList集合对象
        LinkedList<String> linked = new LinkedList<>();
        //添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");
        linked.add("d");
        System.out.println(linked);
        //String first = linked.removeFirst();
        String first = linked.pop();//和上面一行作用相同
        System.out.println("被移除的第一个元素"+first);//被移除的第一个元素a
        String last = linked.removeLast();
        System.out.println("被移除的最后一个元素"+last);//被移除的最后一个元素d
        System.out.println(linked);
    }

    private static void show02() {
        //创建LinkedList集合对象
        LinkedList<String> linked = new LinkedList<>();
        //添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");
        linked.add("d");
        //linked.clear();//清空集合中的元素,再获取集合中的元素会抛出NoSuchElementException异常
        //添加判断 isEmpty方法
        if(!linked.isEmpty()){
            String first = linked.getFirst();
            System.out.println(first);//a
            String last = linked.getLast();
            System.out.println(last);//d
        }
    }

    /*addFirst(E e) :在该列表开头插入指定的元素。
     * addLast(E e) :将指定的元素追加到此列表的末尾。
     * push(E e) :将元素推送到由此列表表示的堆栈上。
     * */
    private static void show01() {
        //创建LinkedList集合对象
        LinkedList<String> linked = new LinkedList<>();
        //添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");
        linked.add("d");
        System.out.println(linked);//[a, b, c, d]
        //addFirst(E e) :在该列表开头插入指定的元素。
        //linked.addFirst("haha");
        linked.push("haha");//效果与上一个相同
        System.out.println(linked);//[haha, a, b, c, d]
        //addLast(E e) :将指定的元素追加到此列表的末尾。
        linked.addLast("world");
        System.out.println(linked);//[haha, a, b, c, d, world]

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值