Item 更喜欢原始类型而不是打包的原始类型
技术百科
心靈之曲
发布时间:2024-10-10
浏览: 次 原始类型与原始类型打包的原始类型
- 基本类型:int、double、boolean 等
- 压缩原始类型:整数、双精度、布尔值等
- java 有双重类型系统:原始类型和引用类型(对象)。
- 每种基本类型都有对应的包装类。
主要区别
身份与身份价值:
原语:它们没有身份;具有相同值的两个基元始终相等。
打包:它们是对象,有身份;两个对象可以具有相同的值但不同的标识。空值:
基元: 始终有一个默认值(例如,int 为 0)。
打包:可能为null,如果处理不当可能会导致nullpointerexception异常。表现:
原语:在时间和空间上更高效。
打包: 由于创建额外对象而引入开销。
混合基元和包时的常见问题
- 1.比较身份而不是价值
- 当比
较使用 == 打包的对象时,您比较的是对象引用,而不是值。这可能会导致意想不到的结果。
有问题的示例:
comparatornaturalorder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
问题: i == j 比较比较引用,而不是值。
不正确的行为:naturalorder.compare(new integer(42), new integer(42)) 返回 1 而不是 0。
解决方案:
使用 integer 类的 compareto 方法或实用方法。
comparatornaturalorder = integer::compare;
或者,纠正原始比较器:
comparatornaturalorder = (iboxed, jboxed) -> { int i = iboxed; int j = jboxed; return (i < j) ? -1 : ((i == j) ? 0 : 1); };
2。自动拆箱和 nullpointerexception
当使用可以为 null 的打包类型时,如果对象为 null,自动拆箱可能会引发异常。
有问题的示例:
integer i = null;
if (i == 42) {
system.out.println("inacreditável");
}
问题: i 为空;与 42 比较时,会发生 null 自动拆箱,导致 nullpointerexception。
解决方案:尽可能使用原始类型。
int i = 0;
if (i == 42) {
system.out.println("inacreditável");
}
3。由于自动装箱/拆箱而导致性能下降
在密集型操作中无意中使用包装类型可能会由于自动装箱和不必要的对象创建而导致性能下降。
有问题的示例:
long sum = 0l;
for (long i = 0; i <= integer.max_value; i++) {
sum += i;
}
system.out.println(sum);
问题: sum 是一个压缩的 long;在每次迭代中,都会发生自动装箱/拆箱。
影响:代码速度变慢并且内存使用过多。
解决方案:
在密集操作中对局部变量使用原始类型。
long sum = 0l;
for (long i = 0; i <= integer.max_value; i++) {
sum += i;
}
system.out.println(sum);
何时使用封装类型
- 集合:不能在泛型集合(例如列表)中使用原始类型。
- 泛型参数:泛型类型不支持原始类型(例如threadlocal)。
- 需要对象的 api:某些 api 需要对象而不是原始类型。
良好实践
- 首选原始类型:只要有可能,就使用原始类型以实现简单性和效率。
- 小心自动装箱/拆箱:自动装箱可以减少冗长,但可能会引入微妙的错误。
- 避免在 wrapped 中与 == 进行比较:使用 equals() 等方法或比较展开的值。
- 检查空值:使用打包类型时,请注意它们可能为空并导致 nullpointerexception。
总结
原始类型:
更简单、更快。
它们不能为空。
他们没有身份(只有价值)。
包装类型:
在集合和通用 api 中使用时需要。
它们可以为空。
他们有对象身份。
# 的是
# 而不是
# 是一个
# 能在
# 都有
# 更快
# 为空
# 有可能
# 无意中
# 请注意
# 对象
# Java
# int
# double
# 泛型
# NULL
# 封装
# 引用类型
# 局部变量
# Integer
# Boolean
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python代码测试策略_质量保障解析【教程】
- 手机php怎么转mp4_手机端php文件转mp4a
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- Win11开机Logo怎么换_Win11自定义启动
- c++ std::atomic如何保证原子性 c+
- 如何使用Golang实现基本类型比较_Golang
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Flask 表单数据通过 SMTP 发送邮件的完整
- Win10怎样清理C盘Steam游戏缓存_Win1
- Windows10系统怎么查看CPU核心数_Win
- 如何在Windows中创建新的用户账户?(标准与管
- php能跑在stm32上吗_php在stm32微控
- Win11如何设置ipv6 Win11开启IPv6
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Win11怎么查看显卡温度 Win11任务管理器查
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- Windows10系统服务优化指南_Win10禁用
- php怎么下载安装并配置环境变量_命令行调用PHP
- Win11怎么设置屏保时间_调整Win11屏幕保护
- Win11怎么连接投影仪_Win11多显示器投屏设
- Win10路由器怎么隐藏ssid Win10隐藏w
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- Go 中的 := 运算符:类型推导机制与使用边界详
- Python抽象类与接口设计_规范说明【指导】
- PHP 中 require() 语句返回值的用法详
- 如何在Golang中实现并发消息队列消费者_Gol
- 如何在 Go 结构体中正确初始化 map 字段
- Windows11怎样开启游戏模式_Windows
- php怎么连接数据库_MySQL数据库连接的基础代
- Python lxml的etree和Element
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- c++获取当前时间戳_c++ time函数使用详解
- 如何使用Golang实现微服务状态监控_Golan
- Win11怎么设置默认图片查看器_Windows1
- Python脚本参数接收_sys与argparse
- XAMPP 启动失败(Apache 突然停止)的终
- Win11怎么设置默认邮件应用_Windows11
- Win11怎么关闭贴靠布局_Win11禁用窗口最大
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Python异步网络编程_aiohttp说明【指导
- Go 语言标准库为何不提供泛型 Contains
- 如何将竖排文本文件转换为横排字符串
- Python大型项目拆分策略_模块化解析【教程】
- Win11怎么查看硬盘型号_Windows 11检
- 如何在 Go 中可靠地测试含 time.Time
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- 如何使用Golang实现错误包装与传递_Golan
- Win11输入法选字框不见了怎么办_Win11输入
- PythonWeb前后端整合项目教程_FastAP

较使用 == 打包的对象时,您比较的是对象引用,而不是值。这可能会导致意想不到的结果。
QQ客服