Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么东西更贵?实例化高级数据结构或执行两个循环(一个接一个O(n))并使用数组?_Java_Optimization - Fatal编程技术网

Java 什么东西更贵?实例化高级数据结构或执行两个循环(一个接一个O(n))并使用数组?

Java 什么东西更贵?实例化高级数据结构或执行两个循环(一个接一个O(n))并使用数组?,java,optimization,Java,Optimization,我的任务是创建一个算法来解决一个给定的问题,但也被指示提供时间和内存方面的最佳解决方案。我将得到一个字符串数组。最终,我希望在char[]中获取数组中所有字符串的所有字符 我的问题是(特别是那些处理过代码和性能优化的人),我应该使用List然后手动销毁对象并将内容复制到char[]中,还是手动执行并仅使用数组(我也不确定如何执行)。实例化列表对象的成本是否大于通过字符串[]循环、将每个字符串转换为char[]并将所有char[]数组合并在一起的成本 编辑: 好吧,让我更准确一点。是否最好将字符串

我的任务是创建一个算法来解决一个给定的问题,但也被指示提供时间和内存方面的最佳解决方案。我将得到一个字符串数组。最终,我希望在char[]中获取数组中所有字符串的所有字符

我的问题是(特别是那些处理过代码和性能优化的人),我应该使用
List
然后手动销毁对象并将内容复制到char[]中,还是手动执行并仅使用数组(我也不确定如何执行)。实例化列表对象的成本是否大于通过字符串[]循环、将每个字符串转换为char[]并将所有char[]数组合并在一起的成本

编辑:

好吧,让我更准确一点。是否最好将字符串[]的所有字符串转换为列表或任何其他抽象数据结构并使用它们,或者执行以下操作:循环字符串[],将每个字符串转换为char[],并将所有char[]数组合并在一起?

伪代码:

ArrayList<Character> charList = new ArrayList<Character>();
for ( String s : strings ) {
    charList.addAll(s.toCharArray());
}
return charList.toArray(Character.class);
ArrayList charList=new ArrayList();
用于(字符串s:字符串){
charList.addAll(s.toCharArray());
}
返回charList.toArray(Character.class);
或者类似的东西。

伪代码:

ArrayList<Character> charList = new ArrayList<Character>();
for ( String s : strings ) {
    charList.addAll(s.toCharArray());
}
return charList.toArray(Character.class);
ArrayList charList=new ArrayList();
用于(字符串s:字符串){
charList.addAll(s.toCharArray());
}
返回charList.toArray(Character.class);

或者类似的东西。

如果您需要dpulicates,那么实际上您只是将所有字符串附加在一起。在这种情况下,为什么不使用字符串缓冲区呢

StringBuilder sb = new StringBuilder();
for (String s : myStringArray){
    sb.append(s);
}
char chars[] = sb.toString().toCharArray();

StringBuilder也可以使用初始容量创建,以避免动态调整大小的成本。这不会像分配char[]和直接插入char那样快,但对于大多数使用来说应该足够快。作为另一种选择,签出由char[]支持。

如果您需要dpulicates,那么实际上您只是将所有字符串附加在一起。在这种情况下,为什么不使用字符串缓冲区呢

StringBuilder sb = new StringBuilder();
for (String s : myStringArray){
    sb.append(s);
}
char chars[] = sb.toString().toCharArray();

StringBuilder也可以使用初始容量创建,以避免动态调整大小的成本。这不会像分配char[]和直接插入char那样快,但对于大多数使用来说应该足够快。另一种选择是签出,它由char[]支持。

我假设您真正想做的是连接字符串(即,将它们端到端连接)以形成一个字符数组

这可能是执行此操作最有效的内存方式:

int size = 0;
for (String s : strings) { size += s.length(); }
char[] result = new char[size];
int i = 0;
for (String s : strings) {
    for (int j = 0; j < s.length(); j++) {
        result[i++] = s.charAt(j);
    }
}
int size=0;
对于(字符串s:strings){size+=s.length();}
字符[]结果=新字符[大小];
int i=0;
用于(字符串s:字符串){
对于(int j=0;j

如果您试图最小化内存分配和/或复制,我不建议使用
String.tocharray()
,或
StringBuffer
/
StringBuilder

我假设您真正想做的是连接字符串(即将它们端到端连接)以形成字符数组

这可能是执行此操作最有效的内存方式:

int size = 0;
for (String s : strings) { size += s.length(); }
char[] result = new char[size];
int i = 0;
for (String s : strings) {
    for (int j = 0; j < s.length(); j++) {
        result[i++] = s.charAt(j);
    }
}
int size=0;
对于(字符串s:strings){size+=s.length();}
字符[]结果=新字符[大小];
int i=0;
用于(字符串s:字符串){
对于(int j=0;j

如果您试图最小化内存分配和/或复制,我不建议使用
String.tocharray()
,或
StringBuffer
/
StringBuilder

我不会将列表称为“高级”数据结构。但是答案是:为什么不试试呢?为什么不把所有的字符都插入一个哈希集中呢?这将得到所有字符串中的所有字符。但问题是。。哪一个更有效。使用hashtag还是对数组进行任何操作?hashtags的创建和维护并不便宜。这是一个固定时间的查找,O(1),尽管在实践中它是一个小常数。这个问题并不清楚。如果输入是
[“a”,“the”,“he”]
您是希望
['a','t','h','e']
还是希望
['a','t','h','e','h','e']
?如果是第一个,那么hashset是一个合理的解决方案。我不会将列表称为“高级”数据结构。但是答案是:为什么不试试呢?为什么不把所有的字符都插入一个哈希集中呢?这将得到所有字符串中的所有字符。但问题是。。哪一个更有效。使用hashtag还是对数组进行任何操作?hashtags的创建和维护并不便宜。这是一个固定时间的查找,O(1),尽管在实践中它是一个小常数。这个问题并不清楚。如果输入是
[“a”,“the”,“he”]
您是希望
['a','t','h','e']
还是希望
['a','t','h','e','h','e']
?如果是第一个,那么hashset是一个合理的解决方案。你的解决方案比greedybuddha的更有效吗?我的代码名为“伪代码”,它看起来很像java:)。我不知道它是否会比格里迪佛的更快,你应该两种都试试看。除非您需要一个非常大的字符串数组,否则我怀疑您会看到很大的不同。您的解决方案比greedybuddha的更有效吗?我的代码名为“伪代码”,它看起来很像java:)。我不知道它是否会比格里迪佛的更快,你应该两种都试试看。除非您需要一个非常大的字符串数组,否则我怀疑您会看到很大的不同。不过使用缓冲区不是很昂贵吗。。我认为缓冲字符是一个过度的工作,首先写工作应用程序,然后开始优化。你永远不会一开始就创建完美优化的应用程序,而且,如果你预先分配了合适的大小,使用StringBuilder也不会“非常昂贵”