String.startsWith

String이 특정 문자열로 시작하는지 확인합니다.

시그니처

boolean startsWith(String prefix)
boolean startsWith(String prefix, int offset)   // offset 위치부터 검사
반환값의미
trueprefix로 시작함
false시작하지 않음

동작 추적

String s = "1195524421";
[ 상태 ]
s: "1195524421"
s.startsWith("119");      // true   ← "119"로 시작
s.startsWith("1195");     // true   ← "1195"로 시작
s.startsWith("11955");    // true
s.startsWith("123");      // false  ← "12..."로 시작 안 함
s.startsWith("");         // true   ← 빈 문자열은 항상 true
s.startsWith("11955244210"); // false ← prefix가 더 김
[ 변경 후 ]
s: "1195524421"   ← 변화 없음 (조회만)

offset 버전

String s = "abc123def";
s.startsWith("123", 3);    // true   ← 인덱스 3부터 "123"으로 시작
s.startsWith("def", 6);    // true   ← 인덱스 6부터 "def"로 시작
s.startsWith("123", 0);    // false  ← 인덱스 0은 "abc..."
[ 시각화 ]

s = "abc123def"
     0123456789
       ↑ offset=3
       │
       ↓
       "123def"  ← 이 부분이 "123"으로 시작? → true

자주 쓰는 패턴

정렬 후 인접 접두사 검사 (전화번호 목록)

String[] phoneBook = {"119", "97674223", "1195524421"};
Arrays.sort(phoneBook);
[ 정렬 후 ]
phoneBook: ["119", "1195524421", "97674223"]
for (int i = 0; i < phoneBook.length - 1; i++) {
    if (phoneBook[i+1].startsWith(phoneBook[i])) {
        return false;
    }
}
return true;
[ 단계별 추적 ]

i=0:
  phoneBook[1].startsWith(phoneBook[0])
  "1195524421".startsWith("119")
  → true → return false

접두사로 필터링

List<String> emails = Arrays.asList(
    "alice@gmail.com", "bob@naver.com", "charlie@gmail.com"
);

List<String> gmail = emails.stream()
    .filter(e -> e.endsWith("@gmail.com"))
    .collect(Collectors.toList());

// 또는 시작 문자열로 필터
List<String> startsWithA = emails.stream()
    .filter(e -> e.startsWith("a"))
    .collect(Collectors.toList());

URL 라우팅

String path = "/api/users/123";

if (path.startsWith("/api/")) {
    // API 요청 처리
} else if (path.startsWith("/static/")) {
    // 정적 파일 처리
}

다른 방법과의 비교

String s = "1195524421";
String prefix = "119";

// 1. startsWith — 가장 명확
s.startsWith(prefix);    // true, O(prefix.length)

// 2. substring + equals — 비효율적 (새 객체 생성)
s.substring(0, prefix.length()).equals(prefix);   // 같은 결과지만 객체 1번 더 생성

// 3. indexOf — 의미 다름 (어디든 포함)
s.indexOf(prefix) == 0;  // 같은 의미지만 전체 스캔할 수도 있음

시간복잡도

연산복잡도
startsWith(prefix)O(m) (m = prefix 길이)
startsWith(prefix, offset)O(m)

전체 문자열을 스캔하지 않음 — prefix 길이만큼만 비교 후 차이 발견 시 즉시 반환.

CSLOG에서 보기