2014-08-28 17 views
0

문제가 되겠지만 루프 내에서 초기화가 계속 반복되는 변수가 있다고 가정 할 때 최상의 데이터 유형은 무엇이 될까요? 데이터는 일시적으로? 예를 들어자바 코어 : 값을 변경하는 변수의 데이터 유형

:

String value = ""; 
while(file.hasNext()){ 
    value = file.readLine(); 
} 

물어 이유는, 내가 문자열은 불변 것을 알고있는가보다 효율적인 대안이 있음을 시사한다, 내가 바로 무엇입니까?

답변

3

내가 물어 본 이유는 문자열이 변경되지 않는다는 것을 알고 있기 때문에 효율적인 대안이 있음을 알 수 있습니까?

아니요. readLine 번을 여러 번 호출하면 매번 다른 문자열 참조가 제공됩니다. 문자열 내용 자체를 변경할 수 없기 때문에 String변수의 값을 변경하는 것이 비효율적이라는 의미는 아닙니다. 이 변수 값은 단지 참고 용 일뿐입니다 ... 각 반복마다 문자열 내용을 복사하는 것과는 다릅니다.

변수를 루프에 선언해야합니까? 일반적으로, 나는 가능한 가장 좁은 범위에 변수를 선언하는 것을 선호 : 케이스의이 종류에서

while (file.hasNext()) { 
    String line = file.readLine(); 
    // Use line here 
} 
+0

"일반적으로, 나는 좁은 범위 수와 변수를 선언하는 것을 선호합니다." 그러나 각 루프마다 새로운 메모리 할당이 필요하므로 조금 더 느린 비트라고 가정합니다. 내가 맞습니까? – R2B2

+1

@ user3923424 : 아니요. 스택 프레임은 전체 메서드에 할당되므로 루프를 돌 때마다 추가 메모리가 할당되지 않습니다. –

+0

@ user3923424'readLine()'메소드를 실행할 때마다 새로운 문자열이 생성 될 가능성이 있기 때문에 힙은 두 가지 접근 방식에 상관없이 거의 동일하게 작동합니다. 스택에서는 여전히 해당 문자열에 대한 단일 참조 만 유지하면 모든 반복에서 다른 문자열을 가리 킵니다. 이전 문자열 참조는 루프에서 수행 한 작업에 따라 가비지 수집을 할 수 있습니다. –

2

을 할 수있는 가장 좋은 방법은 while 루프 라인으로 모든 계산 라인에 즉

String value; 
while(file.hasNext()) { 
    value = file.readLine(); 
    //do your thing on value 
    //or store data in an appropriate structure 
} 
입니다

전체 파일이 포함 된 문자열이 있어야하고 읽을 때 데이터를 읽을 수없는 경우 가장 좋은 방법은 StringBuilder입니다 (documentation 참조). 귀하의 경우에는

, 그것은 줄 것이다 :

StringBuilder sb = new StringBuilder(); 
while(file.hasNext()) { 
    sb.append(file.readLine()); 
} 
String entireFile = sb.toString(); 
관련 문제