자바생
728x90

StringTokenizer

  • 긴 문자열을 지정된 구분자를 기준으로 문자열을 나열 -> 여러 구분자를 사용할 수 있다.

 

생성자 

  • StringTokenizer(String str, String delim) : 특정 delim(구분자)로 문자열 분리
  • StringTokenizer(String str, String delim, boolean return Delims) : str을 delim 기준으로 분리시키는데, 그 delim까지 token으로 포함할지 포함하면 true 입력, false일 때는 포함하지 않는다.
  • delim default값은 공백 문자들(\t \n \r \ t)이다.
  • booelan return delims default값은 false인 것 같다. 입력하지 않으면 자동으로 구분자를 포함시키지 않음.

 

메소드

  • int countTokens() : 전체 토큰 개수
  • boolean hasMoreTokens() : 리턴할 다음 토큰이 있다면 true
  • Object hasMoreElement() : 위의 메소드와 동일하지만, 객체를 리턴함.
  • String nextTokens() : 다음 토큰 반환 후 삭제

 

여러 개의 구분자일 경우

  • 만약에 구분자가 복잡하지 않고, 그냥 개수만 많다면 여러 개를 쓸 수 있다.
    • ex) StringTokenizer st = new StringTokenizer(str, "-."); 
    • 이런 식으로 구분자를 -와. 를 사용할 수 있다,.

 


 

StringBuilder

  • string은 객체이다. 그래서 우리는 string 두 객체를 + 연산을 하게 되면 새로운 string을 생성한다. 그래서 string객체끼리 더하는 것은 메모리 할당을 차지하며, 더 느려진다. 그래서 StringBuilder를 사용한다. 

 

append()

  • 문자열 끝에 추가
  • 이 메소드는 인자의 자료형에 다양하게 오버로딩 되어있다.

 

Insert(int offset, String str)

  • offset 위치에 str에 전달된 문자열 추가

 

delete(int start, int end)

  • start ~ end 이전까지의 내용을 삭제해주는 메소드

 

deleteCharAt(int index)

  • 문자열에서 주어진 index의 문자를 삭제

 

replace(int start, int end, String str)

  • start ~ end 이전까지의 내용을 str 대체

 

reverse()

  • 순서를 뒤바꿈

 

setCharAt(int index, char ch)

  • 문자열에서 주어진 index의 문자를 다른 문자로 대체

 

int length()

  • stringbuilder에 저장되어 있는 데이터 갯수를 리턴

StringBuffer와 StringBuilder 차이점

 

  StringBuffer StringBuilder
동기화 여부 동기화 O 동기화 X
스레드로부터 안정성 동기화되어 안전 동기화 X여서 안전 X
효율성 덜 효율적 보다 효율적

 

 

동기화되어 스레드로부터 안전하다??

  • 동기화되어 스레드로부터 안전하다. 이 말은 두 스레드가 동시에 StringBuffer의 메소드를 호출할 수 없음을 의미한다. 
  • 그래서 StringBuffer는 스레드가 동시에 접근할 수 없기 때문에 StringBuilder보다 덜 효율적이게 된다.

 

왜 StringBuffer는 multi Thread 환경에, StringBuilder는 Single Thread 환경 하에 안전하다고 말할까?

  • StringBuffers는 스레드로부터 안전하다. 그래서 하나의 스레드만 StringBuffer의 메소드에 접근할 수 있다. 따라서 여러 스레드가 동일한 StringBuffer 객체에 동시에 접근하려고 하는 다중 스레드 환경에서 안전하다.
  • StringBuilder는 비동기화 방식으로 저장되기 때문에, 여러 스레드가 동시에 접근하면 데이터 값이 달라질 수 있다. 따라서 하나의 스레드가 동일한 Stringbuilder 객체에 접근하려는 단일 스레드 환경에서 안전하다. 

 

String의 equals와 StringBuilder의 equlas는 같을까 다를까?

 

StringBuilder sb1 = new StringBuilder("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb1.equals(sb2)); //false

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); //true

 

구글링을 해보면 ==와 eqauls의 차이는 주소값을 비교하느냐, 해당 객체 안의 값을 비교하느냐로 나뉘게 된다. 

그렇다면 StringBuilder의 값을 비교하는 sb1.equals(sb2)는 왜 true가 나오지 않고 false가 나오는 걸까?

StringBuilder의 equals는 동일성을 비교하기 때문이다. 여기서 동일성이란 주소값을 비교한다. 따라서 sb1과 sb2가 가리키는 주소값은 다르기 때문에 false가 출력이 된다. 여기서 만약에 equals를 오버라이딩 해준다면 true로 출력할 수 있다.

 

 

728x90
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그