1. 当C#的int遇上Java的Integer
十年前我刚从Java转C#时,最不习惯的就是这两种语言处理整型数据的方式。表面上看都是用来存数字,但底层差异大到能让你在跨平台协作时怀疑人生。记得有次和Java团队联调API,就因为一个整型参数的反序列化问题,我们对着日志里的数字较劲了整整一下午。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 内存里的数字战争
2.1 值类型与引用类型的本质区别
C#的int是货真价实的值类型(Value Type),在栈上直接存储32位二进制数据。我在Unity项目里做过测试,声明一个int变量时,内存里会立即分配4字节空间存放具体数值。这种设计带来的直接好处是访问速度极快——就像你去便利店买饮料,直接从货架上拿,不用找店员问库存。
而Java的Integer是个包装类(Wrapper Class),本质是引用类型。我在Android Studio里用Memory Profiler观察过,new Integer(42)时会在堆上创建对象,变量实际存储的是对象引用。这就像网购饮料,你得先联系卖家确认有货,再等快递送货。
关键区别:值类型变量直接包含数据,引用类型变量存储的是数据地址
2.2 内存占用实测对比
用BenchmarkDotNet和JMH分别测试两种语言的内存占用:
| 操作 | C# int内存消耗 | Java Integer内存消耗 |
|---|---|---|
| 声明单个变量 | 4字节 | 16字节(对象头12+数据4) |
| 100万元素数组 | 4MB | 约16MB |
| 频繁创建临时变量 | 几乎无额外开销 | 触发GC压力 |
去年优化高频交易系统时,我们把Java侧的Integer数组改成int[],内存占用直接降到1/4,GC停顿时间从15ms降到3ms以内。
3. 性能对决:从编译到运行
3.1 编译期优化差异
C#编译器对int的处理堪称"简单粗暴":
csharp复制int x = 42;
Console.WriteLine
