我之前搞JavaSE的日期的时候总是很迷惑。
为什么日期需要用1个long类型的来表示。date
可是Java原声的,而且是抽象为时间的类啊。
为什么不这样定义:
class Date{
int year;
int month;
int day;
//balabala
}
非得在老早JDK1.1的时候就搞成一个long类型的值,1个毫秒,还得转化为时分秒。
虽然有Calendar
。但那明显是为了更方便的使用Date搞出来的一个类。说白了自己也可以写。
知道啊,学习了素有:最接近底层的语言
之称的C语言后才稍许明白。
我过去对Java很怀疑啊。有人说Java可以搞任何事情,说的就好像万能似的。可是它的int不分机器就是4个字节。
占用这么大的内存怎么搞?
就是那些网络。物联网领域可都是精确到字节的啊。
比如我设计一个协议:
EE CC --开始帧
第3~6个字节有特殊的代表含义
00 CC -- 结束帧
像这样的东西,你用Java怎么表达?用Java最最最基础的数据类型都无法表达。
我一直有这样的疑惑。
用Java的时候虽然可以写嵌入式,比如串口通信可以用到RTX那个jar包。但一直一直很疑惑。
现在看到了C的位段,觉得明白了一些。
C这种高级语言是有一种写法来直接操纵比特的。
而Java的话,它的时间可以用long表示其实是节约内存啊。
class Date{
int year;
int month;
int day;
//balabala
}
这样,花了12字节。
而long只有8字节。
如果日期有1亿个。
那么上面可以用1144G。下面用762.93G。
现在我们算一算硬盘 多少钱/GB
。
0.29元/G。
所以上面两种表示方法的差价:(1144-762.93)*0.29=110.5103元。
恩。差得不多。
但还是省钱了。
如果我们用C语言的位段来表示呢?
typedef struct {
unsigned year : 16;
unsigned month : 8;
unsigned day : 8;
}TimeInfor;
只用3字节
。
还是1亿,总花了286.10G。
让它和Java原声的Date类比,
(762.93-286.10)*0.29=476.82元
。
剩了这么多。
上面的虽然是比较的硬盘,但我感觉数据你保存在内存中不是最终还是要保存到硬盘么?
当然这只是简单粗暴的一算。