大厂Java初级开发工程师!!,毕业3年还只会增删改查

}

}

public static void TreeSetTest() {

// TreeMap在底层put元素的时候会判断是否存在Comparator实例,如果存在,则每次添加元素排序比较的时候会调用compare接口。

TreeSet set = new TreeSet(new MyComparator());

Person p1 = new Person(1);

Person p2 = new Person(1);

Person p3 = new Person(5);

Person p4 = new Person(9);

Person p5 = new Person(10);

set.add(p1);

set.add(p2);

set.add(p3);

set.add(p4);

set.add(p5);

Iterator i = set.iterator();

while (i.hasNext()) {

Person p = (Person) i.next();

System.out.println(p.age);

}

}

打印结果:

1

5

9

10

四、TreeSet 方法


五、NavigableSet接口介绍


常用方法:

// 返回比当前元素小的最近的一个元素

public E lower(E e) {

return m.lowerKey(e);

}

// 返回小于等于当前元素的最近一个元素

public E floor(E e) {

return m.floorKey(e);

}

// 返回大于等于当前元素的最近一个元素

public E ceiling(E e) {

return m.ceilingKey(e);

}

// 返回大于当前元素的最近一个元素

public E higher(E e) {

return m.higherKey(e);

}

六、TreeSet 与 比较器


1、自然排序

  • (1)自然排序:TreeSet会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列。

  • (2)如果试图把一个对象添加到TreeSet时,则该对象的类必须实现 Comparable接口。

实现Comparable 的类必须实现compareTo(Object obj)方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。

  • (3)Comparable 的典型实现:

BigDecimalBigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较;

Character:按字符的 unicode值来进行比较;

Boolean:true 对应的包装类实例大于 false 对应的包装类实例;

String:按字符串中字符的 unicode 值进行比较

DateTime:后边的时间、日期比前面的时间、日期大

  • (4)向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添加的所有元素都会调用compareTo()方法进行比较。

  • (5)因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同一个类的对象。

  • (6)对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过 compareTo(Object obj)方法比较返回值。

  • (7)当需要把一个对象放入 TreeSet中,重写该对象对应的 equals()方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过

equals() 方法比较返回 true,则通过 compareTo(Object obj)方法比较应返回 0。否则,让人难以理解。

2、定制排序


(1)TreeSet的自然排序要求元素所属的类实现Comparable接口,如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。

(2)利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2

(3)要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。

(4)此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。

(5)使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。


七、案例


1、自定义类的自然排序

案例:

public class User implements Comparable{

private String name;

private int age;

public User() {

}

public User(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return “User{” +

“name='” + name + ‘’’ +

“, age=” + age +

‘}’;

}

@Override

public boolean equals(Object o) {

System.out.println(“User equals()…”);

if (this == o) return true;

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

User user = (User) o;

if (age != user.age) return false;

return name != null ? name.equals(user.name) : user.name == null;

}

@Override

public int hashCode() { //return name.hashCode() + age;

int result = name != null ? name.hashCode() : 0;

result = 31 * result + age;

return result;

}

//按照姓名从大到小排列,年龄从小到大排列

@Override

public int compareTo(Object o) {

if(o instanceof User){

User user = (User)o;

// return -this.name.compareTo(user.name);

int compare = -this.name.compareTo(user.name);

if(compare != 0){

return compare;

}else{

return Integer.compare(this.age,user.age);

}

}else{

throw new RuntimeException(“输入的类型不匹配”);

}

}

}

使用TreeSet保存:

@Test

public void test1(){

TreeSet set = new TreeSet();

set.add(new User(“Tom”,12));

set.add(new User(“Jerry”,32));

set.add(new User(“Jim”,2));

set.add(new User(“Mike”,65));

set.add(new User(“Jack”,33));

set.add(new User(“Jack”,56));

Iterator iterator = set.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}

}

注意:如果在自然比较器中并没有对年龄进行比较,当姓名一样时,就会认为这两个对象一样,不会再次存放;

如果在比较器中对两个属性都进行了比较,当有一个属性不一样就会放入 TreeSet中。

可以发现,这里对两个对象的比较并不是使用 equals() 方法,而是使用比较器来进行比较的。

2、自定义类的定制排序

定制排序:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-dYYtdp5p-1712019942648)]

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

[外链图片转存中…(img-sPReBGVh-1712019942649)]

[外链图片转存中…(img-2JNjZWNa-1712019942649)]

[外链图片转存中…(img-JDAFCHLm-1712019942650)]

[外链图片转存中…(img-lzMG6857-1712019942650)]

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值