java如何将int数组转化为Integer数组
作者:AI_Frank 发布时间:2021-07-19 04:22:37
将int数组转化为Integer数组
这里使用java8的stream来进行转化,详细步骤如下所示:
//初始化int数组
int[] nums = {1,2,3,4,5,6};
//将int数组转换为数值流
IntStream stream = Arrays.stream(nums);
//流中的元素全部装箱,转换为Integer流
Stream<Integer> integerStream = stream.boxed();
//将流转换为数组
Integer[] integers = integerStream.toArray(Integer[]::new);
上面是分解步骤,实际应用中一行代码即可解决
Integer newNums[] = Arrays.stream(nums).boxed().toArray(Integer[]::new);
Java int和Integer互转原理
Documentation
Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing.
自动装箱(拆箱也是)是 Java 编译器提供的原始类型和它的包装类之间转化的功能。
注意,自动装箱和拆箱是 Java 编译器的功能,并不是运行时的。
int 转 Integer:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(i);
// Java 编译器把上面的代码转换成了下面的样子
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(Integer.valueOf(i));
反过来,Integer 转 int:
public static int sumEven(List<Integer> li) {
int sum = 0;
for (Integer i: li)
if (i % 2 == 0)
sum += i;
return sum;
}
// 编译器把上面的代码转化成了下面的样子
public static int sumEven(List<Integer> li) {
int sum = 0;
for (Integer i : li)
if (i.intValue() % 2 == 0)
sum += i.intValue();
return sum;
}
Java 中 int 和I nteger 互转,原理是 Java 编译器帮你调用了包装类的 valueOf() 和 intValue() 两个方法。
Java Integer、int 与 new Integer()
所有整型包装类对象之间的比较全部使用 equals 方法比较。
对于 Integer var = ? 在 -128 至 127 范围内的赋值,Integer 对象是在 IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用 == 进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,所以推荐使用 equals 方法进行判断。
int 和 Integer 在进行比较的时候,Integer 会进行拆箱,转为 int 值与 int 进行比较。
Integer 与 Integer 比较的时候,由于直接赋值的时候会进行自动的装箱。
IntegerCache 为 Integer 类的缓存类,默认缓存了 -128~127 的 Integer 值,如遇到 [-128,127] 范围的值需要转换为 Integer 时会直接从 IntegerCache 中获取,具体如以下源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
当大于这个范围的时候,直接 new Integer 来创建 Integer 对象。
new Integer(1) 和 Integer a = 1 ,前者创建对象,存储在堆中,而后者是从 IntegerCache 中获取的。那么 Integer a = 128, 直接通过 new Integer(128)创建对象,进行装箱。
Integer i = new Integer(128);
Integer j = 128; // 自动装箱
i == j; // false // == 比较对象的地址是不是相同
i.equals(j); // true
Integer i = new Integer(127);
Integer j = 127;
i == j; // false
i.equals(j); // true
Integer i = 128;
Integer j = 128;
i == j; // false
i.equals(j); // true
Integer i = 127;
Integer j = 127;
i == j; // true
i.equals(j); // true
Integer.valueOf() new Integer()
当你需要产生一个整形的包装类的实例的时候(比如整数10),有两种方式:
Integer i = new Integer(10);// 已过时,且标记为待删除。
Integer i = Integer.valueOf(10);
当你用第一种方式时每次都会产生一个新的实例,而当你使用静态工厂方法时,你产生的数是 -128 到127时,不会 new 一个新的对象,超过这个范围时,同样是 new 一个新的对象。
为什么 Java 9 不建议使用 new Integer 了?
java.lang.Integer @Deprecated(since = “9”)
@Contract(pure = true)
It is rarely appropriate to use this constructor. The static factory valueOf(int) is generally a better choice, as it is likely to yield significantly better space and time performance.
最后一句不是说了吗,有更好的空间和时间性能,你用 new 也没事。
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
上面是 valueOf, 当你传入小于 128 的值时,返回的是内置的缓存值,节省空间和效率。
int 与 integer 相互转换及区别
java 提供了两种类型:int 是 java 的原始数据类型,Integer 是 java 为 int 提供的封装类(引用类型)。
1、Integer 默认值是 null,而 int 默认值是 0;
2、声明为 Integer 的变量需要实例化,而声明为 int 的变量不需要实例化;
3、Integer 是对象,用一个引用指向这个对象;而 int 是基本类型,直接存储数值。
4、Int 类型是放在栈空间的,Integer 是作为对象放在堆空间的。
int 到 Integer:
int a = 66;
// Integer A = new Integer(a);
Integer A = Integer.valueOf(a);
Integer 到 int:
Integer A = Integer.valueOf(66);
int a = A.intValue();
String 类型转为 int 类型:
Integer.parseInt(String str) // String 类型转为 int 类型。
来源:https://blog.csdn.net/qq_30653631/article/details/120666807
猜你喜欢
- 本文实例讲述了C#从命令行读取参数的方法。分享给大家供大家参考。具体如下:using System;class MainClass{ pub
- 前言:mongodb是一个基于分布式文件存储的开源数据库系统。mongodb与我们平常使用的mysql的区别: 1.
- 服务端在平台上创建springboot小程序应用创建小程序登录蚂蚁金服开放平台,扫码登录填写信息后,点击支付宝小程序,选择立即接入 >
- QDownloadQDownload是基于Android平台实现的下载框架。API简洁易上手,只需5分钟即可实现一个多任务、多线程、断点下载
- 本文实例讲述了JAVA+Struts2获取服务器地址的方法。分享给大家供大家参考。具体实现方法如下:HttpServletRequest r
- 大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询。LINQ 是我最喜欢的 C# 语言特
- 内存模型Flink可以使用堆内和堆外内存,内存模型如图所示:flink使用内存划分为堆内内存和堆外内存。按照用途可以划分为task所用内存,
- Android应用强制更新的用途十分广泛,特别上刚上线的应用肯定会存在或多或少的bug,特别是涉及移动支付这一块的内容,如果出错了会造成比较
- 本文主要为大家讲解多种Android调试工具的用法。 1. 查看当前
- 废话不多说了,关键代码如下所示:import java.util.*;public class Demo04 {public static
- 什么是HystrixHystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑
- 本文实例为大家分享了Java实现图书借阅系统的具体代码,供大家参考,具体内容如下为图书阅览室开发一个图书借阅系统,最多可存50本图书,实现图
- 界面效果图如下:报表界面说下关键代码 需要开启 Windows Management Instrumentation服务(默认已经
- 当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的。例如先声明一个bea
- 使用Kotlin的Lambda表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可。示例如下新建一个Kotlin类clas
- 按官方修改的示例:#MidServerClient.javaimport feign.Param;import org.springfram
- 随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题。本文着重介绍了在java并发中常见的几种锁机制。1.偏向锁偏
- 下面是我做C#第一个项目的过程:1.首先打开VS,这里我用的是VS2022预览版,鼠标双击打开VS;图一2.打开VS后会出现下面的页面,鼠标
- 在工作上,我最近对一个现有的Java项目代码进行了清理。完成之后,我发现了一些反复出现的不规范代码。所以,我把它们整理成了一个列表出来分享给
- 前文传送门:异线程下回收对象获取异线程释放对象上一小节分析了异线程回收对象, 原理是通过与stack关联的WeakOrderQueue进行回