数据结构java版之堆+对象的比较,mysql数据库sql语句面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

1.问题提出

2.元素的比较

2.1 元素的比较

2.2 对象的比较

3. 对象的比较

3.1 覆写基类的equal

3.2 基于Comparble接口类的比较

3.3 基于比较器比较

3.4 三种方式对比

6.上节课遗留的堆的问题

6.1TopK 问题

6.2 面试题


1.问题提出

======

上篇博客我们奖励优先级队列, 优先级队列在插入元素时有个要求:插入的元素不能是 null 或者元素之间必须要能够 进行比较 ,为了简单起见,我们只是插入了 Integer 类型,那优先级队列中能否插入自定义类型对象呢?

下面让我们一起来看看

①当插入元素为null时:(无论在什么时候插入null,都会报空指针异常)

2.元素的比较

=======================================================================

2.1 基本类型的比较

在 Java 中,基本类型的对象可以直接比较大小。

public class TestCompare {

public static void main(String[] args) {

//①整型数据的比较

int a = 10; int b = 20;

System.out.println(a > b);

System.out.println(a < b);

System.out.println(a == b);

//②字符型数据的比较

char c1 = ‘A’;

char c2 = ‘B’;

System.out.println(c1 > c2);

System.out.println(c1 < c2);

System.out.println(c1 == c2);

//布尔类型数据的比较

boolean b1 = true;

boolean b2 = false;

System.out.println(b1 == b2);

System.out.println(b1 != b2); } }

2.2 对象的比较

class Card {

public int rank;

// 数值 public String suit;

// 花色 public Card(int rank, String suit) {

this.rank = rank;

this.suit = suit;

}

}

public class TestPriorityQueue {

public static void main(String[] args) {

Card c1 = new Card(1, “♠”);

Card c2 = new Card(2, “♠”);

Card c3 = c1;

System.out.println(c1 > c2);

// 编译报错

System.out.println(c1 == c2);

// 编译成功 ----> 打印false,因为c1和c2指向的是不同对象

System.out.println(c1 < c2); // 编译报错

System.out.println(c1 == c3); // 编译成功 ----> 打印true,因为c1和c3指向的是同一个对象

}

}

3. 对象的比较

=================

有些情况下,需要比较的是对象中的内容,比如:向优先级队列中插入某个对象时,需要对按照对象中内容来调整堆,那该如何处理呢?

3.1 覆写基类的equal

注意:当自定义类型要比较两个是不是相同的,内容相同,一定要重写其equals方法

修改代码为:

class Card{

public int rank;
public String suit;
public Card(int rank, String suit) {
    this.rank = rank;
    this.suit = suit;
}
@Override
public String toString() {
    return "Card{" +
            "rank=" + rank +
            ", suit='" + suit + '\'' +
            '}';
}
@Override
public boolean equals(Object o) {

//如果this引用和o引用 引用的是同一个对象

    if (this == o) return true;

//getClass()这里比较的是是不是同一个类型,不是的话返回false;当然此处可以用instanceof来判断

//if (o == null || !(o instanceof Card))可以用此语句来代替

    if (o == null || getClass() != o.getClass()) return false;
    Card card = (Card) o;

//数字一样并且花色一样,那么逻辑上就是一样的

    return rank == card.rank && Objects.equals(suit, card.suit);
}
@Override
public int hashCode() {
    return Objects.hash(rank, suit);
}

}

public class TestDemo {

public static void main(String[] args) {
    Card card1 = new Card(1, "♥");
    Card card2 = new Card(1, "♥");
    System.out.println(card1.equals(card2));
}

注意: 一般覆写 equals 的套路就是上面演示的

1. 如果指向同一个对象,返回 true

2. 如果传入的为 null ,返回 false

3. 如果传入的对象类型不是 Card ,返回 false

4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌

5. 注意下调用其他引用类型的比较也需要 equals ,例如这里的 suit 的比较

覆写基类 equal 的方式虽然可以比较,但缺陷是: equal 只能按照相等进行比较,不能按照大于、小于的方式进行 比较 。v

3.2 基于Comparble接口类的比较

为了具备比较的能力,在这里实现Comparable接口,自己对自己需要的指定部分进行比较(此处默认为小堆的比较)

代码如下:

import java.util.PriorityQueue;

//要具备比较的能力

class Card implements Comparable{

public int rank;
public String suit;
public Card(int rank, String suit) {
    this.rank = rank;
    this.suit = suit;
}
@Override
public String toString() {
    return "Card{" +
            "rank=" + rank +
            ", suit='" + suit + '\'' +
            '}';
}
@Override
public int compareTo(Card o) {
    //自己定义比较的内容
    return o.rank-this.rank;
}

}

public class TestDemo {

public static void main(String[] args) {
    //默认底层为小根堆,每存入一个元素均会进行比较
    PriorityQueue<Card>priorityQueue=new PriorityQueue<>();
    priorityQueue.offer(new Card(2,"♥"));//存取第一个元素时实际上是直接放到底层的queue数组的0下标
    priorityQueue.offer(new Card(1,"♥"));
    System.out.println(priorityQueue);
}

3.3 基于比较器比较

代码如下:

import java.util.Comparator;

import java.util.PriorityQueue;

//要具备比较的能力

class Card{

public int rank;
public String suit;
public Card(int rank, String suit) {
    this.rank = rank;
    this.suit = suit;
}
@Override
public String toString() {
    return "Card{" +
            "rank=" + rank +
            ", suit='" + suit + '\'' +
            '}';
}

}

    class RankCompartor implements Comparator<Card>{
        @Override
        public int compare(Card o1, Card o2) {
            return o1.rank-o2.rank;
        }
    }

public class TestDemo {

public static void main(String[] args) {
    //默认底层为小根堆,每存入一个元素均会进行比较
Card card1=new Card(1,"♥");
Card card2=new Card(2,"♥");
RankCompartor rankCompartor=new RankCompartor();
int ret=rankCompartor.compare(card1,card2);
    System.out.println(ret);
}

同样可以用以下两种方法:

方法①:匿名内部类

PriorityQueue priorityQueue = new PriorityQueue<>(new Comparator() {

        @Override
        public int compare(Card o1, Card o2) {
            return o1.rank-o2.rank;
        }
    });

方法②:lambda表达式

    PriorityQueue<Card> priorityQueue = new PriorityQueue<>((x,y)->{return y.rank-x.rank;});

3.4 三种方式对比

最后

经过日积月累, 以下是小编归纳整理的深入了解Java虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。







由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-qV5zbhpC-1713711411931)]
[外链图片转存中…(img-zBRxCjbB-1713711411931)]
[外链图片转存中…(img-36K8aAo3-1713711411932)]
[外链图片转存中…(img-vnX4XJ34-1713711411932)]
[外链图片转存中…(img-r5zyUBJ2-1713711411933)]
[外链图片转存中…(img-CoGVkT8J-1713711411933)]

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-M9tEunmD-1713711411934)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值