java (基础) 比较器的使用,匿名内部类,二叉树的了解

1二叉树的了解

通过查阅API我们得知TreeSet集合是基于TreeMap的实现,而TreeMap是基于二叉树(红黑树)结构,也就是说TreeSet集合的底层使用的二叉树(红黑树)结构。

树结构:它也是数据结构中的一种。在计算机领域中树结构指的是倒立的树。

树结构存储的数据,每个数据也需要节点来保存。

而TreeSet集合底层是二叉树的数据结构,什么是二叉树呢?

二叉树:每个节点的下面最多只能有2个子节点。

说明:最多表示一个节点下面可以有两个子节点或者一个子节点或者没有子节点。

在二叉树的根节点左侧的节点称为左子树,在根节点的右侧的节点称为右子树。

既然已经得知TreeSet集合底层是二叉树,那么二叉树是怎样存储数据的呢?是怎样保证存储的数据唯一并有序的呢?

二叉树的存储流程:

当存储一个元素的时候,如果是树的第一个元素,这个元素就作为根节点。

如果不是第一个元素,那么就拿要存储的元素与根节点进行比较大小:

大于根元素:就将要存储的元素放到根节点的右侧,作为右叶子节点。

等于根元素:丢弃。

小于根元素:就将要存储的元素放到根节点的左侧,作为左叶子节点。

总结:二叉树是通过比较大小来保证元素唯一和排序的。
20  10  31  5  13  23 51

http://data.biancheng.net/view/192.html

2.使用比较器将数据存储到TreeSet中

比较器接口 Comparator<>

package zzy;

import java.util.*;

class Person {//
    String name;
    int age;
    public Person(){

    }

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


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


public class Dome6 {
    public static void main(String[] args) {
        TreeSet<Person> list = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int num = o1.age - o2.age;
                return num;
            }
        });//内部类的应用 调用TreeSet的有参构造器给它传一个比较器,我这是直接把比较器接口传给了TreeSet,还可以创建一个比较器的实现类,然后在传。
        list.add(new  Person("大黄",1));
        list.add(new  Person("大黄",2));
        list.add(new  Person("大黄",5));
        list.add(new  Person("大黄",7));
        list.add(new Person("大黄",3));
        //Collections.sort(list,new Person());
        System.out.println(list);




    }
}

3.匿名内部类

为了减少代码量

3.1基于抽象类的匿名内部类
abstract class Person {
    public abstract void eat();
}
public class Demo1 {
    public static void main(String[] args) {
        //匿名内部类:在实例化对抽象类同时并重写抽象方法
        Person person = new Person(){
            @Override
            public void eat() {
                System.out.println("222");
            }
        };
        person.eat();
    }
}

3.2基于接口的匿名内部类
interface A {
    void testA();

}
public class Demo3 {
    public static void main(String[] args) {
        //这个有名
//        A a = new A(){
//
//            @Override
//            public void testA() {
//                System.out.println("111");
//            }
//        };
//        a.testA();
//2这个才是真正的匿名,上面的抽象类同理
        new A(){

            @Override
            public void testA() {
                System.out.println("222");
            }
        }.testA();
    }
}

4.内部类(不用,了解即可)

在类的方法的外面再类中,就是成员内部类

class MemberDemo {
    String name = "张三";
    int age = 20;

    public void printf() {
        System.out.println("打印着玩");
    }
    class Inner {//就是内部类
        String name = "李四";
        //在Inner这个类中可以访问外部类的属性和方法
        public void test () {
            printf();//打印着玩
            System.out.println(age);//20
            System.out.println(name);//李四
            //如果访问外部特定的属性的时候: 类名.this.属性
            System.out.println(MemberDemo.this.name);//张三
        }
    }

}
public class Demo1 {
    public static void main(String[] args) {
        //成员内部类的创建步骤:
        //1.实例化外部类 类对象
        MemberDemo memberDemo = new MemberDemo();
        //2.实例化内部类对象,但是new得改为  外部对象.new
        MemberDemo.Inner inner = memberDemo.new Inner();
        inner.test();

    }
}

关注博主学Java

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值