详解Java中的Integer.reverse()方法,一步一步带你分析

本文详细探讨Java中的Integer.reverse()方法,揭示其如何实现32位二进制反转。通过源码分析,解释了从16进制到二进制的转换,以及如何通过分治算法,逐步进行相邻位、每两位、每四位的交换,最终完成整数的二进制反转过程。

详解Java中的Integer.reverse()方法,一步一步带你分析

假设有一个十进制整数,要将它的32位二进制按位反转后再以十进制数输出,要怎么做呢?

比如说:   43261597(32位二进制:00000010100101000001111010011101)
反转后:-1183307456(32位二进制:10111001011110000010100101000000)
(Java中使用补码来表示整数,其32位二进制的第一位表示符号,0为正,1为负)

可能我们第一反应就是通过Integer.toBinaryString()获取它的二进制字符串然后反转,然后再转成十进制数就行了,简单粗暴。而实际上Java提供了一个Integer.reverse()方法来直接帮助我们进行这种操作:

/**
 * Returns the value obtained by reversing the order of the bits in the
 * two's complement binary representation of the specified {@code int}
 * value.
 *
 * @param i the value to be reversed
 * @return the value obtained by reversing order of the bits in the
 *     specified {@code int} value.
 * @since 1.5
 */
public static int reverse(int i) {
   
   
    // HD, Figure 7-1
    i = (i & 0x55555555
### Java 中 `List.sort()` 方法使用详解 Java 中的 `List.sort()` 方法用于对 `List` 集合中的元素进行原地排序。该方法定义在 `java.util.List` 接口中,并接受一个 `Comparator` 作为参数,用于指定排序规则。 #### 基本用法 默认情况下,如果列表中的元素是实现了 `Comparable` 接口的类型(如 `Integer`、`String` 等),可以直接调用 `sort(null)` 进行自然排序: ```java List<String> list = new ArrayList<>(Arrays.asList("banana", "apple", "orange")); list.sort(null); System.out.println(list); // 输出: [apple, banana, orange] ``` 该方法会直接修改原列表,并不返回新的排序后的列表,因此其返回值类型为 `void` [^1]。 #### 自定义排序规则 如果希望按照自定义的规则排序,可以传入一个 `Comparator` 实例。例如,对字符串按照长度进行排序: ```java List<String> list = new ArrayList<>(Arrays.asList("banana", "apple", "orange")); list.sort((s1, s2) -> s1.length() - s2.length()); System.out.println(list); // 输出: [apple, banana, orange] ``` 该排序过程底层以 `compare(list[i - 1], list[i])` 的形式调用比较器,当返回值大于 0 时,两个元素会交换位置 [^2]。 #### 降序排序 若需降序排列,可以使用 `Comparator.reverseOrder()` 或者自定义比较器实现: ```java List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 2, 9, 1, 7)); numbers.sort(Comparator.reverseOrder()); System.out.println(numbers); // 输出: [9, 7, 5, 2, 1] ``` #### 多字段排序 对于包含复杂对象的列表,例如 `Person` 类,可以通过 `Comparator.comparing()` 和 `thenComparing()` 实现多字段排序: ```java class Person { private String name; private int age; // 构造方法、getter 和 setter } List<Person> people = new ArrayList<>(); people.add(new Person("Alice", 30)); people.add(new Person("Bob", 25)); people.add(new Person("Alice", 20)); people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge)); ``` 上述代码先按 `name` 排序,若 `name` 相同则按 `age` 排序。 #### 使用 `Collator` 实现中文排序 在 Java 中对中文字符串进行排序时,可以结合 `Collator` 类实现按拼音排序: ```java import java.text.Collator; import java.util.Locale; List<String> names = new ArrayList<>(Arrays.asList("王林", "杨宝", "李镇", "刘迪", "刘波")); names.sort((s1, s2) -> Collator.getInstance(Locale.CHINA).compare(s1, s2)); System.out.println(names); // 输出: [刘迪, 刘波, 李镇, 王林, 杨宝] ``` 该方式利用了 `Collator` 对中文进行拼音排序处理 [^3]。 --- ### 总结 Java 中的 `List.sort()` 是一个灵活且高效的排序方法,支持自然排序、自定义排序、多字段排序以及本地化排序。该方法直接修改原始列表,并不返回新列表。其底层实现基于 `Arrays.sort()`,并通过比较器控制排序逻辑。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值