day22-java

红黑树(增删改查效率都很高)

红黑规则:

  • 每一个节点是红色或者黑色,根节点必须是黑色
  • 如果一个节点没有子节点或者父节点,则这个节点相应的指针属性为Nil,称为叶节点,叶节点是黑色的
  • 如果一个节点是红色的,那么它的子节点必须是黑色的(不能出现两个红节点相连的情况
  • 对每一个节点,从该节点到其后代叶节点的简单路径上,黑节点的数量应相同

添加节点:

添加的节点可以为红色也可为黑色,使用红色效率高

当添加的节点是根节点时,直接变为黑色就行

当父节点是黑色时,不需要做其他操作

当父节点是红色,叔叔节点也是红色时,将父节点和叔叔节点变为黑色,祖父节点变为红色,若祖父节点是根节点,则将根节点再变为黑色

当父节点是红色,叔叔节点是黑色时,将父节点变为黑色,祖父节点变为红色,以祖父节点为支点进行旋转

Collection集合系列

概述

package com.itheima.collection.summarize;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

/**
 * 集合概述
 * 集合只支持引用数据类型,不支持基本数据类型,基本数据类型应使用包装类
 * 集合元素类型、长度不固定,适合做增删操作
 * 集合分为单列集合Collection(每个元素只包含一个值)、双列集合Map(每个元素包含两个值,称为键值对)
 * Collection集合体系包括List集合和Set集合
 * List集合包括ArrayList、LinkedList等
 * 特点是:有序、可重复、有索引
 * Set集合包括HashSet、TreeSet、LinkedHashSet等
 * HashSet特点是:无序、不可重复、无索引
 * LinkedHashSet:有序、不可重复、无索引
 * TreeSet:按大小默认升序排列、不可重复、无索引
 */
public class Demo01Collection {
    public static void main(String[] args) {
        //有序、可重复、有索引
        Collection list = new ArrayList<>();
        list.add("java");
        list.add("java");
        list.add(3245);
        list.add(true);
        list.add(true);
        //[java, java, 3245, true, true]
        System.out.println(list);
        System.out.println("----------------------------------------");
        //无序、不可重复、无索引
        Collection list1 = new HashSet();
        list1.add("java");
        list1.add("java");
        list1.add(3245);
        list1.add(true);
        list1.add(true);
        //[java, 3245, true]
        System.out.println(list1);

//        ArrayList<String> s = new ArrayList<String>();
        ArrayList<String> s = new ArrayList<>();//从JDK7开始,后面的限制类型可省略
    }
}

常用API

package com.itheima.collection.api;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/**
 * Collection常用API
 */
public class Demo01 {
    public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        //1.boolean add(E e)添加元素到集合中
        list.add("java");
        list.add("HTML");
        list.add("mysql");
        //true,如果是HashSet集合就是false
        System.out.println(list.add("java"));
        //[java, HTML, mysql, java]
        System.out.println(list);

        //2.void clear()清空集合元素
        //list.clear();
        //[]
        //System.out.println(list);

        //3.boolean remove(E e)在集合中删除给定对象
        //存在多个相同元素时默认删除第一个
        list.remove("java");
        //[HTML, mysql, java]
        System.out.println(list);

        //4.boolean contains(Object o)判断是否包含给定对象
        //true
        System.out.println(list.contains("HTML"));

        //5.boolean isEmpty()判断集合是否为空
        //false
        System.out.println(list.isEmpty());

        //6.int size()返回集合中元素个数
        //3
        System.out.println(list.size());

        //7.Object[] toArray()把集合中的元素存储到数组中
        //注意:这里数组类型为Object,不能是String,因为存在强制存入非String类型对象情况
        Object[] arr = list.toArray();
        //[java, HTML, java]
        System.out.println("数组:"+Arrays.toString(arr));

        System.out.println("--------------拓展---------------");
        Collection<String> list1 = new ArrayList<>();
        list1.add("赵敏");
        list1.add("殷素素");
        //把一个集合的元素全部添加到另一个集合中去
        list.addAll(list1);
        //[HTML, mysql, java, 赵敏, 殷素素]
        System.out.println(list);
        //[赵敏, 殷素素]
        System.out.println(list1);
    }
}

