如何转换int[]成List<Integer>Java中?
当然,我对任何其他答案感兴趣,而不是逐个循环地进行.但如果没有其他答案,我会选择那个最好的,以表明这个功能不是Java的一部分.
为什么我们需要在C#中装箱和拆箱?
我知道拳击和拆箱是什么,但我无法理解它的实际用途.我应该在哪里以及在哪里使用它?
short s = 25;
object objshort = s; //Boxing
short anothershort = (short)objshort; //Unboxing
Run Code Online (Sandbox Code Playgroud) 我希望array.array比列表更快,因为数组似乎是未装箱的.
但是,我得到以下结果:
In [1]: import array
In [2]: L = list(range(100000000))
In [3]: A = array.array('l', range(100000000))
In [4]: %timeit sum(L)
1 loop, best of 3: 667 ms per loop
In [5]: %timeit sum(A)
1 loop, best of 3: 1.41 s per loop
In [6]: %timeit sum(L)
1 loop, best of 3: 627 ms per loop
In [7]: %timeit sum(A)
1 loop, best of 3: 1.39 s per loop
Run Code Online (Sandbox Code Playgroud)
可能是造成这种差异的原因是什么?
这可能是一个简单的问题,但是我的第一次尝试完全失败了.我想取一个原始long的数组并将其转换为一个列表,我尝试这样做:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
我正在寻找一个清晰,简洁和准确的答案.
理想情况下,作为实际答案,虽然欢迎链接到良好的解释.
我正在尝试收集C#中发生装箱的所有情况:
将值类型转换为System.Object类型:
struct S { }
object box = new S();
Run Code Online (Sandbox Code Playgroud)将值类型转换为System.ValueType类型:
struct S { }
System.ValueType box = new S();
Run Code Online (Sandbox Code Playgroud)将枚举类型的值转换为System.Enum类型:
enum E { A }
System.Enum box = E.A;
Run Code Online (Sandbox Code Playgroud)将值类型转换为接口引用:
interface I { }
struct S : I { }
I box = new S();
Run Code Online (Sandbox Code Playgroud)在C#字符串连接中使用值类型:
char c = F();
string s1 = "char value will box" + c;
Run Code Online (Sandbox Code Playgroud)
注意:char类型的常量在编译时连接在一起
注意:由于6.0版的C#编译器优化串联涉及bool,char,IntPtr, …
观察这种情况让我非常困惑:
Integer i = null;
String str = null;
if (i == null) { //Nothing happens
...
}
if (str == null) { //Nothing happens
}
if (i == 0) { //NullPointerException
...
}
if (str == "0") { //Nothing happens
...
}
Run Code Online (Sandbox Code Playgroud)
因此,我认为首先执行装箱操作(即java尝试从中提取int值null),并且比较操作具有较低的优先级,这就是抛出异常的原因.
问题是:为什么在Java中以这种方式实现它?为什么拳击优先于比较参考?或者为什么他们没有null在拳击前实施验证?
目前,当NullPointerException使用包装的基元抛出它时看起来不一致,并且不会抛出真正的对象类型.
.NET 1.0创建整数集合的方法(例如)是:
ArrayList list = new ArrayList();
list.Add(i); /* boxing */
int j = (int)list[0]; /* unboxing */
Run Code Online (Sandbox Code Playgroud)
使用它的代价是由于装箱和拆箱而缺乏类型安全性和性能.
.NET 2.0方式是使用泛型:
List<int> list = new List<int>();
list.Add(i);
int j = list[0];
Run Code Online (Sandbox Code Playgroud)
拳击的价格(据我所知)是需要在堆上创建一个对象,将堆栈分配的整数复制到新对象,反之亦然,以便取消装箱.
泛型的使用如何克服这个问题?堆栈分配的整数是否保留在堆栈上并从堆中指向(我想这不是这种情况,因为当它超出范围时会发生什么)?似乎仍然需要将其复制到堆栈外的其他地方.
真的发生了什么?
在不使用任何第三方库的情况下,如何将byte []转换为Byte [],并将Byte []转换为byte []?有没有办法快速使用标准库?
boxing ×10
arrays ×4
java ×4
.net ×3
c# ×3
unboxing ×3
collections ×2
autoboxing ×1
byte ×1
casting ×1
generics ×1
glossary ×1
performance ×1
python ×1
value-type ×1