StringBuilder 류 의 capacity()방법 과 length()방법 에 대한 작은 구덩이

오늘 프로젝트 를 하 는 과정 에서 StringBuilder.delete()를 만 났 습 니 다.원 하 는 결 과 를 얻 지 못 하고 문자열 을 자 르 는 문 제 를 만 났 습 니 다.원 하 는 답 을 얻 지 못 했 습 니 다.
문 제 는 다음 과 같다.

stringBuilder.delete(stringBuilder.capacity() - 5, stringBuilder.capacity());
이 코드 는 잘못 보고 하거나 많이 삭제 하거나 적 게 삭제 하거나 때로는 정확 하 다.원 하 는 문자열 을 얻 지 못 할 때 도 있다.
간단 한 테스트 capacity()방법 과 length()방법의 차 이 는 다음 과 같다.

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefgh2321");
System.out.println("length:" + stringBuilder.length());
System.out.println("capacity:" + stringBuilder.capacity());
System.out.println("length  :" + stringBuilder.delete(stringBuilder.length() - 3,stringBuilder.length()));
System.out.println("capacity  :" + stringBuilder.delete(stringBuilder.capacity() - 7,stringBuilder.capacity()));
System.out.println("capacity  :" + stringBuilder.delete(stringBuilder.capacity() - 5,stringBuilder.capacity()));
코드 는 다음 과 같 습 니 다:
출력:

마지막 으로 원본 코드 보기,
StringBuilder 클래스 는 AbstractStringBuilder 추상 클래스 에 계 승 됩 니 다.

AbstractString Builder 추상 클래스 에 넣 은 문자열 은 char[]value 배열 에 저장 되 며,count 는 저 장 된 문자 수 입 니 다.
capacity()방법 으로 얻 은 value 배열 의 길이,length()방법 으로 얻 은 것 은 count,즉 문자열 의 실제 길이 입 니 다.


StringBuilder 를 초기 화 할 때,즉 new StringBuilder()일 때 char[16]크기 의 char 데 이 터 를 초기 화하 여 문자열 을 저장 합 니 다.문자열 이 증가 하면 확장 합 니 다.


물론 new StringBuilder("213123");문자열 의 길이 가 16 을 초기 배열 char[]value 의 크기 로 증가 합 니 다.

마지막:
capacity()방법 과 length()방법 을 사용 할 때 선택 하 시기 바 랍 니 다.그렇지 않 으 면 예상 치 못 한 구덩이 가 생 길 수 있 습 니 다.
StringBuilder 초기 화 된 크기 가 성능 에 미 치 는 영향
StringBuilder 는 자신의 데이터 길 이 를 동적 으로 늘 릴 수 있 는 클래스 로 기본 길이(capacity 속성)는 16 입 니 다.
그것 은 용기 의 길 이 를 지정 할 수 있 는 구조 함수 가 있다.데이터 양 이 시간 이 지나 면 지 정 된 길이 의 의미 가 크 지 않 지만 데이터 양 이 비교적 많 을 때 지 정 된 길 이 는 성능 에 현저 한 영향 을 미친다.
본 고 는 작은 예 시 를 통 해 성능 에 미 친 영향 을 검증 하고 자 한다.
코드 는 다음 과 같 습 니 다:

public class StringBuilderTest {
 public static void main(String[] args) throws Exception {
  //              StringBuilder      
  int times = args.length > 0 ? Integer.parseInt(args[0]) : 100;
  int length = args.length > 1 ? Integer.parseInt(args[1]) : 0;
  
  //    times    test(length)  
  long t1 = System.currentTimeMillis();
  for (int i = 0; i < times; i++)
   test(length);
  long t2 = System.currentTimeMillis();
  
  //          
  System.out.printf("Time taken: %d ms.
", (t2 - t1) / times); } // StringBuilder 。 static int test(int length) { StringBuilder sb = new StringBuilder(length); for (int i = 0; i < 10000000; i++) sb.append(i + ""); return sb.length(); } }
다음은 인 코딩 후 2GB 메모 리 를 할당 해 콘 솔 에서 100 회 실행 하 는 실행 결 과 를 테스트 하 는 것 이다.
$ java -Xmx2g -Xms2g StringBuilderTest 100 0
Time taken: 273 ms.
$ java -Xmx2g -Xms2g StringBuilderTest 100 73000000
Time taken: 205 ms.
성능 차 이 는 약 30%이다.
결론.
StringBuilder 를 사용 하여 빅 데 이 터 를 처리 할 때,만약 우리 가 아주 작은 성능 손실 로 데 이 터 를 얻 을 수 있 는 큰 시간 을 예측 할 수 있다 면,StringBuilder 의 길 이 를 미리 지정 하면 처리 속 도 를 현저히 높 일 수 있다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기