创建Byte对象 valueOf
在Java中,Byte类提供了几种静态方法来创建Byte对象。
decode()方法 将字符串解码为Byte值
将String解码为Byte。
✍方法声明
public static Byte decode(String nm) throws NumberFormatException
- 📥入参:nm为要解码的String。
- 🪐返回值:保存由nm表示的byte值的Byte对象。
- 🐛抛出异常NumberFormatException:如果String不包含一个可解析的byte。
其中入参的字符串支持十进制、十六进制和八进制数:
对(可选)负号和/或基数说明符(“0x”、“0X”、“#”或前导零)后面的字符序列进行解析就如同使用带指定基数(10、16或8)的Byte.parseByte方法一样。该字符序列必须表示一个正值,否则将抛出NumberFormatException。如果指定String的第一个字符是负号,则结果将被求反。该String中不允许出现空白字符。
public static void main(String[] args) {
// 十进制
Byte bt1 = Byte.decode("23");
Byte bt2 = Byte.decode("-23");
// 八进制
Byte bt3 = Byte.decode("023");
// 十六进制三种写法
Byte bt4 = Byte.decode("0X23");
Byte bt5 = Byte.decode("0x23");
Byte bt6 = Byte.decode("#23");
System.out.println(bt1);
System.out.println(bt2);
System.out.println(bt3);
System.out.println(bt4);
System.out.println(bt5);
System.out.println(bt6);
}
-23
19
35
35
35
valueOf()方法 创建Byte对象
返回表示指定byte值的一个Byte实例。如果不需要新的Byte实例,则通常应优先使用此方法,而不是构造方法Byte(byte),因为该方法有可能通过缓存经常请求的值来显著提高空间和时间性能。
✍方法声明
public static Byte valueOf(byte b)
- 📥入参:b为一个byte值。
- 🪐返回值:表示b的Byte实例。
下面代码创建Byte对象,并通过valueOf()方法获取byte的Byte实例。
public static void main(String[] args) {
byte b = 12;
Byte value = Byte.valueOf(b);
System.out.println(value);
}
✍方法声明
返回一个保持指定String所给出的值的Byte对象。参数被解释为表示一个有符号的十进制的byte,正如将该参数指定给parseByte(java.lang.String)方法一样。结果是一个表示该string所指定的byte值的Byte对象。换句话说,该方法返回一个等于以下代码的值的Byte对象:new Byte(Byte.parseByte(s)).
public static Byte valueOf(String s) throws NumberFormatException
- 📥入参:s为要解析的字符串。
- 🪐返回值:保存string参数所表示的值的Byte对象。
- 🐛抛出异常NumberFormatException:如果该String不包含一个可解析的byte。
public static void main(String[] args) {
Byte bt1 = Byte.valueOf("123");
Byte bt2 = Byte.valueOf("-23");
Byte bt3 = Byte.valueOf("+56");
System.out.println(bt1);
System.out.println(bt2);
System.out.println(bt3);
}
-23
56
⚠️需要注意下面几种情况会出现异常:
public static void main(String[] args) {
Byte bt1 = Byte.valueOf("1A");//java.lang.NumberFormatException: For input string: "1A"
Byte bt2 = Byte.valueOf("Java");//java.lang.NumberFormatException: For input string: "Java"
Byte bt3 = Byte.valueOf("");//java.lang.NumberFormatException: For input string: ""
}
✍方法声明
返回从指定的String中提取的值的Byte对象,并通过第二个参数指定基数。
public static Long valueOf(String s,int radix) throws NumberFormatException;
- 📥入参:
- S:要解析的字符串。
- radix:解释s时使用的基数。
- 🪐返回值:保持由指定基数中的字符串参数表示的值的Long对象。
- 🐛抛出异常NumberFormatException:如果字符串不能解析为一个整数。
该值是在用第二个参数所给定的基数对指定字符串进行解析时提取的。第一个参数被解释为用第二个参数所指定的基数表示一个有符号的byte,正如将该参数指定给parseByte(java.lang.String,int)
方法一样。结果是一个表示该string所指定的byte值的Byte对象。换句话说,该方法返回一个等于以下代码的值的Byte对象:new Byte(Byte.parseByte(s,radix).
public static void main(String[] args) {
// 二进制
Byte bt1 = Byte.valueOf("110", 2);
// 八进制
Byte bt2 = Byte.valueOf("22", 8);
// 十六进制
Byte bt3 = Byte.valueOf("1A", 16);
Byte bt4 = Byte.valueOf("-2F", 16);
System.out.println(bt1);
System.out.println(bt2);
System.out.println(bt3);
System.out.println(bt4);
}
18
26
-47
💾ByteCache
在其他数据类型包装类中,大都存在一个内部的 XXCache 帮助高效创建对象。
ByteCache是Byte类内部的一个机制,它缓存了-128到127之间的Byte对象实例,这个范围覆盖了byte类型的有效值域。
当通过Byte.valueOf(byte b)方法创建一个新的Byte对象时,如果传入的byte值在-128到127之间,实际上不会创建一个新的对象,而是直接从ByteCache中返回一个已有的实例。这意味着,如果你多次使用相同的byte值创建Byte对象,你将得到指向相同对象的引用。
public static void main(String[] args) {
byte b = 12;
Byte bt1 = Byte.valueOf(b);
Byte bt2 = Byte.valueOf("12");
System.out.println(bt1 == bt2);
}
ByteCache的存在可以减少内存的使用,因为相同的Byte对象会被重复利用,而不是每次都创建新的对象。这也可以提高性能,因为从缓存中获取对象比在堆上创建新对象要快得多。
📝总结
Byte类提供了几种静态方法来创建Byte对象,这些方法允许从原始byte类型或字符串表示创建Byte对象。
valueOf(byte b)方法用于从原始byte类型创建Byte对象,而valueOf(String s)和valueOf(String s, int radix)方法用于从字符串创建Byte对象,后者允许指定字符串的基数。
在使用这些方法时,应注意字符串的有效性,以及是否在byte类型的范围内,以避免NumberFormatException的抛出。
这些方法为处理byte类型的数据提供了便利,使得在Java程序中操作字节数据更加高效和直观。