Java 什么东西更贵?实例化高级数据结构或执行两个循环(一个接一个O(n))并使用数组?
我的任务是创建一个算法来解决一个给定的问题,但也被指示提供时间和内存方面的最佳解决方案。我将得到一个字符串数组。最终,我希望在char[]中获取数组中所有字符串的所有字符 我的问题是(特别是那些处理过代码和性能优化的人),我应该使用Java 什么东西更贵?实例化高级数据结构或执行两个循环(一个接一个O(n))并使用数组?,java,optimization,Java,Optimization,我的任务是创建一个算法来解决一个给定的问题,但也被指示提供时间和内存方面的最佳解决方案。我将得到一个字符串数组。最终,我希望在char[]中获取数组中所有字符串的所有字符 我的问题是(特别是那些处理过代码和性能优化的人),我应该使用List然后手动销毁对象并将内容复制到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也不会“非常昂贵”