首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 记一次自定义比较器中compareTo方法使用long强转int作为比较结果产生的bug

当然,时间久了就好了 ---- 这次要找的bug是排序问题,前端请求接口,按某个字段排序后,返回的结果总是很怪异,数据最多的那个总是与排序要求相反。 比如升序排序,他会跑到最后一页的最后一条 ?...,实现这个排序类的类可以根据类中的sortType来进行排序,orderBy进行升序与降序的控制。...validCount 且该实体类的validCount字段为long类型,可知排序肯定在long类型比较的代码块中进行。...断点debug到long类型进行比较的部分 发现了该bug产生的原因。...主要原因是当两个值进行相减后 比如2822920460-1 结果依旧大于Integer.MAX_VALUE ,在进行int强转后,返回的结果不准确。

1.3K30

java集合【2】——— Collection接口详解

下面看Collection接口以及iterable接口的方法对比: 从上面的图我们可以看出,iterable接口功能主要是 获取迭代器iterator foreach()遍历 获取可切分迭代器Spliterator...); //截取某一段数据 default Spliterator spliterator(){} //获取可切分迭代器 上面的方法都比较简单,值得一提的是里面出现了ListIterator,这是一个功能更加强大的迭代器...add、remove和element三个方法 PriorityQueue:按照默认或者自己定义的顺序来排序元素,底层使用堆(完全二叉树)实现,使用动态数组实现, BlockingQueue:在java.util.concurrent...Collection接口继承了Iterable接口,而Map则不是,Map是在各自的实现类中才用内部类的方式实现Iterator接口,例如HashMap,key或者value或者它们的组合entry都可以使用迭代器进行遍历...super T>> void sort(List list),元素需要实现Comparable接口,按照比较器进行排序。

