int[]我正在尝试将长度为 1,000,000 的非常长的值转换为Integer[],以便我可以使用自定义比较器对其进行排序(它根据定义的相应列表的长度对元素进行排序Map<Integer, List<Integer>>)。
我做了以下事情:
private static Integer[] convert(int[] arr) {
Integer[] ans = new Integer[arr.length];
for (int i = 0; i < arr.length; i++) {
ans[i] = arr[i];
}
return ans;
}
Run Code Online (Sandbox Code Playgroud)
它对我来说效果很好,但我也遇到过
Integer[] ans = Arrays.stream(intArray).boxed().toArray( Integer[]::new );
Run Code Online (Sandbox Code Playgroud)
和
Integer[] ans = IntStream.of(intArray).boxed().toArray( Integer[]::new );
Run Code Online (Sandbox Code Playgroud)
其中是否有任何一个比其他的要快得多?或者是否有其他足够快的方法来缩短运行时间?
在下面的代码中,我使用不安全代码将不可变引用转换为可变指针,然后尝试通过该可变指针编辑内部值。
fn main() {
#[repr(transparent)]
struct Item(isize);
impl Item {
#[inline]
fn ptr(&self) -> *mut isize {
self as *const Item as *mut isize
}
fn increment(&self) {
let val = self.0 + 1;
unsafe {std::ptr::write(self.ptr(), val)}
}
}
let item = Item(22);
println!("before = {}", item.0);
item.increment();
println!("after = {}", item.0);
}
Run Code Online (Sandbox Code Playgroud)
当我在调试模式下编译它时,结果符合预期,并且值确实增加了。然而,在发布模式下,尽管该部分代码运行,但该值根本不增加。此外,以下其他类型的值变异似乎也不起作用
unsafe {*&mut *(self.ptr()) += 1;}
std::mem::replace()
std::mem::swap()