文章目录
1、怎么将 byte转换为String?
可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确编码,否则会使用品台默认编码,这个编码可能跟原来的编码相同,也可能不同。
2、Java 中怎样将 bytes 转换为 long 类型?
bytes[] 到数字类型的转换是个经常用到的代码,解决方式也不止一种。
Java代码实现
如果不想借助任何已经有的类,完全可以自己实现这段代码,如下:
/**
* 将字节数组转为 long
* 如果 input 为 null,或 offset 指定的剩余数组长度不足 8 字节则抛出异常
* @param input
* @param offset 起始偏移量
* @param littleEndian 输入数组是否小端模式
* @return
*/
private static long longFrom8Bytes(byte[] input, int offset, Boolean littleEndian){
long value = 0;
// 循环读取每个字节通过位移运算完成 long 的 8 个字节拼装
for (int count = 0; count < 8; count++) {
int shift = (littleEndian?count:(7-count)) << 3;
value |= ((long)0xff<< shift) &((long)input[offset+count]<<shift);
}
return value;
}
借助 java.nio.ByteBUffer实现
java.nio.ByteBuffer 本身就有getLong.getInt,getFloat… …方法,只要将 byte[] 转换ByteBuffer就可以实现所有primitive类型的数据读取。
/**
* 利用 {@link java.nio.ByteBuffer}实现byte[]转long
* @param input
* @param offset
* @param littleEndian 输入数组是否小端模式
* @return
*/
public static long bytesToLong(byte[] input, int offset, Boolean littleEndian){
// byte[] 封装为 ByteBuffer
ByteBuffer buffer = ByteBuffer.wrap(input,offset,8);
if (littleEndian){
// ByteBuffer.order(ByteOrder) 方法指定字节序,即大小端模式(BIG_ENDIAN/LITTLE_ENDIAN)
// ByteBuffer 默认为大端(BIG_ENDIAN)模式
buffer.order(ByteOrder.LITTLE_ENDIAN);
}
return buffer.getLong();
}
借助 java.io.DataInputStream实现
java.io.DataInputStream 同样提供了 readLong,readLong,readLong 方法,只要将byte[] 转换为 DataInputStream就可以实现所有primitive 类型的数据读取。
3、我们能将 int 强制转为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?
是的,我们可以做强制转换,但是 java 中 int 是32位的,而 byte 是 8位,所以如果强制转化是,int 类型的高24位将会被丢弃,byte类型的范围是从 -128到127。
4、存在两个类, B 继承 A, C继承B,我们能将 B转换为C么,如果 C = ©B;
这属于强制类型转换,如果被转换的B实例不是C类型,会有异常,比如你的 ABC 分别对应动物,猫,黑猫。
向上转型就是比如
C c = new C();
B b = c;
你把C 转型为B, 黑猫是猫吗?是啊,所以这是ok的。但是反过来
B b = new B();
C c = (C) b;
这就不ok 了,只知道这个b 是一只猫,它不一定是黑猫。但如果这个b 已经确定是一只黑猫了,那就可以转型了
B b = new C();
C c = (C) b;
这里的b本来就是黑猫。
5、哪个类包含 clone 方法? 是 Cloneable 还是 Object?
java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 C 或 C++ 或其他本地语言实现的。