ZetCode

Java Byte 类

最后修改时间:2025 年 4 月 13 日

java.lang.Byte 类是原始类型 byte 的包装类。它提供了处理 byte 值的实用方法,包括转换、比较和解析。作为 Java 包装类系统的一部分,Byte 允许 byte 原始类型在面向对象的上下文中使用,例如集合和泛型类。

由于 Bytefinal不可变的,因此创建后其值无法更改。它扩展了 Number 类,继承了数值能力,并实现了 Comparable 接口,从而可以在 Java 集合和排序机制中比较 byte 值。

Byte 类方法

Byte 类提供了几个用于 byte 操作的静态和实例方法。一些关键方法包括

通过集成这些方法,Java 确保了 byte 原始类型、字符串表示形式和面向对象结构之间的无缝转换。 Byte 类通常用于需要类型安全、数值比较和数据结构中存储的场景。

创建 Byte 对象

Byte 对象可以使用静态工厂方法创建。 valueOf 可能会缓存常用值以获得更好的性能。

Main.java
void main() {

    Byte byte1 = Byte.valueOf((byte) 100);
    Byte byte2 = Byte.valueOf("100");

    // Using autoboxing
    Byte byte3 = 100;

    System.out.println("byte1: " + byte1);
    System.out.println("byte2: " + byte2);
    System.out.println("byte3: " + byte3);

    // Comparing objects
    System.out.println("byte1 equals byte2: " + (byte1.equals(byte2)));
    System.out.println("byte2 equals byte3: " + (byte2.equals(byte3)));
}

此示例演示如何创建 Byte 对象。请注意,由于缓存,使用 valueOf 时,小的 byte 值(介于 -128 和 127 之间)可能引用同一个对象。

解析 Byte 值

Byte 类提供了解析 byte 值字符串表示形式的方法。 parseByte 方法将字符串转换为原始 byte,而 valueOf 返回一个 Byte 对象。对于无效输入,这两种方法都可以抛出 NumberFormatException

Main.java
void main() {

    // Parsing decimal strings
    byte b1 = Byte.parseByte("100");
    Byte b2 = Byte.valueOf("100");
    
    // Parsing hexadecimal strings
    byte b3 = Byte.parseByte("A", 16);
    Byte b4 = Byte.valueOf("7F", 16);
    
    System.out.println("b1: " + b1);
    System.out.println("b2: " + b2);
    System.out.println("b3: " + b3); // 10 in decimal
    System.out.println("b4: " + b4); // 127 in decimal
    
    try {
        // This will throw NumberFormatException
        byte b5 = Byte.parseByte("200");
    } catch (NumberFormatException e) {
        System.out.println("Error: " + e.getMessage());
    }
}

此示例演示如何从字符串解析 byte 值。 radix 参数允许解析十六进制(base 16)值。请注意,“200”无效,因为它超过了 Byte.MAX_VALUE (127),导致 NumberFormatException

比较 Byte 值

可以使用实例方法或静态实用方法比较 Byte 值。 compareTo 方法比较两个 Byte 对象,而 compare 比较原始 byte。两者都返回负数、零或正数,指示排序。

Main.java
void main() {

    Byte byte1 = 50;
    Byte byte2 = 100;
    byte byte3 = 50;
    
    // Instance comparison
    System.out.println("byte1.compareTo(byte2): " + byte1.compareTo(byte2));
    System.out.println("byte1.compareTo(Byte.valueOf(byte3)): " + 
                        byte1.compareTo(Byte.valueOf(byte3)));
    
    // Static comparison
    System.out.println("Byte.compare(byte1, byte2): " + 
                        Byte.compare(byte1, byte2));
    System.out.println("Byte.compare(byte3, byte1.byteValue()): " + 
                        Byte.compare(byte3, byte1.byteValue()));
    
    // Equality comparison
    System.out.println("byte1.equals(byte2): " + byte1.equals(byte2));
    System.out.println("byte1.equals(Byte.valueOf(byte3)): " + 
                        byte1.equals(Byte.valueOf(byte3)));
}

此示例演示了比较 byte 值的不同方法。 compareTo 和 compare 方法对于小于、等于或大于比较返回 -1、0 或 1。 equals 方法检查对象之间是否完全相等。

转换 Byte 值

Byte 类扩展了 Number,提供了将 byte 值转换为其他原始数值类型的方法。这些包括 intValuedoubleValue 等。 toString 方法将 byte 转换为字符串表示形式。

Main.java
void main() {

    Byte byteValue = 100;
    
    // Converting to other primitive types
    System.out.println("intValue: " + byteValue.intValue());
    System.out.println("doubleValue: " + byteValue.doubleValue());
    System.out.println("floatValue: " + byteValue.floatValue());
    System.out.println("longValue: " + byteValue.longValue());
    System.out.println("shortValue: " + byteValue.shortValue());
    
    // String conversions
    System.out.println("toString: " + byteValue.toString());
    System.out.println("static toString: " + Byte.toString((byte) 100));
    System.out.println("toHexString: " + 
                        Integer.toHexString(byteValue & 0xFF));
}

