如何获得方法的执行时间?是否有Timer实用程序类用于计算任务需要多长时间等等?
Google上的大多数搜索会返回计划线程和任务的计时器的结果,这不是我想要的.
对于Java语言有些新意,我试图让自己熟悉一个可能遍历列表(或者可能是其他集合)以及每个集合的优点或缺点的所有方法(或者至少是非病态方法).
给定一个List<E> list
对象,我知道以下循环所有元素的方法:
while
/ do while
循环以及)// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意:正如@amarseillan指出的那样,这种形式对于迭代List
s来说是一个糟糕的选择,因为该get
方法的实际实现可能不如使用时那样有效Iterator
.例如,LinkedList
实现必须遍历i之前的所有元素以获得第i个元素.
在上面的例子中,List
实现没有办法"保存它的位置"以使未来的迭代更有效.因为ArrayList
它并不重要,因为复杂性/成本get
是恒定时间(O(1)),而a LinkedList
是它与列表的大小(O(n))成比例.
有关内置Collections
实现的计算复杂性的更多信息,请查看此问题 …
哪种是最有效的遍历集合的方式?
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a) {
integer.toString();
}
Run Code Online (Sandbox Code Playgroud)
要么
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();) {
Integer integer = (Integer) iterator.next();
integer.toString();
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是这个,这个,这个或这个的完全重复,尽管最后一个问题的答案之一很接近.这不是欺骗的原因是,大多数都是比较你get(i)
在循环中调用的循环,而不是使用迭代器.
正如Meta上所建议的,我将发布我对这个问题的回答.
有没有一种简单的方法(而不是手动遍历所有的字符串,或循环遍历indexOf),以便找到一个字符出现在字符串中的次数?
假设我们有"abdsd3 $ asda $ asasdd $ sadas",我们希望$出现3次.
在遍历ArrayList,HashMap和其他集合时,是否有任何性能测试结果可用于比较传统的for循环与Iterator?
或者我为什么要使用Iterator for循环,反之亦然?
为什么以下打印老板而不是低音?
String boss = "boss";
char[] array = boss.toCharArray();
for(char c : array)
{
if (c== 'o')
c = 'a';
}
System.out.println(new String(array)); //How come this does NOT print out bass?It prints boss.
Run Code Online (Sandbox Code Playgroud) for ( SomeListElement element : objectWithList.getList() ) { ... }
Run Code Online (Sandbox Code Playgroud)
上面的代码片段是什么?
我最感兴趣的是如果getList()
方法调用一次,还是每次迭代/元素?
下面是我遇到问题的python代码:
for i in range (0,10):
if i==5:
i+=3
print i
Run Code Online (Sandbox Code Playgroud)
我期望输出为:
0
1
2
3
4
8
9
Run Code Online (Sandbox Code Playgroud)
然而翻译吐出:
0
1
2
3
4
8
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
我知道for
循环为C中的变量创建了一个新的作用域,但不知道python.任何人都可以解释为什么python i
中的for
循环中没有变化的值,并且为了获得预期的输出有什么补救措施.
根据Java语言规范,§14.14.2,增强for
循环的变量必须是循环的局部变量.换句话说,这编译:
for (State state : State.values()) {
// do something for each state
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
State state;
for (state: State.values()) {
// do something for each state
}
Run Code Online (Sandbox Code Playgroud)
JLS没有给出这种语言设计选择的理由.我可以看到为什么如果局部变量被final
注释修改或者注释修改了类型名称必须存在,但我不明白为什么不允许在其他地方声明的变量的裸名称.有没有人知道为什么要施加这种限制?
编辑
到目前为止,几个答案似乎暗示在循环外发生的事情是以这种方式设计语言的原因.或许仔细研究JLS所说的将澄清为什么我没有发现这令人信服.考虑这个循环,其中State
是枚举:
for (State state : State.values()) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
State.values()
是一个数组,所以根据JLS,循环在功能上与:
State[] a = State.values();
for (int i = 0; i < a.length; i++) {
State state = a[i];
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在显然可以编写后一个循环:
State state;
State[] a = State.values();
for (int …
Run Code Online (Sandbox Code Playgroud) 假设我有这样的foreach
循环:
Set<String> names = new HashSet<>();
//some code
for (String name: names) {
//some code
}
Run Code Online (Sandbox Code Playgroud)
有没有办法检查内部foreach
实际名称是Set
没有计数器的最后一个?
(对不起,如果这是一个重复的问题,我在这里找不到这样的问题)