先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
注意事项:
1:首先因为我们向我们优先级队列中插入的是我们自定义的对象card,其有两个属性,一个是牌的值card,一个是牌的花色,上面的代码我们是先按照牌的值来进行比较的
2:当我们的card类实现了comparable接口后,就要重写我们的compareTo方法,当return this.rank - o.rank的时候,就代表我们每次向堆中插入card对象后,我们的堆是按照小根堆的形式进行调整的,所以比较方式也是按照小根堆的形式,比较的值就是我们card对象中rank的值
底层为大根堆
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) {
Card card1 = new Card(1, “♦”);
Card card2 = new Card(2, “♦”);
Card card3 = new Card(3, “♦”);
//创建一个优先级队列
Queue qu = new PriorityQueue<>();
qu.offer(card2);
qu.offer(card1);
qu.offer(card3);
//输出结果为[Card{rank=3, suit=‘♦’}, Card{rank=1, suit=‘♦’}, Card{rank=2, suit=‘♦’}]
System.out.println(qu);
}
}
注意事项:
注意我们此处指定我们向优先级队列中插入的这个自定义对象是按照rank的值来进行比较的,同时我们还规定了这个堆每次在插入的时候是按照大根堆的形式调整的.
Comparator接口
按照rank的值进行比较
底层为小根堆
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 + ‘’’ +
‘}’;
}
}
public class TestDemo {
public static void main(String[] args) {
Card card1 = new Card(1, “♦”);
Card card2 = new Card(2, “♦”);
Card card3 = new Card(3, “♦”);
//创建一个优先级队列
Queue qu = new PriorityQueue<>(new Comparator() {
@Override
public int compare(Card o1, Card o2) {
//根据rank值来比较 默认为小根堆
return o1.rank - o2.rank;
}
});
qu.offer(card2);
qu.offer(card1);
qu.offer(card3);
//输出结果为[Card{rank=1, suit=‘♦’}, Card{rank=2, suit=‘♦’}, Card{rank=3, suit=‘♦’}]
System.out.println(qu);
}
}
注意事项
此处我们是使用Comparator接口来实现的,注意与之前的不同。然后o1.rank - o2.rank代表默认建堆形式为小根堆
底层为大根堆
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 + ‘’’ +
‘}’;
}
}
public class TestDemo {
public static void main(String[] args) {
Card card1 = new Card(1, “♦”);
Card card2 = new Card(2, “♦”);
Card card3 = new Card(3, “♦”);
//创建一个优先级队列
Queue qu = new PriorityQueue<>(new Comparator() {
@Override
public int compare(Card o1, Card o2) {
//根据rank值来比较 默认为小根堆
return o2.rank - o1.rank;
}
});
qu.offer(card2);
qu.offer(card1);
qu.offer(card3);
//输出结果为[Card{rank=3, suit=‘♦’}, Card{rank=1, suit=‘♦’}, Card{rank=2, suit=‘♦’}]
System.out.println(qu);
}
}
注意事项
此处我们是使用Comparator接口来实现的,注意与之前的不同。然后o2.rank - o1.rank代表默认建堆形式为大根堆
====================================================================
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) {
Card card1 = new Card(1, “♦”);
Card card2 = new Card(2, “♦”);
Card card3 = new Card(3, “♦”);
//直接编译报错
System.out.println(card1 > card2);
//false,因为在内存中的地址不相同
System.out.println(card1 == card2);
//编译出错
System.out.println(card1 < card2);
//结果为1
System.out.println(card1.compareTo(card2));
//结果为false
//因为我们的Card类中并没有重写我们Object类中的equals方法,所以此处的equals方法调用的是Object类中的equals方法
System.out.println(card1.equals(card2));
}
}
注意事项
1:从编译结果可以看出,Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。 那为什么==可以比较?
因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equals方法,而==默认情况下调用的就是equals方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意
。
什么情况下就不符合题意呢?来看:
class Card {
public int rank; // 数值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
}
public class TestDemo {
public static void main(String[] args) {
Card card1 = new Card(1, “♦”);
Card card2 = new Card(1, “♦”);
Card card3 = new Card(3, “♦”);
//结果为false
System.out.println(card1.equals(card2));
}
}
此时我们card1这个引用和card2这个引用所指向的对象我们会发现实际上是一张牌,但是因为这两个引用虽然逻辑上是一样的,但是在堆中却开辟了两个内存来存储这两个引用所指向的对象,而且此处的equals方法调用的是我们Object类中的equals方法,其比较方式为引用的比较,对应到上述的代码就是card1 == card2,故为false,但是我们明明是一张牌,为什么要返回false,我们想让它为true,就像字符串的equals方法一样比较其内容,不比较地址,那我们就需要在Card这个类中重写我们Object类中的equals方法,(字符串中之所以可以使用equals方法比较内容,是因为其在String类中重写了equals方法
)下面来看代码
class Card {
public int rank; // 数值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
//注意equals与hashcode方法是成对出现的,并且直接生成无需我们自己修改
@Override
public boolean equals(Object o) {
if (this == o) return true;
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, “♦”);
Card card3 = new Card(3, “♦”);
//结果为true
System.out.println(card1.equals(card2));
}
}
重写过后此时我们card1这个引用再去调用equals方法的时候就会直接比较内容是否相等.
并且注意当我们重写equals方法的时候我们会发现此处的equals方法与我们的hashcode方法一块出现了,这两个其实是经常搭配在一起出现的,并且这块的equals方法我们会发现人家帮我们已经写好了,我们根本无需再去自己编写逻辑了
2:对象的比较还可以使用compareTo方法,要注意使用compareTo方法的前提是我们的类要继承Comparable接口并且重写compareTo方法.
同时我们也可以使用Comparator接口来完成比较:来看代码:
- 第一步先定义我们的比较方式,单独是一个类
此类我们命名为CardComparator类
public class CardComparator implements Comparator {
@Override
public int compare(Card o1, Card o2) {
if (o1 == o2) {
return 0;
}
if (o1 == null) {
return -1;
}
if (o2 == null) {
return 1;
}
return o1.rank - o2.rank;
}
}
一线互联网大厂Java核心面试题库
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
0;
}
if (o1 == null) {
return -1;
}
if (o2 == null) {
return 1;
}
return o1.rank - o2.rank;
}
}
一线互联网大厂Java核心面试题库
[外链图片转存中…(img-JXHB7WQD-1713613807815)]
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-slSXbOlG-1713613807815)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!