迭代器

package com.itheima.collection.api;

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

/**
 * 迭代器
 * 无法遍历数组
 * 继承了Iterable接口的类才可以使用迭代器和foreach循环
 */
public class Demo02Iterator {
    public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        ((ArrayList<String>) list).add("殷素素");
        ((ArrayList<String>) list).add("张无忌");
        ((ArrayList<String>) list).add("赵敏");
        //创建迭代器对象,默认指向索引0位置
        Iterator<String> it = list.iterator();
        //判断当前位置是否有元素,避免越界异常(NoSuchElementException)
        while (it.hasNext()){
            //获取当前位置元素
            String next = it.next();
            System.out.println(next);
//            System.out.println(it.next());报错
        }
        //Collection类型不支持索引,不能用索引遍历
        for (String s : list) {
            System.out.println(s);
            if (s.equals("张无忌")){
                //修改无效
                s = "周芷若";
            }
        }
        //[殷素素, 张无忌, 赵敏]
        System.out.println(list);
    }
}

lambda遍历集合

package com.itheima.collection.api;

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

/**
 * Lambda表达式遍历集合
 * default void forEach(Consumer<? super T> action)
 */
public class Demo03Lambda {
    public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        ((ArrayList<String>) list).add("殷素素");
        ((ArrayList<String>) list).add("张无忌");
        ((ArrayList<String>) list).add("赵敏");
        //遍历集合
//        list.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });

        //简化:
//        list.forEach(s -> System.out.println(s));
        //终极简化
        list.forEach(System.out::println);
    }
}

集合中存储自定义对象

package com.itheima.collection.api;

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

/**
 * 往集合中存储自定义类型对象
 */
public class Demo04Custom {
    public static void main(String[] args) {
        Movie movie1 = new Movie("《你好,李焕英》", 9.5, "张小斐、贾玲、沈腾、陈赫");
        Movie movie2 = new Movie("《唐人街探案》", 8.5, "王宝强、刘昊然");
        Movie movie3 = new Movie("《刺杀小说家》", 8.6, "雷佳音、杨幂");
        Collection<Movie> movies = new ArrayList<>();
        movies.add(movie1);
        movies.add(movie2);
        movies.add(movie3);
        Iterator<Movie> it = movies.iterator();
        while (it.hasNext()){
            Movie next = it.next();
            System.out.println(next.toString());
        }
    }
}

Movie类

package com.itheima.collection.api;

public class Movie {
    private String name;
    private double score;
    private String castList;

    @Override
    public String toString() {
        return "Movie{" +
                "name='" + name + '\'' +
                ", score=" + score +
                ", castList='" + castList + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public String getCastList() {
        return castList;
    }

    public void setCastList(String castList) {
        this.castList = castList;
    }

    public Movie() {
    }

    public Movie(String name, double score, String castList) {
        this.name = name;
        this.score = score;
        this.castList = castList;
    }
}

List系列集合

特点及常用API

package com.itheima.list;

import java.util.LinkedList;
import java.util.List;

/**
 * List系列集合特点及常用API
 * 继承了Collection集合的功能,多了一些基于索引的独有方法
 * ArrayList集合底层是基于数组实现的,根据索引查询元素快,增删相对慢
 * LikedList集合底层是基于双向链表实现的,查询元素慢,增删首尾元素非常快
 */
public class Demo01 {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("java");
        list.add("mysql");
        list.add("html");
        list.add("javascript");
        System.out.println(list);

        //1.指定位置插入指定元素
        list.add(2,"666");
        System.out.println("在索引2位置插入一个元素后:"+list);

        //2.删除指定索引位置的元素,返回被删除的元素
        String s = list.remove(1);
        System.out.println("被删除的元素为:"+s);
        System.out.println("删除一个元素后集合元素还有:"+list);

