如何使用 Long 包装类

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在 Java 编程生态系统中,对于处理大整数值的开发者来说,理解 Long 包装类至关重要。本全面教程探讨了使用 Long 包装类的基本技术和最佳实践,深入介绍了转换、解析和性能优化策略。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/format("Format") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/type_casting -.-> lab-436664{{"如何使用 Long 包装类"}} java/wrapper_classes -.-> lab-436664{{"如何使用 Long 包装类"}} java/format -.-> lab-436664{{"如何使用 Long 包装类"}} java/math_methods -.-> lab-436664{{"如何使用 Long 包装类"}} java/object_methods -.-> lab-436664{{"如何使用 Long 包装类"}} end

Long 包装类基础

Long 包装类简介

在 Java 中,Long 包装类是 Java 语言的一个基本组成部分,它提供了一种将长整数值表示为对象的方式。它属于 java.lang 包,用作基本 long 数据类型的包装器。

关键特性

Long 类具有几个重要特性:

特性 描述
不可变 Long 对象一旦创建就是不可变的
对象表示 允许将长值视为对象
实用方法 提供类型转换和操作的方法

创建 Long 对象

创建 Long 对象有多种方式:

// 使用构造函数(已弃用)
Long longObject1 = new Long(123L);

// 推荐方法
Long longObject2 = Long.valueOf(123L);

// 自动装箱
Long longObject3 = 123L;

基本操作

类型转换

graph LR A[基本 long] -->|装箱| B[Long 对象] B -->|拆箱| A
// 基本类型转换为对象
long primitiveValue = 456L;
Long longObject = Long.valueOf(primitiveValue);

// 对象转换为基本类型
Long wrapperValue = 789L;
long primitiveBack = wrapperValue.longValue();

常量和极限值

Long 类提供了重要的常量:

// 最大值
long maxValue = Long.MAX_VALUE;  // 9,223,372,036,854,775,807

// 最小值
long minValue = Long.MIN_VALUE;  // -9,223,372,036,854,775,808

// 位数
int bits = Long.SIZE;  // 64

实际用例

  1. 处理大整数值
  2. 处理数据库主键
  3. 执行精确的数学计算
  4. 与泛型和集合兼容

最佳实践

  • 优先使用 Long.valueOf() 而不是已弃用的构造函数
  • 谨慎使用自动装箱
  • 当频繁在基本类型和包装类型之间转换时,要注意性能影响

在 LabEx,我们建议理解这些基础知识,以编写更健壮、高效的 Java 代码。

转换与解析

字符串转 Long

解析方法

// 基本解析
Long longValue1 = Long.parseLong("123456");

// 使用不同基数
Long longValue2 = Long.parseLong("1010", 2);  // 二进制转 Long

Long 转字符串

// 将 Long 转换为字符串
Long number = 789L;
String stringValue1 = number.toString();
String stringValue2 = String.valueOf(number);

转换技巧

graph TD A[Long 转换] --> B[字符串转换] A --> C[基本类型转换] A --> D[对象转换]

处理解析异常

try {
    Long result = Long.parseLong("12345");
} catch (NumberFormatException e) {
    System.out.println("无效的数字格式");
}

转换方法比较

方法 描述 返回类型
Long.parseLong() 将字符串转换为基本类型 long long
Long.valueOf() 将字符串转换为 Long 对象 Long
longObject.longValue() 将 Long 转换为基本类型 long long

高级转换技巧

基于基数的转换

// 二进制转 Long
Long binaryLong = Long.parseLong("1010", 2);  // 十进制:10

// 十六进制转 Long
Long hexLong = Long.parseLong("FF", 16);  // 十进制:255

空值处理

// 安全地转换可能为空的值
Long safeValue = (myLongObject!= null)? myLongObject : 0L;

性能考量

  • 使用 Long.parseLong() 进行基本类型转换
  • 对于对象转换,优先使用 Long.valueOf()
  • 谨慎进行频繁的装箱/拆箱

在 LabEx,我们强调理解这些转换技巧,以编写更健壮的 Java 应用程序。

性能优化技巧

内存效率

对象池化

// 高效的 Long 对象复用
public class LongPool {
    private static final Long[] CACHE = new Long[256];

    static {
        for (int i = 0; i < CACHE.length; i++) {
            CACHE[i] = Long.valueOf(i);
        }
    }

    public static Long valueOf(long value) {
        if (value >= 0 && value < CACHE.length) {
            return CACHE[(int) value];
        }
        return Long.valueOf(value);
    }
}

比较策略

graph TD A[Long 比较] A --> B[equals()] A --> C[compareTo()] A --> D[直接值比较]

性能比较表

方法 性能 推荐使用场景
== 最快 基本类型比较
equals() 中等 对象比较
compareTo() 最慢 排序操作

避免自动装箱开销

// 低效方法
public void inefficientMethod() {
    Long sum = 0L;  // 重复自动装箱
    for (int i = 0; i < 1000000; i++) {
        sum += i;  // 创建许多临时 Long 对象
    }
}

// 高效方法
public void efficientMethod() {
    long sum = 0L;  // 使用基本类型
    for (int i = 0; i < 1000000; i++) {
        sum += i;  // 无对象创建开销
    }
}

位运算

// 高效的位运算技巧
public class LongBitwiseOptimization {
    // 比乘以 2 更快
    public long doubleValue(long input) {
        return input << 1;
    }

    // 比除以 2 更快
    public long halveValue(long input) {
        return input >> 1;
    }
}

缓存与记忆化

// 简单的记忆化技巧
public class LongMemoization {
    private Map<Long, Long> cache = new HashMap<>();

    public Long expensiveCalculation(Long input) {
        return cache.computeIfAbsent(input, this::performExpensiveComputation);
    }

    private Long performExpensiveComputation(Long input) {
        // 复杂计算逻辑
        return input * input;
    }
}

基准测试注意事项

  • 尽量减少对象创建
  • 尽可能使用基本类型
  • 对于小数值范围使用 Long.valueOf()
  • 针对频繁操作实现自定义对象池化

在 LabEx,我们建议在特定用例中进行性能分析和测量,以有效优化 Long 操作。

总结

通过掌握 Java 中的 Long 包装类,开发者能够在应用程序中有效地管理大整数值、进行精确转换并优化性能。本教程涵盖的技术为在 Java 编程中自信且高效地处理长整数提供了坚实的基础。