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


猜你喜欢
- 描述说明:public class TryCatchStu { /*try catch:自己处理异常 *t
- Android中webview与JS交互、互调方法实例详解前言:对于试水的功能,一般公司都会采用H5的方式来开发,可以用很少的资源与很短的项
- Java8 移除两个相同List对象List<Data> data1 = new ArrayList<>(
- 本文实例讲述了C# Console利用mspaint打开图像并保存的方法。分享给大家供大家参考,具体如下:调用画图板压缩图片System.D
- 先给出网页地址:https://wall.alphacoders.com/featured.php?lang=Chinese主要步骤:利用J
- 猜数字游戏你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜
- 本文实例为大家分享了Android列表时间轴展示的具体代码,供大家参考,具体内容如下实现的效果图如下:实现的方式是利用recycleview
- 命名空间的特性首先熟悉一下命名空间的两个概念。声明区域:可以在其中进行声明的区域,如全局文件的声明区域是文件,函数内声明的变量声明区域为代码
- java 代码块与静态代码块加载顺序public abstract class ClassLoadingTest {public stati
- 详解Http请求中Content-Type讲解以及在Spring MVC中的应用引言: 在Http请求中,我们每天都在使用Content-t
- 文章描述跑马灯效果,功能效果大家应该都知道,就是当我们的文字过长,整个页面放不下的时候(一般用于公告等),可以让它自动实现来回滚动,以让客户
- 1. 什么是 HookHook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着
- 本文实例讲述了C#中TreeView节点的自定义绘制方法。分享给大家供大家参考。具体如下:if ((e.State & TreeNo
- Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标
- 本Demo为练手小项目,主要是熟悉目前主流APP的架构模式.此项目中采用MVC设计模式,纯代码和少许XIB方式实现.主要实现了朋友圈功能和摇
- 一、注解(annotations)列表@SpringBootApplication:包含了@ComponentScan、@Configura
- 一、事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操
- 一,内部类访问成员1,内部类可以直接访问外部类的成员,包括私有。2,外部类要访问内部类,必须建立内部类对象。class Outer{int
- 1.实现如图所示的单选效果由于Android提供的单选按钮radiobutton只能单行或单列显示,且样式并不美观,故可用GridView进
- 前言提起子类、基类和方法继承这些概念,肯定大家都非常熟悉。毕竟,作为一门支持OOP的语言,掌握子类、基类是学习C#的基础。不过,这些概念虽然