2016-10-21 10 views
2

그래서 {item, quantity} 열이있는 배열이 있다고 가정 해보십시오. SQL 테이블에서이 값을 가져온 다음 항목별로 정렬합니다.임시 변수를 사용하여 배열의 값 조작

while(rs.next()){ 
    item = rs.getString(1); 
    for(int i = 0 ; i < array.size ; i++){ 
    if(item.equals(array[i][0]){ 
     double quantity = rs.getDouble(2); 
     quantity = quantity + Double.parseDouble(array[i][1]); 
     array[i][1] = quantity; 
    } 
    } 
//add code for adding items if not found in array 
} 

내 질문이 배열을 반복 할 때/쓰레기를 만드는 속도가 느려질 수이 임시 변수를 사용하는 것입니다 : 나는 double 값을 조작하는 임시 변수 "수량"을 사용하고 있습니다? Java는 if 문 끝 부분에서이 변수를 올바르게 처리합니까? 나는 힙 공간에 문제가 있기 때문에 물어보고 있으며, 이것을 처리하기 위해 모든 것을 다시 쓰고 싶지는 않습니다.

내 다른 옵션은 다음과 같습니다 이전 값이 배열 물론 유지 될 때 항상 새로운 가치와 수량을 우선합니다

+2

가능한 [루프 내부 또는 외부 변수 선언] 가능한 복제본 (http://stackoverflow.com/questions/8803674/declaring-variables-inside-or-outside-of-a-loop) – acm

+2

A 변수 * 쓰레기를 만들지 않으며 느려지지 않을 것입니다. 값이 달리 이름이 지정되지 않았기 때문에 코드를 명확히 할 수 있습니다. 특히'quantity'라는 변수가 더 좋습니다. 제 2의 예를보세요. 무슨 일이 일어나고 있는지에 대해서는 매우 알려지지 않습니다. 주석이 도움이 될 수 있지만 이름이 명확한 변수도 마찬가지입니다. --- * 참고 : * 첫 번째 예제는'String.valueOf()'호출이 없습니다. – Andreas

+0

"A _variable은 원시이므로 _ 쓰레기를 만들지 않습니다"라고 말하는 것이 더 정확할 수 있습니다. 객체 인 변수는 힙에 할당 된 메모리를 가비지 수집해야합니다. – mangotang

답변

0

를 읽기위한

if(item.equals(array[i][0]){ 
    array[i][1] = String.valueOf(Double.parseDouble(array[i][1]) + rs.getDouble(2)); 
} 

감사합니다. 수량이 특히 원시적 인 경우 메모리에 영향을 미치지 않습니다.

복잡한 유형을 처리하고 이와 비슷한 작업을 수행하면 객체에 대한 모든 루프를 덮어 쓰게되므로 배열에서 동일한 객체에 대한 모든 시간 참조를 갖게됩니다.

+0

그건별로 의미가 없습니다. 'quantity'라는 이름의 변수는 if 블록 내에서 * 선언됩니다. 따라서 블록 내부에만 존재하기 때문에 루프 중에 값이 오버라이드되지 않습니다. 배열 값이 명시 적으로 무시되고 있으므로 "오래된 값이 유지됩니다"라는 말은 잘못되었습니다. – Andreas

+0

Andreas는 if 블록이 종료 될 때 변수가 파괴되어야한다는 점에서 옳습니다. 이 변수가 어떻게 든 쓰레기를 추가하는지 궁금합니다. mangotang은 원시적 인 것이 쓰레기를 만들지 않을 것이며, 오직 객체 만이 될 것이라고 말하고있다. 이 경우, 헤드 스페이스 문제를 해결하기 위해 다시 작성해야합니다. – HagstromV

+0

네 말이 맞아, 나는 틀린 문장을 사용 했어. 혼란 스러울 수있다.힙 크기 문제에 대해서는 블록 내부의 원시 변수가 힙이 아닌 스택 메모리에 있으므로 문제에 영향을 미치지 않을 것입니다. –