先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
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)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!