如何转换int[]
成List<Integer>
Java中?
当然,我对任何其他答案感兴趣,而不是逐个循环地进行.但如果没有其他答案,我会选择那个最好的,以表明这个功能不是Java的一部分.
我知道,如果你将盒装原始Integer与常量进行比较,例如:
Integer a = 4;
if (a < 5)
Run Code Online (Sandbox Code Playgroud)
a
将自动取消装箱,比较将起作用.
但是,当您比较两个盒装Integers
并希望比较相等或小于/大于?时会发生什么?
Integer a = 4;
Integer b = 5;
if (a == b)
Run Code Online (Sandbox Code Playgroud)
以上代码是否会导致检查它们是否是同一个对象,还是会在这种情况下自动取消装箱?
关于什么:
Integer a = 4;
Integer b = 5;
if (a < b)
Run Code Online (Sandbox Code Playgroud)
?
让我们看看以下代码段中的简单Java代码:
public class Main {
private int temp() {
return true ? null : 0;
// No compiler error - the compiler allows a return value of null
// in a method signature that returns an int.
}
private int same() {
if (true) {
return null;
// The same is not possible with if,
// and causes a compile-time error - incompatible types.
} else {
return 0;
}
}
public static void main(String[] args) {
Main m = …
Run Code Online (Sandbox Code Playgroud) 从Java 5开始,我们已经对原始类型进行了装箱/拆箱,因此它int
被包装成java.lang.Integer
等等.
我最近看到了很多新的Java项目(肯定需要一个至少版本为5的JRE,如果不是6个),int
而不是java.lang.Integer
使用后者,尽管使用后者要方便得多,因为它有一些帮助方法可以转换到long
的值等.
为什么有些人仍然在Java中使用原始类型?有什么实际好处吗?
为什么这会抛出 NullPointerException
public static void main(String[] args) throws Exception {
Boolean b = true ? returnsNull() : false; // NPE on this line.
System.out.println(b);
}
public static Boolean returnsNull() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
虽然这不是
public static void main(String[] args) throws Exception {
Boolean b = true ? null : false;
System.out.println(b); // null
}
Run Code Online (Sandbox Code Playgroud)
?
解决办法是更换的方式false
通过Boolean.FALSE
,以避免null
被拆箱到boolean
,可呈现是不可能的.但这不是问题.问题是为什么?JLS中是否有任何引用证实了这种行为,尤其是第二种情况?
java autoboxing boolean nullpointerexception conditional-operator
我刚刚看到类似这样的代码:
public class Scratch
{
public static void main(String[] args)
{
Integer a = 1000, b = 1000;
System.out.println(a == b);
Integer c = 100, d = 100;
System.out.println(c == d);
}
}
Run Code Online (Sandbox Code Playgroud)
运行时,这段代码将打印出来:
false
true
Run Code Online (Sandbox Code Playgroud)
我理解为什么第一个是false
:因为这两个对象是单独的对象,所以==
比较引用.但我无法弄清楚,为什么第二个声明会回来true
?当Integer的值在一定范围内时,是否会出现一些奇怪的自动装箱规则?这里发生了什么?
我想使用条件比较两个Long对象值if
.当这些值小于128时,if
条件正常工作,但当它们大于或等于128时,比较失败.
例:
Long num1 = 127;
Long num2 = 127;
if (num1 == num2) {
// Works ok
}
Run Code Online (Sandbox Code Playgroud)
上面的代码比较正常,但在下面的代码中失败:
Long num1 = 128;
Long num2 = 128;
if (num1 == num2) {
// Does NOT work
}
Run Code Online (Sandbox Code Playgroud)
为什么在将Long变量与大于127的值进行比较时会出现问题?如果变量数据类型更改为长基元,则比较适用于所有情况.
以下代码抛出NullPointerException
:
int num = Integer.getInteger("123");
Run Code Online (Sandbox Code Playgroud)
我的编译器是否getInteger
在null上调用,因为它是静态的?这没有任何意义!
发生了什么?
自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换.例如,将int转换为Integer,将double转换为Double,依此类推.如果转换是另一种方式,则称为拆箱.
那么为什么我们需要它呢?为什么我们在Java中使用自动装箱和拆箱?
我正在实现一个接口,其功能类似于可以包含对象类型的表.接口指定以下功能:
double[] getDoubles(int columnIndex);
Run Code Online (Sandbox Code Playgroud)
我感到难过的是,在我的实现中,我将表数据存储在2D Object
数组(Object[][] data
)中.当我需要返回值时,我想要执行以下操作(假设getDoubles()
只会在包含双精度的列上调用,因此将不会ClassCastExceptions
):
double[] getDoubles(int columnIndex) {
return (double[]) data[columnIndex];
}
Run Code Online (Sandbox Code Playgroud)
但是 - Java不允许Object[]
强制转换为double[]
.将它转换Double[]
为正常是因为它Double
是一个对象而不是一个原语,但我的接口指定数据将作为一个返回double[]
.
所以我有两个问题:
Object[][]
表中获取列数据并返回原语数组吗?Double[]
,是否会对性能产生影响?autoboxing ×10
java ×10
arrays ×2
integer ×2
api-design ×1
boolean ×1
boxing ×1
collections ×1
comparison ×1
jdk1.5 ×1
primitive ×1