此示例显示了 Byte 类中可用的各种转换方法。虽然 Byte 提供了基本的字符串转换,但对于十六进制表示,我们使用 Integer.toHexString 以及正确的 byte 掩码来避免符号扩展问题。

Byte 常量和大小

Byte 类定义了有用的常量,用于表示 byte 可以表示的最小值和最大值。它还提供了 SIZE 常量,表示用于存储 byte 值的位数(在 Java 中始终为 8 位)。

Main.java
void main() {

    System.out.println("Byte.MIN_VALUE: " + Byte.MIN_VALUE);
    System.out.println("Byte.MAX_VALUE: " + Byte.MAX_VALUE);
    System.out.println("Byte.SIZE: " + Byte.SIZE + " bits");
    System.out.println("Byte.BYTES: " + Byte.BYTES + " bytes");
    
    // Demonstrating byte range
    byte minByte = Byte.MIN_VALUE;
    byte maxByte = Byte.MAX_VALUE;
    
    System.out.println("minByte - 1: " + (minByte - 1));
    System.out.println("maxByte + 1: " + (maxByte + 1));
    
    // Binary representation
    System.out.println("MIN_VALUE binary: " + 
                        Integer.toBinaryString(minByte & 0xFF));
    System.out.println("MAX_VALUE binary: " + 
                        Integer.toBinaryString(maxByte & 0xFF));
}

此示例演示了 Byte 类常量和 byte 大小信息。 请注意,对 byte 进行算术运算会将它们提升为 int,因此溢出不会以与纯 byte 运算相同的方式发生。 二进制表示显示了正确屏蔽后的实际 8 位模式。

Byte 哈希码和相等性

Byte 类覆盖了 Object 中的 hashCodeequals。 hashCode 返回 byte 值本身,而 equals 比较包装的 byte 值。 这确保了在集合中使用 Byte 对象时的正确行为。

Main.java
void main() {

    Byte byte1 = 100;
    Byte byte2 = 100;
    Byte byte3 = 50;
    
    // Hash code examples
    System.out.println("byte1.hashCode(): " + byte1.hashCode());
    System.out.println("byte2.hashCode(): " + byte2.hashCode());
    System.out.println("byte3.hashCode(): " + byte3.hashCode());
    
    // Equality examples
    System.out.println("byte1.equals(byte2): " + byte1.equals(byte2));
    System.out.println("byte1.equals(byte3): " + byte1.equals(byte3));
    
    // Using in HashSet
    HashSet<Byte> byteSet = new HashSet<>();
    byteSet.add(byte1);
    byteSet.add(byte2);
    byteSet.add(byte3);
    
    System.out.println("Set size: " + byteSet.size());
    System.out.println("Set contains 100: " + byteSet.contains((byte) 100));
}

此示例演示了 Byte 对象的 hashCodeequals 行为。 相同的 byte 值产生相同的哈希码并且被认为是相等的。 由于这些实现,HashSet 示例显示了正确的集合行为。

Byte 解码和编码

Byte 类可以与字符编码操作结合使用。 虽然 Java 的 String 在内部使用 UTF-16,但 byte 通常用于 ASCII 或其他单字节字符编码。 此示例显示了基本的 byte/char 转换。

Main.java
void main() {

    // ASCII character to byte
    byte letterA = (byte) 'A';
    Byte letterB = (byte) 'B';
    
    System.out.println("letterA: " + letterA);
    System.out.println("letterB: " + letterB);
    
    // Byte to character
    char aChar = (char) letterA;
    char bChar = (char) letterB.byteValue();
    
    System.out.println("aChar: " + aChar);
    System.out.println("bChar: " + bChar);
    
    // String to bytes and back
    String text = "Hello";
    byte[] bytes = text.getBytes();
    
    System.out.print("Bytes: ");
    for (byte b : bytes) {
        System.out.print(b + " ");
    }
    System.out.println();
    
    String reconstructed = new String(bytes);
    System.out.println("Reconstructed: " + reconstructed);
}

此示例显示了 byte 和字符之间的基本转换。 请注意,这种简单的方法适用于 ASCII 字符 (0-127),但可能无法正确处理扩展字符集。 要获得完整的字符编码支持,请将适当的 Charset 对象与 String.getBytes 和 String 构造函数一起使用。

来源

Java Byte 类文档

在本文中,我们通过实际示例介绍了 Java Byte 类的所有主要方面。 当 byte 值需要被视为对象或者需要 byte 操作的实用方法时,Byte 包装类是必不可少的。

作者

我叫 Jan Bodnar,是一位拥有多年编程经验的专注程序员。 我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程