如何计算java对象的大小

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;

import net.blogjava.frankiegao123.util.ByteUtil;

public class HelloWorld {

    public static void main(String[] args) throws IOException {
        Map<String, String> map = new HashMap<String, String>();
        map.put("123", "abc");
        map.put("456", "def");
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream ooo = new ObjectOutputStream(baos);
        ooo.writeObject(map);
        byte[] bys = baos.toByteArray();
        // 长度需要减去 4 个字节:AC ED 00 05
        // AC ED -- 魔法数字
        // 00 05 -- 版本号
        System.out.println(bys.length - 4);
    }
}

 

 

或许不应该叫“魔法数字”,魔法数字是《重构》一书中的概念,与这里的不关,呵呵。

这里应该称为“魔数(magic number)”,魔数一般用于减少读取到垃圾数据的几率。像 Java 的 class 文件也有魔数,即 CA FE BA BE,类加载器加载字节码时,会先验证这 4 个字节,如果头 4 个字节不是这 4 个,那么下面也别做了,肯定不是个类文件,这样做的目的是可以加速错误的产生,不需要浪费无用功。

像很多网络传输协议中也带有魔数,比如规定报文中使用 A0 A0 A0 A0 作为魔数,当收到消息时先判断魔数是否正确,如果不正确,可以认为这是一段垃圾数据,不需要处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值