我一直想知道,一般来说,在循环之前声明一个抛弃变量,而不是在循环内部重复,是否会产生任何(性能)差异?Java中的一个(毫无意义的)示例:
a)循环前的声明:
double intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i;
System.out.println(intermediateResult);
}
Run Code Online (Sandbox Code Playgroud)
b)声明(重复)内循环:
for(int i=0; i < 1000; i++){
double intermediateResult = i;
System.out.println(intermediateResult);
}
Run Code Online (Sandbox Code Playgroud)
哪一个更好,一个还是b?
我怀疑重复变量声明(例子b)在理论上会产生更多的开销,但是编译器足够聪明,所以它并不重要.实施例b具有更紧凑的优点,并且将变量的范围限制在其使用的位置.尽管如此,我倾向于根据示例来编码一个.
编辑:我对Java案件特别感兴趣.
问题#1:在循环中声明一个变量是一个好习惯还是坏习惯?
我已经阅读了其他关于是否存在性能问题的线程(大多数说没有),并且您应该始终将变量声明为接近它们将被使用的位置.我想知道的是,这是否应该避免,或者它是否真的是首选.
例:
for(int counter = 0; counter <= 10; counter++)
{
string someString = "testing";
cout << someString;
}
Run Code Online (Sandbox Code Playgroud)
问题2:大多数编译器是否已经声明变量已经被声明并且只是跳过了那个部分,或者它实际上每次都在内存中为它创建了一个位置?
Java中是否存在匿名代码块的实际用途?
public static void main(String[] args) {
// in
{
// out
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是关于命名块,即
name: {
if ( /* something */ )
break name;
}
Run Code Online (Sandbox Code Playgroud)
.
我不确定这个问题是否与语言无关,所以我只想将其作为一个Java问题.如果你有一个像循环
for (int i = 0; i < 9; i++) {
Object obj = new Object;
// fill object
// do something with data
}
Run Code Online (Sandbox Code Playgroud)
内存中的新空间是通过循环的每次迭代创建的吗?如果是这样,旧空间是否被处理?如果没有,做这样的事情会更有效率
Object obj = new Object;
for (int i = 0; i < 9; i++) {
// fill object
// do something with data
}
Run Code Online (Sandbox Code Playgroud)
编辑:更新代码以更好地举例说明问题
我有一个42行的文本文件.每行包含超过22,000个以逗号分隔的数字.
我想从每一行中提取某些数字,并且我有一个长度为1000的int数组,其中包含从这42行中的每一行中需要的1,000个数字.
例如,如果数组包含43,1,3244,则意味着我需要从第一行到第42行开始的第43个数字,第1个数字和第3244个数字.
我的for循环似乎不起作用,它只读取文本文件中第一行有42行220000个数字,我不知道它出错了.
for(int i=0;i<42;i++){ //irretates through the 42 lines of
counter=1; // to keep track about on which line the code is working
System.out.println("Starting line"+i);
st2=new StringTokenizer(raf1.readLine(),",");
//raf3 is a RandomAccessFile object containing the 42 lines
a:while(st2.hasMoreTokens()){
b=is_there(array2,counter);
// is_there is a method that compares the rank of the taken being read with
//the whole array that has the 1000 numbers that i want.
if(b==false){
// if the rank or order of token [e.g. 1st, 432th] we are …Run Code Online (Sandbox Code Playgroud) 所以,基本上我有两个数组:
int[] listA = {2, -5, -121, 102, -35, -2, 0, -125, 802, -10};
int[] listB = {6, 99, -1, 12, 1, -2};
Run Code Online (Sandbox Code Playgroud)
我想填写一个新的数组(listD)所有listA缺少的元素listB.
输出应该是这样的:
输出:2,-5,-121,102,-35,0,-125,802,-10
我的代码如下:
int arraySize = 0; //Variable to determine size of the new array;
int difElements = 0; //Variable to count every different element;
for(int i = 0; i < listA.length; i++){
for(int j = 0; j < listB.length; j++){
if(listA[i] != listB[j]){
difElements++;
}
if(difElements == listB.length){
arraySize++; …Run Code Online (Sandbox Code Playgroud) ReSharper通常会告诉我这一点,而且我仍然在寻找为什么这样做的充分理由.
我想到的唯一一件事就是声明它更接近它将使用的范围,可以避免在某些不需要的情况下初始化它(因为条件等)
与此相关的事情如下:
int temp;
foreach (var x in collection) {
temp = x.GetValue();
//Do something with temp
}
Run Code Online (Sandbox Code Playgroud)
这真的不同于
foreach (var x in collection) {
int temp = x.GetValue();
//...
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,第二个代码不是更昂贵,因为它每次都在分配内存吗?或两者都一样?当然,在完成循环之后,在第二个代码中垃圾收集器将关注temp变量,但不是在第一个...
(我使用String作为示例,但它可以替换为Object> MB的内存)
做了很多这样的事情:
private static String mTempString = "";
private static void SomeMethod()
{
mTempString = "Whatever Result";
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如果我是这样写的:
private static void SomeMethod()
{
String mTempString = "Whatever Result";
}
Run Code Online (Sandbox Code Playgroud)
并在循环中使用它(每秒执行数百次)作为示例,Java会知道如何管理内存吗?记忆会有效地存在.(对不起,我现在不能自己测试一下)
哪个内存效率更高(忽略它们是小变量的事实)
--edit ---在这里找到一篇很好的文章解释它http://www.cs.berkeley.edu/~jrs/4/lec/08
我是一名学生,目前在学校学习java(初学者),我对此感到疑惑.
我对其他语言的编码有基本的了解,我不了解Java中的特定内容.
如果我int在一个循环中声明一个变量(让我们用一个例子)并不意味着我一遍又一遍地声明同一个变量?
这就是我的意思:
for (int i = 0; i < 3; i ++) {
int x = 5;
}
Run Code Online (Sandbox Code Playgroud)
这不是一回事吗?(这个不正确)
int x = 5;
int x = 5;
Run Code Online (Sandbox Code Playgroud)
如果没有,为什么?它们都是/两次声明相同的变量,虽然我知道在循环中变量是本地的,不能在循环之外使用(我不认为这是问题).
我也知道你不能两次声明相同的变量,所以我不明白第一个例子是如何合法的.
非常感谢:D
这个问题已经解决,感谢所有帮助过的人:D
在编写循环时,我经常会对应该选择哪一个感到困惑.例如,
int sum;
for(int i=0; i<10; i++)
{
sum=0;
...
....
}
Run Code Online (Sandbox Code Playgroud)
要么
for(int i=0; i<10; i++)
{
int sum=0;
...
....
}
Run Code Online (Sandbox Code Playgroud)
比如,变量仅在此循环中需要.在程序的后期部分不需要它.我需要在循环开始时变量sum的值为0.哪一个更好的做法?在循环开始时重新初始化变量或重新声明它?哪一个更有效率?