Java CharAt CharArray
실험 내용
- 자바에서 String의 각 원소를 순회하는 방법은 여러 가지가 존재
- index와
charAt
메소드를 이용해 for 문으로 이용해 순회 toCharArray
메소드를 이용해 char 배열로 만든 후 개선된 for 문으로 각 원소를 순회chars
메소드를 통해 정수 stream으로 바꾼 후 forEach
로 순회
- 이 방법들의 시간 소모 비교
- Java11, wsl2에서 실험
실험 코드
- 메인 함수
Test2In.txt
파일에 기록된 1000만 자리의 String을 읽어 옴- option 변수에 따라 각 함수를 실행해서 파일에 기록
- 각 함수는 위에서 설명한 1 ~ 3번 방법을 수행하고 출력에 걸린 총 시간을 반환
public static void main(String[] args) throws IOException {
File readFile = new File("./Java11/test/Test2In.txt");
BufferedReader br = new BufferedReader(new FileReader(readFile));
String s = br.readLine();
br.close();
File writeFile = new File("./Java11/test/Test2Out.txt");
FileWriter fw = new FileWriter(writeFile, true);
long result;
int option = 3;
if (option == 1){
result = useCharAt(s);
fw.write("Char At 결과 : " + result + "\n");
}
else if (option == 2){
result = useCharArray(s);
fw.write("Char Array 결과 : " + result + "\n");
}
else if (option == 3){
result = useChars(s);
fw.write("Chars 결과 : " + result + "\n");
}
fw.flush();
fw.close();
}
- useCharAt 함수: charAt으로 String을 순회하면서 String 재구성
public static long useCharAt(String s){
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
sb.append(s.charAt(i));
}
return System.currentTimeMillis() - startTime;
}
- useCharArray 함수: toCharArray로 char 배열을 순회하면서 String 재구성
public static long useCharArray(String s){
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (char c: s.toCharArray()) {
sb.append(c);
}
return System.currentTimeMillis() - startTime;
}
- useChars 함수: chars()로 stream을 만들어 순회하면서 String 재구성
public static long useChars(String s){
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
s.chars().forEach((c) -> sb.append((char)c));
return System.currentTimeMillis() - startTime;
}
결과
Char At 결과 : 47, 48, 46, 49, 48
Char Array 결과 : 64, 62, 61, 63, 62
Chars 결과 : 51, 51, 50, 49, 50
charAt
을 사용하는 방법이 chars
를 사용하는 방법보다 근소하게 빠르긴 하지만, 무의미할 정도로 비슷- 반면
toCharArray
를 이용하는 방법은 확실히 느림. 문자열을 char 배열로 변형하는 과정에서 오버헤드가 발생하는 것으로 추정 - 코드 전문
기타: 1000만 자리 String 생성하는 함수
- ascii 코드의 소문자가 97 ~ 122임을 활용해 생성
public static void generateString() throws IOException {
File file = new File("./Java11/test/Test2In.txt");
FileWriter f = new FileWriter(file, true);
for (int i = 0; i < 10000000; i++) {
f.write((char)(Math.random() * 26 + 97));
}
f.flush();
f.close();
return;
}