        //3.修改指定索引位置的元素,返回被修改的元素
        String s1 = list.set(1, "html");
        System.out.println("被修改的元素为:"+s1);
        System.out.println("修改索引1位置的元素后:"+list);

        //4.获取指定索引位置的元素
        String s2 = list.get(3);
        System.out.println("索引3位置的元素为:"+s2);
        //5.判断是否包含
        //底层是依赖equals方法进行判断是否包含,若存储的是自定义对象,则需要在javabean中重写equals方法
        boolean contains = list.contains("mysql");
		System.out.println(contains);
    }
}

List集合遍历方式

package com.itheima.list;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * List集合的遍历方式
 * 1.迭代器
 * 2.增强型for循环
 * 3.Lambda表达式
 * 4.for循环
 */
public class Demo02BianLi {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("java");
        list.add("html");
        list.add("js");

        //1.迭代器
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String next = it.next();
            System.out.println(next);
        }
        System.out.println("--------------------------------------");

        //2.增强for循环
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("--------------------------------------");

        //3.Lambda表达式
        list.forEach(s-> System.out.println(s));
        System.out.println("--------------------------------------");

        //4.for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

LinkedList独有API

package com.itheima.list;

import java.util.LinkedList;

/**
 * LinkedList多了很多首尾操作的API
 * 1.E getFirst()
 * 2.E getLast()
 * 3.E removeFirst()
 * 4.E removeLast()
 * 5.void addFirst()
 * 6.void addLast()
 */
public class Demo03LinkedList {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("java1");
        list.add("java2");
        list.add("java3");
        System.out.println(list);

        System.out.println("首部添加元素jjj");
        //首部添加元素
        list.addFirst("jjj");
        //获取首部元素
        String first = list.getFirst();
        System.out.println("首部元素:"+first);
        System.out.println(list);

        System.out.println("尾部添加元素ee");
        //尾部添加元素
        list.addLast("ee");
        //获得尾部元素
        String last = list.getLast();
        System.out.println("尾部元素:"+last);
        System.out.println(list);

        System.out.println("移除首部元素");
        //移除首部元素
        list.removeFirst();
        System.out.println(list);

        System.out.println("移除尾部元素");
        //移除尾部元素
        list.removeLast();
        System.out.println(list);
        System.out.println("------------------------------------------------");
        
        //使用LinkedList做一个队列
        LinkedList<String> queue = new LinkedList<>();
        //入队
        queue.addLast("111");
        queue.addLast("222");
        queue.addLast("333");
        System.out.println(queue);
        //出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());

        //做一个栈
        LinkedList<String> stack = new LinkedList<>();
        //压栈,push同addFirst
        stack.push("aaa");
        stack.push("bbb");
        stack.push("ccc");
        System.out.println(stack);
        //弹栈,pop同removeFirst
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}

并发修改异常

package com.itheima.list;

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

/**
 * 集合遍历删除可能出现的,并发修改异常问题
 */
public class Demo04Delete {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Java");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);

        //1.使用迭代器遍历删除
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String next = it.next();
            if ("Java".equals(next)){
//                list.remove(next);使用集合删除元素会报错,ConcurrentModificationException
                  it.remove();//修改当前索引位置元素,使用迭代器的api不会报错
            }
        }
        System.out.println(list);

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("Java");
        list1.add("Java");
        list1.add("bbb");
        list1.add("ccc");
        list1.add("ddd");
        System.out.println(list1);

        //2.使用foreach循环遍历删除,会出问题,且无法解决
//        for (String s : list) {
//            if ("Java".equals(s)){
//                list.remove(next);使用集合删除元素会报错,ConcurrentModificationException
//            }
//        }

        //3.使用lambda表达式遍历删除,和foreach循环一样
//        list.forEach(s -> {if ("Java".equals(s)){
//                list.remove(s);//使用集合删除元素会报错,ConcurrentModificationException
//        }});

        //4.for循环遍历删除,从后面边遍历边删除才没问题
        for (int i = list.size()-1; i >=0 ; i--) {
            String s = list.get(i);
            if ("Java".equals(s)){
                list.remove(s);
            }
        }
        System.out.println(list);
    }
}

