JAVA byte 类型

  • centos 6.5
  • CDH 5.15
  • JDK 1.8
  • hbase 1.2

简介

不管什么数据,计算机最终存储的是二进制的0和1,每个二进制占1位(bit);

因为最早是老美发明的计算机,英语的所有字符使用8位二进制就能都表征了,所以老美规定了8位等于1字节(byte); 即是最早的ASCII编码;

比如字母a,占用1字节,即8个位的二进制(01),ASCII编码就是0110 0001,二进制对人类不友好,于是用数学里的进制转换,将二进制转为十进制的97,十六进制的0x61;

byte类型

JAVA中提供了专门的byte类型,用来表示占1字节的数据,也就是ASCII码里的所有数据;

8位可表征的数字范围是-128 ~ +127,超过这个范围会报错;
1个字节只能表征1个字母,2个字母需要2个字节;

public class Test
{
    public static void main(String[] args)
    {
        byte byteB1 = 127;
        byte byteB2 = 'a';  //# 只能有单引号,双引号是字符串;

        System.out.print(byteB1); //# 127
        System.out.print(byteB2); //# 97 (a的ASCII码的十进制)
        System.out.print(byteToHex(byteB2)); //# 61 (a的ASCII码的十六进制)

        //# 强制类型转换,int(32位) 转 byte(8位),高低转低位,会发生精度丢失
        byte byteB3 = (byte) 18;
        System.out.print(byteB3); //# 18
    }
    /**
        # byte 类型转为 十六进制
        @ param b : byte类型的变量或数据
    */
    public static String byteToHex(byte b){
        String hex = Integer.toHexString(b & 0xFF);
        if(hex.length() < 2){
            hex = "0" + hex;
        }
        return hex;
    }
}

编译运行

$ javac Test.java
$ java Test

byte类型有长度限制,不能表征复杂的数据;
使用byte[]类型,没有长度限制;

byte[] 类型

JAVA还提供了byte[] 类型,表征字节数组;

import java.util.Arrays;

public class Test
{
    public static void main(String[] args)
    {
        byte[] byteA = new byte[2]; //# [0, 0]
        byte[] byteA1 = new byte[] {1,2,3,4};
        byte[] byteA2 = {1,2,3,4};
        byte[] byteA3 = {'a','b','c','d'};
        byte[] byteA4 = {0x12,0x00,0x00,0x00,0x03,0x03};

        System.out.println(byteA); //# [B@7852e922  数组首个元素的内存地址
        System.out.println(Arrays.toString(byteA)); //# [0, 0]
        System.out.println(Arrays.toString(byteA1)); //# [1, 2, 3, 4]
        System.out.println(Arrays.toString(byteA2)); //# [1, 2, 3, 4]
        System.out.println(Arrays.toString(byteA3)); //# [97, 98, 99, 100]
        System.out.println(Arrays.toString(byteA4)); //# [18, 0, 0, 0, 3, 3]

        //# 将字节加入字节数组
        byte byteB1 = 127;
        byte byteB2 = 'a';

        byte[] byteA4 = new byte[2];
        byteA4[0] = byteB1;
        byteA4[1] = byteB2;
        System.out.println(Arrays.toString(byteA4)); //# [127, 97]

        byte[] byteA5 = {byteB1, byteB2};
        System.out.println(Arrays.toString(byteA5)); //# [127, 97]

    }
}

编译运行

$ javac Test.java
$ java Test

16进制字节数组,使用0x标识

import java.util.Arrays;
public class Test
{
    public static void main(String[] args)
    {
        byte[] rowKey = new byte[6];
        rowKey[0] = 0x12;
        rowKey[1] = 0x00;
        rowKey[2] = 0x00;
        rowKey[3] = 0x00;
        rowKey[4] = 0x03;
        rowKey[5] = 0x03;

        System.out.println(Arrays.toString(rowKey));
        //# [18, 0, 0, 0, 3, 3]
    }
}

编译运行

$ javac Test.java
$ java Test

字符串转byte[]

使用String类的方法getBytes;

getBytes()读取file.encoding的编码格式,然后进行转换; 所以会受到系统的影响;

import java.util.Arrays;

public class Test
{
    public static void main(String[] args)
    {
        //Original String
        String string = "hello world";

        //Convert to byte[]
        byte[] byteA = string.getBytes();

        System.out.println(Arrays.toString(byteA));
        //# [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
    }
}

编译运行

$ javac Test.java
$ java Test

Byte类

Byte 类将基本类型为 byte 的值包装在一个对象中;
一个 Byte 类的对象只包含一个类型为 byte 的字段;
通过关键字new来申请对象;

public class Test
{
    public static void main(String[] args)
    {
        byte byteB1 = 5;
        byte byteB2 = 'a';
        Byte byteBC1 = new Byte(byteB1);
        Byte byteBC2 = new Byte(byteB2);

        Byte byteBC3 = new Byte("123"); //# 必须为数字类型的String,其他类型会报错
        //# Byte byteBC4 = new Byte("a"); //# 报错

        System.out.println(byteBC1); //# 5
        System.out.println(byteBC2); //# 97
        System.out.println(byteBC3); //# 123
    }
}

编译运行

$ javac Test.java
$ java Test

常用方法

方法 返回值 功能
byteValue() byte 以一个 byte 值返回 Byte 对象
intValue() int 以一个 int 值返回此 Byte 的值
toString() String 返回表示此 byte 值的 String 对象
valueOf(String s) Byte 返回一个保持指定 String 所给出的值的 Byte 对象
decode(String nm) Byte 将String转为Byte
public class Test
{
    public static void main(String[] args)
    {
        //# create 4 Byte objects
        Byte byteBC1, byteBC2, byteBC3, byteBC4;

        //# 将数字字符串转为Byte对象
        byteBC1 = Byte.decode("100");

        //# 将普通字符串转为Byte对象; 无法直接转,会报错;
        //# byteBC4 = Byte.decode("abcd");

        //# 将十六进制字符串转为Byte对象;
        //# 十六进制字符串的标识: 0x|0X|#
        byteBC2 = Byte.decode("-#4c");

        //# 将八进制字符串转为Byte对象;八进制标识:0
        byteBC3 = Byte.decode("0127");

        System.out.println(byteBC1); //# 100
        System.out.println(byteBC2); //# -76
        System.out.println(byteBC3); //# 87
    }
}

编译运行

$ javac Test.java
$ java Test

HBase Bytes类

HBase提供了一个工具类: Bytes, 提供了更强大和灵活的功能;

常用方法

方法 返回值 功能
toBytes() byte[] 将字符串转为byte[],编码使用utf8
add() byte[] 合并byte[]
toString() string 将byte[]转为字符串
import java.util.Arrays;
import org.apache.hadoop.hbase.util.Bytes;
public class Test
{
    public static void main(String[] args)
    {
        //Convert to byte[]
        byte[] byteBC = Bytes.toBytes("hello");

        System.out.println(Arrays.toString(byteBC));
        //# [104, 101, 108, 108, 111]

        System.out.println(Bytes.toString(byteBC));
        //# hello
    }
}

编译运行

$ javac -cp $(hbase classpath) Test.java
$ java -cp $(hbase classpath) Test

参考
org.apache.hadoop.hbase.util.Bytes
Java.lang.Byte Class
bit,byte,位,字节,汉字,字符

你可能感兴趣的:(JAVA)