跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
基本数据类型与包装类
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目详细讲解Java中的基本数据类型与包装类,适合初学者系统学习,也可作为高级用户的速查参考。}} == 概述 == Java的数据类型分为'''基本数据类型'''(Primitive Types)和'''引用类型'''(Reference Types)。其中,基本数据类型是语言内置的简单数据存储格式,而包装类(Wrapper Classes)则是将基本类型封装为对象的工具类,二者通过'''自动装箱/拆箱'''机制实现无缝转换。 === 核心区别 === {| class="wikitable" style="margin:auto; text-align:center" |+ 基本数据类型 vs 包装类 ! 特性 !! 基本数据类型 !! 包装类 |- | 存储方式 || 栈内存 || 堆内存 |- | 默认值 || 有(如int为0) || null |- | 是否对象 || 否 || 是(继承自Object) |- | 线程安全 || 不安全 || 部分安全(如AtomicInteger) |} == 基本数据类型 == Java有8种基本数据类型: === 数值型 === * '''整型''': ** <code>byte</code>(8位,范围:<math>-2^7</math>到<math>2^7-1</math>) ** <code>short</code>(16位) ** <code>int</code>(32位,默认整型) ** <code>long</code>(64位,需加<code>L</code>后缀) * '''浮点型''': ** <code>float</code>(32位,需加<code>F</code>后缀) ** <code>double</code>(64位,默认浮点型) === 非数值型 === * <code>char</code>(16位Unicode) * <code>boolean</code>(true/false) <mermaid> pie title 基本数据类型内存占用 "byte" : 1 "short/char" : 2 "int/float" : 4 "long/double" : 8 </mermaid> == 包装类 == 每个基本类型都有对应的包装类(位于<code>java.lang</code>包): {| class="wikitable" |+ 基本类型与包装类对应表 ! 基本类型 !! 包装类 |- | byte || Byte |- | short || Short |- | int || Integer |- | long || Long |- | float || Float |- | double || Double |- | char || Character |- | boolean || Boolean |} === 核心功能 === * 提供类型转换方法(如<code>Integer.parseInt()</code>) * 实现对象化操作(如集合存储) * 包含常量(如<code>Integer.MAX_VALUE</code>) == 自动装箱与拆箱 == 自Java 5引入的自动转换机制: * '''装箱''':基本类型 → 包装类对象(隐式调用<code>valueOf()</code>) * '''拆箱''':包装类对象 → 基本类型(隐式调用<code>xxxValue()</code>) <syntaxhighlight lang="java"> // 自动装箱示例 Integer obj = 42; // 编译器实际执行:Integer.valueOf(42) // 自动拆箱示例 int num = obj; // 编译器实际执行:obj.intValue() </syntaxhighlight> {{Warning|自动装箱可能引发'''NullPointerException''':}} <syntaxhighlight lang="java"> Integer nullObj = null; int n = nullObj; // 运行时抛出NullPointerException </syntaxhighlight> == 缓存机制 == 部分包装类会缓存常用值(享元模式): * <code>Integer</code>缓存-128~127(可通过<code>-XX:AutoBoxCacheMax</code>调整) * <code>Boolean</code>缓存TRUE/FALSE * <code>Character</code>缓存0~127 <syntaxhighlight lang="java"> Integer a = 100; Integer b = 100; System.out.println(a == b); // true(使用缓存对象) Integer c = 200; Integer d = 200; System.out.println(c == d); // false(新建对象) </syntaxhighlight> == 实际应用案例 == === 场景1:集合操作 === 集合类(如<code>ArrayList</code>)只能存储对象: <syntaxhighlight lang="java"> List<Integer> list = new ArrayList<>(); list.add(1); // 自动装箱 int val = list.get(0); // 自动拆箱 </syntaxhighlight> === 场景2:泛型编程 === 泛型类型参数必须是包装类: <syntaxhighlight lang="java"> class Box<T> { private T value; // 只能使用Integer而非int } </syntaxhighlight> === 场景3:数值比较 === <syntaxhighlight lang="java"> Integer x = 500; Integer y = 500; System.out.println(x.equals(y)); // true(值比较) System.out.println(x == y); // false(对象地址比较) </syntaxhighlight> == 最佳实践 == 1. 优先使用基本类型(内存高效) 2. 需要对象操作时使用包装类 3. 使用<code>equals()</code>而非<code>==</code>比较包装类 4. 注意自动拆箱时的NPE风险 == 常见面试题 == {{Collapse|title=Q: Integer a=127 和 Integer b=127 是否相等?|content=由于缓存机制,在-128~127范围内会返回同一对象,因此a==b为true。超出此范围则新建对象。}} {{Collapse|title=Q: 基本类型和包装类的性能差异?|content=包装类涉及对象创建和垃圾回收,在循环中频繁操作时可能产生显著性能开销。}} == 参见 == * [[Java内存模型]] * [[字符串处理]] * [[集合框架]] [[Category:计算机科学]] [[Category:面试技巧]] [[Category:Java基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Collapse
(
编辑
)
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)