Java中Object数据类型与基本数据类型区别及int与Integer使用场景
一、Object声明变量和具体类型声明变量的区别与选择
核心区别
- 类型安全度不同:用
String name、int age这种具体类型声明时,编译器会在编译阶段就帮你做类型校验,比如你给name赋值整数,编译器直接就会报错,提前把问题拦在开发阶段。但用Object声明时,编译器只会把变量当成最通用的对象类型,不管你存什么值都不会报错,等到运行时你要把Object类型的name当字符串用的时候,才会抛出类型转换异常,等于问题到线上运行才会暴露,风险极高。 - 使用便捷度不同:用具体类型声明的变量,可以直接调用对应类型的所有方法,比如
String类型的name可以直接调用substring()、contains()等字符串专属方法。但Object类型的变量只能调用Object类自带的几个基础方法,要想用专属方法还得手动强转(String)name,既麻烦又容易出错。 - 性能开销不同:比如
age用int基本类型声明时,数值直接存在栈内存中,读写速度极快,几乎没有额外开销。但用Object声明的话,int值会自动装箱成Integer对象,存在堆内存中,不仅占用更多内存,读写还要通过对象引用寻址,性能要差不少。
选择建议
- 绝大多数常规业务开发场景,都优先用具体对应类型声明变量,既能提前查错,用起来也方便,性能还高。
- 只有当你写通用工具、框架代码,确实需要接收任意类型的变量时,才需要用到
Object类型声明。
二、int基本类型和Integer包装类的区别与选择
通俗来说,int是Java原生的基本数据类型,就像一张直接印着数字的裸卡片,本身只存数值,没有其他附加功能;Integer是Java给int套的一层对象外壳,相当于把数字卡片装到了带扩展功能的卡套里,属于对象类型。
选择场景
- 普通的数值计算、计数、临时存数字的场景,直接用
int即可,速度快、占内存小,没有额外开销。 - 遇到以下情况必须用
Integer:- 要把数字存入
ArrayList、HashMap等集合类时,集合只能存储对象,不能存基本数据类型,必须用包装类 - 变量需要支持
null值时,比如业务中年龄是可选字段,用户没填的时候要存null,int是基本类型没法设为null,Integer可以 - 需要用到包装类提供的内置方法时,比如把字符串转成数字
Integer.parseInt("27")、做进制转换、获取数值哈希值等操作
- 要把数字存入
注意:两个Integer对象比较数值大小不要用==,要使用equals()方法。==默认比较的是对象的内存地址而不是内部存储的数值,只有-128~127范围内的Integer会走缓存,用==才会得到预期结果,超出范围就会出现逻辑错误。
内容的提问来源于stack exchange,提问作者Surendra Anand
相关产品推荐
相关产品推荐