泛型

泛型类

package com.itheima.genericity;

import com.itheima.genericity.demo01domain.MyArrayList;

/**
 * 模拟ArrayList集合自定义一个集合MyArrayList集合
 * 完成添加和删除功能的泛型设计即可。
 */
public class Demo01GenericityClass {
    public static void main(String[] args) {
        MyArrayList<String> myList = new MyArrayList<>();
        myList.add("java");
        myList.add("java3");
        myList.add("java1");
        System.out.println(myList.toString());
        myList.remove("java");
        System.out.println(myList.toString());
    }
}

MyArrayList类

package com.itheima.genericity.demo01domain;

import java.util.ArrayList;

public class MyArrayList<T> {
    //外部对象里面装一个对象
    private ArrayList<T> list = new ArrayList<>();
    public void add(T t){
        list.add(t);
    }
    public void remove(T t){
        list.remove(t);
    }

    @Override
    public String toString() {
        return list.toString();
    }
}

泛型方法

package com.itheima.genericity;

/**
 * 泛型方法
 * 核心思想:将所有出现泛型变量的地方全部替换为真实数据类型
 * 作用:方法中可以使用泛型接收一切实际类型的参数,方法更具通用性
 */
public class Demo02GenericityMethod {
    public static void main(String[] args) {
        Integer[] arr = {1,5,3,6,4};
        printArr(arr);
        String[] arr1 = {"sf","fa","gbv"};
        printArr(arr1);
    }
    /**
     * 需求:接收一个任意类型的数组,实现Arrays.toString(数组)功能
     */
    public static <E> void printArr(E[] arr){
        if (arr!=null){
            StringBuilder s = new StringBuilder("[");
            for (int i = 0; i < arr.length; i++) {
                    s.append(arr[i]).append(i == arr.length-1?"":",");
            }
            s.append("]");
            System.out.println(s.toString());
        }else {
            System.out.println(arr);
        }

    }
}

泛型接口

package com.itheima.genericity;

/**
 * 泛型接口
 * 作用:可以约束实现类,实现类在实现接口的时候可以传入自己操作的数据类型
 * 这样重写的方法都将是针对于该类型的操作
 * @param <E>
 */
public interface Demo03GenericityInterface<E> {
    void add(E e);
    void delete(E e);
    E queryId(int id);
}

Teacher类

package com.itheima.genericity.demo03domain;

public class Teacher {
}

Student类

package com.itheima.genericity.demo03domain;

public class Student {
}

StudentData类

package com.itheima.genericity.demo03domain;

import com.itheima.genericity.Demo03GenericityInterface;

public class StudentData implements Demo03GenericityInterface<Student> {
    @Override
    public void add(Student student) {

    }

    @Override
    public void delete(Student student) {

    }

    @Override
    public Student queryId(int id) {
        return null;
    }
}

TeacherData类

package com.itheima.genericity.demo03domain;

import com.itheima.genericity.Demo03GenericityInterface;

public class TeacherData implements Demo03GenericityInterface {
    @Override
    public void add(Object o) {

    }

    @Override
    public void delete(Object o) {

    }

    @Override
    public Object queryId(int id) {
        return null;
    }
}

通配符

package com.itheima.genericity;

import java.util.ArrayList;

/**
 * 通配符:?
 * 作用:可以在使用泛型的时候表示一切类型
 * 泛型上限:? extends Car:?必须是Car类型或者其子类
 * 泛型下限:? super Car:?必须是Car类型或者其父类
 */
public class Demo04 {
    public static void main(String[] args) {
        ArrayList<BenCi> benCis = new ArrayList<>();
        benCis.add(new BenCi());
        benCis.add(new BenCi());
        benCis.add(new BenCi());
        go(benCis);

        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        bmws.add(new BMW());
        go(bmws);
    }
    public static void go(ArrayList<? extends Car> arrayList){

    }
}
class Car{

}
class BMW extends Car{

}
class BenCi extends Car{

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值