我知道在Java中进行JNI调用时"跨越边界"很慢.
不过,我想知道什么是它,使得它慢?在进行使其速度变慢的JNI调用时,底层jvm实现会做什么?
我很惊讶在Java源代码中看到System.arraycopy是一个本机方法.
当然原因是因为它更快.但是什么原生技巧是能够使用的代码使其更快?
为什么不循环遍历原始数组并将每个指针复制到新数组 - 当然这不是那么缓慢和麻烦?
Java System.arraycopy()对于小型数组是否有效,或者它是一种本机方法使得它可能比简单的循环和函数调用效率低得多?
本机方法是否会因跨越某种Java系统桥而产生额外的性能开销?
我想int[] array在Java中进行排序,但是将排序后的数组存储为新数组而不是覆盖它.
最明显的方法是创建数组的副本,然后对新数组进行排序,如下所示:
int[] a2 = new int[a.length];
for (int i = 0; i < this.length; i++) {
a2[i] = a[i];
}
Arrays.sort(a2);
Run Code Online (Sandbox Code Playgroud)
但是,有更快的方法吗?我们可以在"同时"排序,因为我们将旧数组的元素复制到新数组中吗?
我的数字是N.N将是数组的大小.
int numArray [] = new numArray[N];
Run Code Online (Sandbox Code Playgroud)
但是,数组的内容将保持从1到正N的每个其他数字.这意味着在循环之后整个大小N数组将不会满.因此,在for循环之后,我想修剪(或调整大小)数组,以便数组中不再有任何空插槽.
示例:
假设N = 5; 这意味着,在for循环之后,从1到5的每个其他数字都将在数组中,如下所示:
int arr [] = new int [N];
int arr[0]=1;
int arr[1]=3;
int arr[2]= null;
int arr[3]= null;
int arr[4]= null;
Run Code Online (Sandbox Code Playgroud)
现在,我想在for循环之后修剪(或调整大小),以便保留null的索引将消失,然后数组应该是:
int arr[0]=1;
int arr[1]=3;
Run Code Online (Sandbox Code Playgroud)
数组的大小现在是2.
在Java中填充预先分配的ByteBuffer的最快方法是什么?
我首先使用"assignedirect"设置ByteBuffer的大小,这只需要完成一次.在我需要尽可能快地填充它(循环它)后,新数据以每5ms的形式到达一个byte []数组,并且没有占用内存,因为我已经预先分配了ByteBuffer.目前我使用".put()"指令,在我的系统中需要大约100ms才能完成.还有另一种填充ByteBuffer的方法吗?".wrap()"函数运行得更快而不重新分配数组吗?
我正在尝试编写一个程序来执行 的深拷贝List<List<Integer>>,我正在这样做:
public static List<List<Integer>> clone(final List<List<Integer>> src)
{
List<List<Integer>> dest = new ArrayList<List<Integer>>();
for( List<Integer> sublist : src) {
List<Integer> temp = new ArrayList<Integer>();
for(Integer val: sublist) {
temp.add(val);
}
dest.add(temp);
}
return dest ;
}
Run Code Online (Sandbox Code Playgroud)
这是一个好方法吗?是否有可能摆脱内循环?事实上,每个内部子列表都可以增长到很大的长度。
我想讨论一个特定集合 LinkedHashMap 的一些性能,以满足特定要求,以及 Java 8 或 9 的新特性如何对此有所帮助。
假设我有以下 LinkedHashMap:
private Map<Product, Item> items = new LinkedHashMap<>();
Run Code Online (Sandbox Code Playgroud)
使用默认构造函数意味着此 Map 在迭代时遵循插入顺序。
--EDITED-- 在这里要清楚,我知道 Maps 不是通过索引访问的正确数据结构,碰巧这个类实际上需要两个删除方法,一个是 Product,正确的方法,这是关键,另一个按位置或索引,这并不常见,所以这是我对性能的关注。顺便说一句,这不是我的要求。
我必须通过 index实现removeItem()方法。对于那些不知道的人,LinkedHashMap没有某种map.get(index);可用的方法。
所以我将列出几个解决方案:
解决方案1:
public boolean removeItem(int position) {
List<Product> orderedList = new ArrayList<>(items.keySet());
Product key = orderedList.get(position);
return items.remove(key) != null;
}
Run Code Online (Sandbox Code Playgroud)
解决方案2:
public boolean removeItem(int position) {
int counter = 0;
Product key = null; //assuming there's no null keys
for(Map.Entry<Product, Item> entry: items.entrySet() …Run Code Online (Sandbox Code Playgroud)