javaint64的简单介绍
今天给各位分享javaint64的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、几种Java序列化 对比
- 2、C++里面的__int64和Java里面的long型数值大小一样吗
- 3、Java int32和int64分别能存储多少个整数位?
- 4、C++中什么时候用__int64定义变量?和int型有什么区别?
- 5、java int 转 Long
几种Java序列化 对比
在java中socket传输数据时,数据类型往往比较难选择。可能要考虑带宽、跨语言、版本的兼容等问题。比较常见的做法有两种:一是把对象包装成JSON字符串传输,二是采用java对象的序列化和反序列化。随着Google工具protoBuf的开源,protobuf也是个不错的选择。对JSON,Object Serialize,ProtoBuf 做个对比。
定义一个待传输的对象UserVo:
Java代码
public class User{
private String name;
private int age;
private long phone;
private ListUser friends;
}
初始化User的实例src:
Java代码
User user1 = new UserVo();
user1 .setName("user1 ");
user1 .setAge(30);
user1 .setPhone(13789126278L);
UserVo f1 = new UserVo();
f1.setName("tmac");
f1.setAge(32);
f1.setPhone(123L);
User user2 = new User();
user2 .setName("user2 ");
user2 .setAge(29);
user2 .setPhone(123L);
ListUser friends = new ArrayListUser();
friends.add(user1 );
friends.add(user2 );
user1 .setFriends(friends);
JSON格式
采用Google的gson-2.2.2.jar 进行转义
Java代码
Gson gson = new Gson();
String json = gson.toJson(src);
得到的字符串:
Js代码
{"name":"user1 ","age":30,"phone":123,"friends":[{"name":"user1 ","age":32,"phone":123},{"name":"user2 ","age":29,"phone":123}]}
字节数为153
Json的优点:明文结构一目了然,可以跨语言,属性的增加减少对解析端影响较小。缺点:字节数过多,依赖于不同的第三方类库。
Object Serialize
UserVo实现Serializalbe接口,提供唯一的版本号:
Java代码
public class User implements Serializable{
private static final long serialVersionUID = -5726374138698742258L;
private String name;
private int age;
private long phone;
private ListUser friends;
序列化方法:
Java代码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(src);
os.flush();
os.close();
byte[] b = bos.toByteArray();
bos.close();
字节数是238
反序列化:
Java代码
ObjectInputStream ois = new ObjectInputStream(fis);
vo = (UserVo) ois.readObject();
ois.close();
fis.close();
Object Serializalbe 优点:java原生支持,不需要提供第三方的类库,使用比较简单。缺点:无法跨语言,字节数占用比较大,某些情况下对于对象属性的变化比较敏感。
对象在进行序列化和反序列化的时候,必须实现Serializable接口,但并不强制声明唯一的serialVersionUID
是否声明serialVersionUID对于对象序列化的向上向下的兼容性有很大的影响。我们来做个测试:
思路一
把User中的serialVersionUID去掉,序列化保存。反序列化的时候,增加或减少个字段,看是否成功。
Java代码
public class User implements Serializable{
private String name;
private int age;
private long phone;
private ListUserVo friends;
保存到文件中:
Java代码
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(bos);
os.writeObject(src);
os.flush();
os.close();
byte[] b = bos.toByteArray();
bos.close();
FileOutputStream fos = new FileOutputStream(dataFile);
fos.write(b);
fos.close();
增加或者减少字段后,从文件中读出来,反序列化:
Java代码
FileInputStream fis = new FileInputStream(dataFile);
ObjectInputStream ois = new ObjectInputStream(fis);
vo = (User) ois.readObject();
ois.close();
fis.close();
结果:抛出异常信息
Java代码
Exception in thread "main" java.io.InvalidClassException: serialize.obj.UserVo; local class incompatible: stream classdesc serialVersionUID = 3305402508581390189, local class serialVersionUID = 7174371419787432394
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:560)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at serialize.obj.ObjectSerialize.read(ObjectSerialize.java:74)
at serialize.obj.ObjectSerialize.main(ObjectSerialize.java:27)
思路二
eclipse指定生成一个serialVersionUID,序列化保存,修改字段后反序列化
略去代码
结果:反序列化成功
结论
如果没有明确指定serialVersionUID,序列化的时候会根据字段和特定的算法生成一个serialVersionUID,当属性有变化时这个id发生了变化,所以反序列化的时候就会失败。抛出“本地classd的唯一id和流中class的唯一id不匹配”。
jdk文档关于serialVersionUID的描述:
写道
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修饰符显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于直接声明类 -- serialVersionUID 字段作为继承成员没有用处。数组类不能声明一个明确的 serialVersionUID,因此它们总是具有默认的计算值,但是数组类没有匹配 serialVersionUID 值的要求。
Google ProtoBuf
protocol buffers 是google内部得一种传输协议,目前项目已经开源()。它定义了一种紧凑得可扩展得二进制协议格式,适合网络传输,并且针对多个语言有不同得版本可供选择。
以protobuf-2.5.0rc1为例,准备工作:
下载源码,解压,编译,安装
Shell代码
tar zxvf protobuf-2.5.0rc1.tar.gz
./configure
./make
./make install
测试:
Shell代码
MacBook-Air:~ ming$ protoc --version
libprotoc 2.5.0
安装成功!进入源码得java目录,用mvn工具编译生成所需得jar包,protobuf-java-2.5.0rc1.jar
1、编写.proto文件,命名UserVo.proto
Text代码
package serialize;
option java_package = "serialize";
option java_outer_classname="UserVoProtos";
message User{
optional string name = 1;
optional int32 age = 2;
optional int64 phone = 3;
repeated serialize.UserVo friends = 4;
}
2、在命令行利用protoc 工具生成builder类
Shell代码
protoc -IPATH=.proto文件所在得目录 --java_out=java文件的输出路径 .proto的名称
得到UserProtos类
3、编写序列化代码
Java代码
UserVoProtos.User.Builder builder = UserVoProtos.User.newBuilder();
builder.setName("Yaoming");
builder.setAge(30);
builder.setPhone(13789878978L);
UserVoProtos.UserVo.Builder builder1 = UserVoProtos.UserVo.newBuilder();
builder1.setName("tmac");
builder1.setAge(32);
builder1.setPhone(138999898989L);
UserVoProtos.UserVo.Builder builder2 = UserVoProtos.UserVo.newBuilder();
builder2.setName("liuwei");
builder2.setAge(29);
builder2.setPhone(138999899989L);
builder.addFriends(builder1);
builder.addFriends(builder2);
UserVoProtos.UserVo vo = builder.build();
byte[] v = vo.toByteArray();
字节数53
4、反序列化
Java代码
UserVoProtos.UserVo uvo = UserVoProtos.UserVo.parseFrom(dstb);
System.out.println(uvo.getFriends(0).getName());
结果:tmac,反序列化成功
google protobuf 优点:字节数很小,适合网络传输节省io,跨语言 。缺点:需要依赖于工具生成代码。
工作机制
proto文件是对数据的一个描述,包括字段名称,类型,字节中的位置。protoc工具读取proto文件生成对应builder代码的类库。protoc xxxxx --java_out=xxxxxx 生成java类库。builder类根据自己的算法把数据序列化成字节流,或者把字节流根据反射的原理反序列化成对象。官方的示例:。
proto文件中的字段类型和java中的对应关系:
详见:
.proto Type java Type c++ Type
double double double
float float float
int32 int int32
int64 long int64
uint32 int uint32
unint64 long uint64
sint32 int int32
sint64 long int64
fixed32 int uint32
fixed64 long uint64
sfixed32 int int32
sfixed64 long int64
bool boolean bool
string String string
bytes byte string
字段属性的描述:
写道
required: a well-formed message must have exactly one of this field.
optional: a well-formed message can have zero or one of this field (but not more than one).
repeated: this field can be repeated any number of times (including zero) in a well-formed message. The order of the repeated values will be preserved.
protobuf 在序列化和反序列化的时候,是依赖于.proto文件生成的builder类完成,字段的变化如果不表现在.proto文件中就不会影响反序列化,比较适合字段变化的情况。做个测试:
把UserVo序列化到文件中:
Java代码
UserProtos.User vo = builder.build();
byte[] v = vo.toByteArray();
FileOutputStream fos = new FileOutputStream(dataFile);
fos.write(vo.toByteArray());
fos.close();
为User增加字段,对应的.proto文件:
Text代码
package serialize;
option java_package = "serialize";
option java_outer_classname="UserVoProtos";
message User{
optional string name = 1;
optional int32 age = 2;
optional int64 phone = 3;
repeated serialize.UserVo friends = 4;
optional string address = 5;
}
从文件中反序列化回来:
Java代码
FileInputStream fis = new FileInputStream(dataFile);
byte[] dstb = new byte[fis.available()];
for(int i=0;idstb.length;i++){
dstb[i] = (byte)fis.read();
}
fis.close();
UserProtos.User uvo = UserProtos.User.parseFrom(dstb);
System.out.println(uvo.getFriends(0).getName());
成功得到结果。
三种方式对比传输同样的数据,google protobuf只有53个字节是最少的。结论:
方式 优点 缺点
JSON 跨语言、格式清晰一目了然
字节数比较大,需要第三方类库
Object Serialize java原生方法不依赖外部类库 字节数比较大,不能跨语言
Google protobuf 跨语言、字节数比较少
编写.proto配置用protoc工具生成对应的代码
C++里面的__int64和Java里面的long型数值大小一样吗
__int64是64位有符号int型,相当于Java中的long,两者同为8字节有符号整型。
Java int32和int64分别能存储多少个整数位?
只有c#有int32和int64
java里没有int32和int64,只有int
java里int对应的是C#里的int32,
java里long对应的是C#里的int64或者long
java里带符号的int取值范围为-2147483648 到2147483648
无符号的取值范围为0-2*2147483648
C++中什么时候用__int64定义变量?和int型有什么区别?
int 和 long 型为 32 位整型,其范围为 -2G(-21亿多)至 2G(+21亿多),若需要计算的整数超出此范围,则需要使用 __int64 类型,此类型为 64位整数,其范围非常大,一般不会超出范围。
java int 转 Long
int i=3;
Long l;
long l2;
//1、把int基本类型数据转换为包装类Long类型对象,
l=new Long((long)i);
//2、把int基本类型数据 转换为long基本类型数据,
l2=(long)i;
扩展资料:
long 类型的常见变量
可如下例所示声明并初始化 long 类型的变量:
复制代码
SampleMethod(5); // Calling the method with the int parameter
SampleMethod(5L); // Calling the method with the long parameter可在同一个表达式中同时使用 long 类型和其他数值整型,这时表达式的计算结果为 long(在关系表达式或布尔表达式中为 bool)类型。例如,下列表达式计算为 long:
复制代码
898L + 88注意
也可用小写字母“l”作后缀。但是,因为字母“l”容易与数字“1”混淆,会生成编译器警告。为清楚起见,请使用“L”。
有关兼用浮点型和整型的算术表达式的信息,请参见 float 和 double。
转换
存在从 long 到 float、double 或 decimal 的预定义隐式转换。其他情况下必须使用显式转换。例如,不使用显式类型转换时,下列语句将产生编译错误:
复制代码
int x = 8L; // Error: no implicit conversion from long to int
int x = (int)8L; // OK: explicit conversion to int存在从 sbyte、byte、short、ushort、int、uint 或 char 到 long 的预定义隐式转换。
还请注意,不存在从浮点型到 long 类型的隐式转换。例如,除非使用显式强制转换,否则以下语句将生成一个编译器错误:
复制代码
long x = 3.0; // Error: no implicit conversion from double
long y = (long)3.0; // OK: explicit conversion
Long数据类型--Visual Basic 2008 参考
保存 32 位(4字节)有符号整数。
用于保存超出 Integer 类型范围的整数。默认值 0。在 6.0 以前版本中,是 32 位的。
其可以转换为 Single、Double、Decimal 而不会溢出。
在文本(如 2.5,3)后追加类型字符“L”将会将其强制转换为 Long,其标示符类型字符为“”。
Long 对应于 .NET 的类型为 System. Int64 结构。
就HashMap与HashTable主要从三方面来说.
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap允许在一个集合中有一个null键和在一个集合中有多个null值
Hashtable是HashMap的同步版本;HashMap允许有null值和一个null键,但是,Hashtable不允许有任何内容为null。Hashtable类的对象必须覆盖Object类的hashCode()和equals()方法关于其他集合类型。
一.ArrayList 提供快速遍历和快速访问。现在设计了新的 RandomAccess 接口,它指出这种列表支持快速随机访问。Vector也实现了RandomAccess 接口。
二.遍历HashSet与HashMap时,其顺序是未知的(但添加删除快)。LinkedHashSet和LinkedHashSet是按照元素的插入的顺序遍历的(遍历快)。
三.TreeSet和TreeMap将保证元素按照元素的自然顺序进行排列。也可以使用一个用户自己实现的比较规则。
四、HashSet有一个散列表支持它。它为基本操作提供固定时间性能。TreeSet它确保了排序集将按元素升序,根据自然顺序排序。
参考资料来源:百度百科--Java基础
参考资料来源:百度百科--long
关于javaint64和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-21,除非注明,否则均为
原创文章,转载请注明出处。