1.1K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java集合【6】-- Collection源码解析

    ()遍历 获取可切分迭代器Spliterator Collection接口在此基础上进行拓展,源码接口如下: boolean add(Object o) //添加元素 boolean remove...); //截取某一段数据 default Spliterator spliterator(){} //获取可切分迭代器 上面的方法都比较简单,值得一提的是里面出现了ListIterator,这是一个功能更加强大的迭代器...的子接口,仅实现了add、remove和element三个方法 PriorityQueue:按照默认或者自己定义的顺序来排序元素,底层使用堆(完全二叉树)实现,使用动态数组实现, BlockingQueue...Collection接口继承了Iterable接口,而Map则不是,Map是在各自的实现类中才用内部类的方式实现Iterator接口,例如HashMap,key或者value或者它们的组合entry都可以使用迭代器进行遍历...super T>> void sort(List list),元素需要实现Comparable接口,按照比较器进行排序。

    52930

    【Java】一文囊括Java集合,随用随看,快速上手。

    ---- ②Collection遍历方法 迭代器遍历: 迭代器在Java中的类是Irerator,迭代器是集合专用的遍历方式。...就是在迭代器或增强for遍历集合时,避免使用集合的方法进行新增/修改。...int类型整数 hashCode() 定义在Object类中,所有类都可以调用,默认使用地址值进行计算。...哈希值:(复习) 根据hashCode()方法计算出来的int类型整数 **hashCode()**定义在Object类中,所有类都可以调用,默认使用地址值进行计算。...由键决定特性:不重复,无索引,可排序。 注意:默认按照键从小到大的顺序进行排序,也可以自己规定键的排序规则。 ①实现Comparable接口,指定排序规则。

    20340

    JAVA常见容器_JAVA比较容器

    JAVA中的容器种类很多,且各有特点。为此特意进行学习研究,写下此文,作为一点总结。若有错误,欢迎拍砖。...它只有一个方法: Iterator iterator() //即返回一个迭代器 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。...(2) 使用next()获得序列中的下一个元素。   (3) 使用hasNext()检查序列中是否还有元素。   (4) 使用remove()将迭代器新返回的元素删除。...从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。 List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。...,这样在大数据量时,可能会影响效率 – 写在后面:List接口的排序可以通过Collections.sort()来进行定制排序。

    69420

    【深入浅出C#】章节 5: 高级面向对象编程:泛型编程和集合类型

    使用 Sort() 方法:集合类型(如列表)提供了 Sort() 方法,可以直接对集合进行原地排序。默认情况下,Sort() 方法使用元素的自然顺序进行排序。...可以实现 IComparer 接口或使用 Comparison 委托来定义自定义比较器,并将其传递给排序方法。...5.2 自定义比较器和排序规则 在 C# 中,可以通过自定义比较器来定义排序规则。...IComparer 接口,并在 Compare 方法中定义了自定义的排序规则,即按绝对值大小进行排序。...然后,使用 Sort 方法并传入自定义比较器的实例,对列表中的元素进行排序。 通过自定义比较器,可以灵活地定义排序规则,以满足具体的排序需求。

    40921

    Java集合总结

    image.png 1、List接口和Set接口都继承自Collection接口,Collection接口继承Iterable接口(Iterable有一个Iterator方法),即可迭代的;Collection...倍,vector默认是原来的2倍,因此,当元素数目越来越大,扩展次数多的时候,使用vector比较有优势。...TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0 自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator...这一策略在源码中的实现是通过modCount域,modCount顾名思义就是修改次数,对HashMap内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的expectedModCount...2、LinkedHashMap (1)继承自HashMap (2)能够按插入的顺序进行遍历。 (3)内部使用双向链表实现。默认按插入元素的顺序排序,也可以更换成按照访问顺序排序。

    65422

    JAVA集合:概述

    Collection 下的接口),Vector 就是 ArrayList 的线程安全版本,但不推荐使用,此外 Java 中的栈 Stack 还是继承自 Vector; Queue,队列也是有序,可重复的...和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo() 函数,才可以正常使用...3、TreeMap(可排序) TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap...相对于访问顺序,按照插入顺序进行编排被使用到的场景更多一些,所以默认是按照插入顺序进行编排。...调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。 调用 it.hasNext() 用于检测集合中是否还有元素。 调用 it.remove() 将迭代器返回的元素删除。

    66530

    -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器

    •iterator():通过迭代方法获取迭代器对象。   ...泛型 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。...super E 向上限定,E及其父类 Map Map与Collection在集合框架中属并列存在 Map存储的是键值对 Map存储元素使用put方法,Collection使用add方法 Map集合没有直接取出所有元素的方法...键是红黑树结构,可以保证键的排序和唯一性 LinkedHashMap: Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。...两种方式排序:自然排序和比较器排序 Properties集合 Properties作为Map集合的使用 Properties的特殊功能 •public Object setProperty(String

    1.2K20

    Java从入门到精通八(Java数据结构--Map集合)

    Collection(由此类的所有 collection 视图方法所返回)的 iterator 方法返回的迭代器都是快速失败 的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的 remove...该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 在线程同步问题上 注意,此实现不是同步的。...在JAVAAPI中也有说明,TreeMap是具有排序的功能的,同理也在继承实现关系上可以发现,实现了SortedMap接口,所以是一定会按照Key大小对Map中的元素进行排序的。...既然是树,tree,经常用到它的排序方法。这一点,还是和之前单列集合的文章的默认自然排序的相似。 单列集合的说明中也同样对自己定义的排序方法做了介绍。下面再说明一下。...然后追溯这个比较器接口 其实通过了解可以了解这个接口的方法 需要注意的是,如果自定义构造器的话,一般需要自己进行重写这个方法。 下面演示一下进行按照值进行排序。

    72810

    「Java面试题精华集」1w字的Java集合框架篇(2020最新版)附PDF版 !

    ...... } Iterator 对象称为迭代器(设计模式的一种),迭代器可以对集合进行遍历,但每一个集合内部的数据结构可能是不尽相同的,所以每一个集合存和取都很可能是不一样的,虽然我们可以人为地在每一个类中定义...迭代器是将这样的方法抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做就规定了整个集合体系的遍历方式都是 hasNext()和next()方法,使用者不用管怎么实现的,会用即可。...迭代器的定义为:提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。 迭代器 Iterator 有啥用?...默认是按 key 的升序排序,不过我们也可以指定排序的比较器。...另外,在单线程下,如果在遍历过程中对集合对象的内容进行了修改的话也会触发 fail-fast 机制。 “注:增强 for 循环也是借助迭代器进行遍历。

    1.3K20

    java集合【1】——— 从集合接口框架说起

    内部定义的方法 java集合最源头的接口,实现这个接口的作用主要是集合对象可以通过迭代器去遍历每一个元素。...以发挥多核时代的处理器性能,java默认在集合框架中提供了一个默认的Spliterator实现,底层也就是Stream.isParallel()实现的,我们可以看一下源码: // stream使用的就是...); //截取某一段数据 default Spliterator spliterator(){} //获取可切分迭代器 上面的方法都比较简单,值得一提的是里面出现了ListIterator,这是一个功能更加强大的迭代器...2.2.3 Queue extend Collection 队列接口,在Collection接口的接触上添加了增删改查接口定义,一般默认是先进先出,即FIFO,除了优先队列和栈,优先队列是自己定义了排序的优先顺序...的子接口,仅实现了add、remove和element三个方法 PriorityQueue:按照默认或者自己定义的顺序来排序元素,底层使用堆(完全二叉树)实现,使用动态数组实现, BlockingQueue

    75720

    java集合【1】--从集合接口框架说起

    for-each loop方式遍历 for (String item : list) { System.out.println(item); } 但是实际上,这种写法在class文件中也是会转成迭代器形式...以发挥多核时代的处理器性能,java默认在集合框架中提供了一个默认的Spliterator实现,底层也就是Stream.isParallel()实现的,我们可以看一下源码: // stream使用的就是...); //截取某一段数据 default Spliterator spliterator(){} //获取可切分迭代器 上面的方法都比较简单,值得一提的是里面出现了ListIterator,这是一个功能更加强大的迭代器...2.2.3 Queue extend Collection 队列接口,在Collection接口的接触上添加了增删改查接口定义,一般默认是先进先出,即FIFO,除了优先队列和栈,优先队列是自己定义了排序的优先顺序...add、remove和element三个方法 PriorityQueue:按照默认或者自己定义的顺序来排序元素,底层使用堆(完全二叉树)实现,使用动态数组实现, BlockingQueue:在java.util.concurrent

    52620

    Java 中文官方教程 2022 版(二十七)

    可以相互比较的元素被称为可相互比较的。尽管不同类型的元素可能是可相互比较的,但这里列出的类中没有一个允许跨类比较。...比较器 如果您想按照除自然排序之外的顺序对一些对象进行排序怎么办?或者如果您想对一些不实现Comparable接口的对象进行排序怎么办?...换句话说,调整它使得当使用compare进行比较时,只有那些在使用equals进行比较时也被视为相等的元素才被视为相等。...比较器访问器 SortedSet 接口包含一个名为 comparator 的访问器方法,返回用于对集合进行排序的 Comparator,如果集合根据其元素的 自然顺序 进行排序,则返回 null。...例如,一个国家可能会在短时间内进入和退出夏令时,或者一年内多次进入和退出夏令时,或者在某一年完全跳过夏令时。 日期时间 API 使用ISO-8601中定义的日历系统作为默认日历。

    5800

    Java集合面试题

    TreeSet :有序,唯一,红黑树(自平衡的排序二叉树)。 什么是迭代器(Iterator)? Iterator 接口,提供了很多对集合元素进行迭代的方法。...迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的 #remove(Object Obj) 方法删除,可以通过迭代器的 #remove() 方法删除。 ?...Comparable 接口,在 java.lang 包下,用于当前对象和其它对象的比较,所以它有一个 #compareTo(Object obj) 方法用来排序,该方法只有一个参数。...Comparator 接口,在 java.util 包下,用于传入的两个对象的比较,所以它有一个 #compare(Object obj1, Object obj2) 方法用来排序,该方法有两个参数。...在 Map 中使用 JDK 提供的不可变类作为一个 key,这样可以避免 hashcode 的实现和我们自定义类的 equals 方法。 应该依照接口而不是实现来编程。

    54421

    Java集合框架详解(全)

    TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序。...随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。...5)Iterator接口和ListIterator接口   Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。...以上两个接口相比较,不难发现,ListIterator增加了向前迭代的功能(Iterator只能向后迭代),ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素...♦ HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把null放进HashTable中,将会发生空指针异常。

    99420

    Java集合详解(超详细)

    (二)Iterator迭代器接口 概述 Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。...迭代器模式:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。...集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。...,就会抛出这个异常 解决: 方法一:自然排序(实现Comparable接口) 指定比较的规则,在自定义类(Person)中实现Comparable接口,并重写接口中的compareTo方法 说明:...要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。 此时,仍然只能向Treeset中添加类型相同的对象。

    92020

    Map集合和List集合总结

    2、然后使用选择排序思想进行去除重复元素。 Vector集合   Vector集合也是List接口一个实现类,底层数据结构是数组,插入和移除性能较差,线程安全,效率低。...  我们调用get方法,获取数据时,底层会调用 rangeCheck(index)方法,然后对传入的索引进行判断,在 rangeCheck(int index)方法中如果传入的索引不存在,那么会抛出异常...HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。...,按 key 排序,默认的排序方式是升序。...大概就是这样,如果你考虑一个长度比较可预测的保存元素的集合,并且很少有删除操作,大部分是进行全部迭代的操作,那么用List会比较合适。

    61820

    最全的集合干货送给大家

    请参考for 、foreach 、iterator 三种遍历方式的比较[1] 也可以使用迭代器的方式进行遍历 for(Iterator it = coll.iterator(); it.hasNext(...List 除了使用 Iterator 作为迭代器之外,还提供了一种特殊的迭代器 ListIterator,是 List 接口所独有的。...它的元素的顺序是遵从提供的比较器,或者元素的自然排序,以及对元素进行排序的 LIFO 队列(或堆栈)(后进先出)不论使用顺序如何,调用 remove() 或者 poll() 都会移除队列的头元素。...使用 Comparable 对元素进行自然排序或者使用 Comparator 在创建时对元素提供定制的排序规则。set 的迭代器将按升序元素顺序遍历集合。...这些元素使用他们的自然排序或者在创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。

    63610

    Java面试手册:集合框架

    从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。...LinkedHashSet: 具有可预知迭代顺序的Set接口的哈希表和链接列表实现。 TreeSet: 该类实现了Set接口,可以实现排序等功能。...LinkedHashMap:继承于HashMap,使用元素的自然顺序对元素进行排序. IdentityHashMap:继承AbstractMap类,比较文档时使用引用相等。...11.三种遍历集合的方法: 第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。...然而,这是通过比较器来精确定义按照什么样的排序顺序,这个接口可以让我们以不同的方式来排序一个集合。

    1K30
    领券