Java 基本数据类型高频面试题一、基础概念类1. Java 有哪八种基本数据类型各自的位数、字节、取值范围是什么核心回答Java 有 8 种基本数据类型分为 4 类类型位数(bit)字节(byte)默认值取值范围包装类byte字节型810-128 ~ 127Byteshort短整型1620-32768 ~ 32767Shortint整型3240-2¹⁰⁷³⁷⁴¹⁸²⁴ ~ 2¹⁰⁷³⁷⁴¹⁸²³Integerlong长整型6480L-9223372036854775808 ~ 9223372036854775807Longfloat单精度浮点型3240.0f约 ±3.40282347E38F有效位数6~7位Floatdouble双精度浮点型6480.0d约 ±1.79769313486231570E308有效位数15~16位Doublechar字符型162‘\u0000’空字符\u0000 ~ \uffff0~65535Characterboolean布尔型1JVM 规范未明确通常1字节1falsetrue / falseBoolean补充考点为什么char是 16 位因为 Java 采用 Unicode 编码16 位可以覆盖 BMP基本多语言平面的所有字符支持全球语言。boolean在 JVM 中没有明确的大小规范HotSpot 虚拟机中用 1 字节存储数组中用 1 位/元素压缩存储。2. int 和 long 是多少位、多少字节long 和 int 可以互转吗1位数/字节int32 位4 字节取值范围约 ±21 亿long64 位8 字节取值范围约 ±900 亿亿2能否互转可以但分两种情况int → long自动类型转换安全无风险因为 long 取值范围完全包含 int编译器会自动完成转换不会丢失精度。inta100;longba;// 自动转换等价于 long b (long)a;long → int强制类型转换有风险因为 int 范围小于 long必须手动强转如果 long 值超出 int 范围会直接截断高位导致数值错误。longa100L;intb(int)a;// 正常结果100longc3000000000L;// 超出int最大值2147483647intd(int)c;// 强转后结果为-1294967296完全错误3. 数据类型转换方式有哪些核心回答分为自动类型转换隐式和强制类型转换显式两类还有字符串与基本类型的转换。1自动类型转换隐式规则小范围类型 → 大范围类型编译器自动完成无精度损失。转换顺序byte/short/char → int → long → float → double注意byte、short、char三者之间不会自动转换运算时会先提升为int示例bytea10;intba;// byte→int自动转换doublecb;// int→double自动转换2强制类型转换显式规则大范围类型 → 小范围类型必须手动加(类型)可能丢失精度/数值错误。示例doublea3.14;intb(int)a;// 强制转换结果为3丢失小数部分longc100L;shortd(short)c;// 强制转换结果1003字符串与基本类型的转换基本类型 → 字符串String.valueOf(xxx)或 xxxinta100;Strings1String.valueOf(a);// 100Strings2a;// 100字符串 → 基本类型包装类的parseXxx()方法Strings123;intaInteger.parseInt(s);// 123doublebDouble.parseDouble(3.14);// 3.144. 类型互转会出现什么问题核心回答主要有 3 类问题精度丢失浮点型转整型时直接截断小数部分不四舍五入doublea3.99;intb(int)a;// 结果3不是4数值溢出/错误大范围整型转小范围整型时高位被截断结果完全错误longa3000000000L;intb(int)a;// 结果-1294967296完全偏离原值符号位问题有符号数转无符号数如byte转char时符号位被当作数值位导致数值异常bytea-1;// 二进制11111111charb(char)a;// 结果为\uffff65535完全不是-1浮点数精度丢失高频考点float/double是二进制浮点数无法精确表示 0.1 这类十进制小数运算会出现误差System.out.println(0.10.2);// 输出0.30000000000000004不是0.35. 为什么用 BigDecimal 不用 double核心回答double是二进制浮点数基于 IEEE 754 标准只能近似表示十进制小数无法精确存储 0.1、0.2 这类数在金融、金额计算等高精度场景会出现严重误差。BigDecimal是十进制浮点数可以精确表示任意十进制小数完全避免精度丢失是金额计算的唯一正确选择。示例对比// double 计算误差doublea0.1;doubleb0.2;System.out.println(ab);// 0.30000000000000004错误// BigDecimal 精确计算BigDecimalcnewBigDecimal(0.1);BigDecimaldnewBigDecimal(0.2);System.out.println(c.add(d));// 0.3正确补充避坑点不要用new BigDecimal(double)构造会把 double 的误差带入 BigDecimal必须用new BigDecimal(字符串)或BigDecimal.valueOf(double)除法必须指定舍入模式如RoundingMode.HALF_UP四舍五入否则除不尽会抛异常二、装箱拆箱与包装类6. 装箱和拆箱是什么核心回答装箱Boxing把基本数据类型自动转换为对应的包装类对象如int → Integer拆箱Unboxing把包装类对象自动转换为对应的基本数据类型如Integer → int这是 Java 5 引入的语法糖由编译器自动完成本质是调用包装类的valueOf()装箱和xxxValue()拆箱方法。示例// 手动装箱/拆箱Java 5 之前IntegeraInteger.valueOf(10);// 手动装箱intba.intValue();// 手动拆箱// 自动装箱/拆箱Java 5Integerc10;// 自动装箱等价于Integer.valueOf(10)intdc;// 自动拆箱等价于c.intValue()7. Java 为什么要有 IntegerInteger 相比 int 有什么优点为什么还要保留 int1为什么要有 IntegerJava 是面向对象语言基本数据类型不是对象无法满足面向对象的需求如泛型、集合、反射、空值表示因此为每种基本类型设计了对应的包装类让基本类型可以以对象的形式存在。2Integer 相比 int 的优点支持 null 值可以表示“未赋值/不存在”的状态适合数据库、接口参数等场景int 只能是 0无法区分 0 和未赋值支持泛型/集合泛型、集合如ListInteger只能存对象不能存基本类型必须用包装类提供丰富工具方法如Integer.parseInt()、Integer.compare()、Integer.toBinaryString()等支持缓存机制Integer 有缓存池复用常用对象提升性能3为什么还要保留 int性能更高int 是基本类型直接存储在栈中无需对象开销Integer 是对象存储在堆中有对象头、GC 开销内存占用更小int 占 4 字节Integer 对象占 16 字节64 位 JVM 压缩指针内存开销是 int 的 4 倍避免空指针异常int 永远不会为 nullInteger 可能为 null拆箱时会抛NullPointerException运算效率更高基本类型运算直接在 CPU 寄存器中完成包装类需要拆箱有额外开销总结普通运算、局部变量、数组用int性能更好泛型、集合、数据库映射、接口参数用Integer满足面向对象需求8. 说一下 Integer 的缓存高频必考题核心回答Integer 为了优化性能实现了缓存池IntegerCache默认缓存-128 ~ 127之间的 Integer 对象。当通过Integer.valueOf(int)或自动装箱创建该范围内的 Integer 时会直接复用缓存池中的对象不会新建对象超出该范围的数值会每次新建对象代码示例面试必写Integera100;// 自动装箱调用Integer.valueOf(100)复用缓存Integerb100;// 复用同一个缓存对象System.out.println(ab);// true同一个对象Integerc200;// 超出缓存范围新建对象Integerd200;// 新建对象System.out.println(cd);// false两个不同对象补充考点缓存范围可调整通过 JVM 参数-XX:AutoBoxCacheMaxxxx可以修改缓存上限下限固定为 -128例如-XX:AutoBoxCacheMax1000会缓存-128~1000其他包装类的缓存Byte缓存-128~127固定无法修改Short缓存-128~127固定Long缓存-128~127固定Character缓存0~127ASCII 字符固定Boolean缓存TRUE/FALSE两个对象固定Float/Double没有缓存因为浮点数没有有限的常用范围 与 equals 的区别比较的是对象地址缓存范围内的 Integer 用为 true超出为 falseequals()比较的是数值无论是否在缓存范围内只要数值相等就为 trueSystem.out.println(c.equals(d));// true数值都是200三、补充高频面试题同类延伸9.int和Integer的区别高频对比题对比维度intInteger类型基本数据类型引用数据类型包装类存储位置栈局部变量/堆数组/对象成员堆对象存储默认值0null泛型/集合支持不支持支持空指针风险无有拆箱时null会抛NPE内存占用4字节16字节64位压缩指针运算效率高直接CPU运算低需要拆箱/装箱缓存机制无有-128~12710.float f 3.14;为什么会报错核心回答Java 中浮点型字面量默认是 double 类型3.14是 double把 double 赋值给 float 属于大范围转小范围必须强制转换否则编译器报错。正确写法floatf3.14f;// 加f后缀明确为float类型// 或floatf(float)3.14;// 强制转换11.char类型能不能存储一个中文汉字为什么核心回答可以。因为 Java 中char是 16 位采用 Unicode 编码Unicode 字符集包含了所有中文汉字GB2312/GBK 等编码的汉字都在 Unicode 范围内一个char可以存储一个中文汉字。charc中;// 合法System.out.println(c);// 输出中12.boolean类型的取值范围能不能用 0/1 代替核心回答boolean只有两个取值true和false没有其他值不能用 0/1 代替Java 是强类型语言boolean和int是完全独立的类型不能互转C/C 中可以Java 中不行// 错误写法booleana1;// 编译报错if(1){}// 编译报错// 正确写法booleanbtrue;if(b){}13. 基本数据类型和引用数据类型的区别对比维度基本数据类型引用数据类型包含类型byte/short/int/long/float/double/char/boolean类、接口、数组、包装类存储位置栈局部变量/堆数组/对象成员栈存引用堆存对象实体默认值有默认值如int为0引用默认值为null传递方式值传递拷贝数值值传递拷贝引用地址本质是引用传递空指针无有引用为null时调用方法会抛NPE内存开销小大有对象头开销14. 为什么new Integer(127)和Integer.valueOf(127)得到的对象不同核心回答new Integer(int)会强制新建对象无论数值是否在缓存范围内都会在堆中创建新对象Integer.valueOf(int)会优先复用缓存池中的对象-128~127 范围内直接返回缓存对象不会新建IntegeranewInteger(127);// 新建对象IntegerbInteger.valueOf(127);// 复用缓存System.out.println(ab);// false两个不同对象15. 自动装箱拆箱的常见坑1空指针异常Integeranull;intba;// 自动拆箱调用a.intValue()a为null抛NullPointerException2缓存范围导致的 比较问题Integera100;Integerb100;System.out.println(ab);// true缓存Integerc200;Integerd200;System.out.println(cd);// false新建对象3大量装箱导致的性能问题循环中频繁自动装箱会创建大量对象触发 GC影响性能建议用基本类型循环// 性能差频繁装箱for(Integeri0;i1000000;i){}// 性能好用基本类型for(inti0;i1000000;i){}四、面试答题技巧回答结构先给结论再讲原理最后补代码示例面试官最爱听避坑点不要混淆和equals()对 Integer 的比较不要用new BigDecimal(double)必须用字符串构造不要在循环中用包装类避免性能问题延伸亮点提到 Integer 缓存的 JVM 参数调整提到 BigDecimal 的舍入模式和精度控制提到基本类型和引用类型的内存模型栈/堆存储