새로운 블로그로 이전하였습니다!

 

String literal = “”; / String object = new String ( “” );

  • String literal = “”; : Java Heap메모리의 String Pool 객체 안에 선언된다.
  • String의 inern() 메서드가 호출되는 방식
  • String str = new String(“”); Java Heap메모리에 새로운 객체가 선언된다.

문자열 선언 성능 비교

  • String str = “hello”; 1회당 로직 수행 시간 : 0.849856ns
  • String str = new String(“hello”); 1회당 로직 수행 시간 : 0.8495613ns

*서로 성능은 동일하다.

“Hello” 라는 문자열을 2개 선언했지만 JVM Heap 메모리의 String Pool 에는 하나만 존재한다.

두 변수는 reference로 가르키게 된다.

new String(“Hello”);

new 키워드는 heap에 객체를 생성하게 된다.

 

  • 보통 String Pool을 이용하는 방식을 사용한다.
  • 한번 쓰이고 버려지는 문자열일 경우 객체로 선언하여 GC의 대상이 되도록 할 때 사용을 고려해볼 수 있다.

*문자열을 붙이는 방법

‘+’ 연산자

  • jdk1.5 이전에는 문자열을 추가할 때 마다 새로 생성해서 등록해서 속도가 느렸지만 이후에는 StringBuilder로 변환해서 처리하는 것으로 변경되었다.

StringBuilder

  • .append를 통해서 값을 변경할 수 있다. 기존 객체를 수정하는 방식으로 메모리에 할당하는 과정 없이 수정이 가능하여 빠르다는 장점이 있다.
  • 반복문 안에서 문자열을 계속 추가해야하는 경우 사용하는 것이 좋다.

StringBuffer

  • StringBuilder와 사용법은 동일하며 차이점은 thread-safe를 보장하여 이 객체에 동시에 접근했을 때, 동시성을 제어해주는 기능이 존재한다.
  • 멀티스레드를 이용하여 하나의 문자열을 수정해야할 경우 사용한다.
  • 한번 사용하고 버려지면서 동시접근 시 데이터 무결성이 중요한 문자열의 경우 사용하기 용이하다. ex) SQL문

*문자열 삽입 속도 측정

테스트 방식 : "a" 글자 1회 붙임

  • String : 247.4ns
  • StringBuilder : 45.3ns
  • StringBuffer : 56.4ns

* 대량 삽입("a" 글자 20회 붙임 * 100만회) 속도 측정

  • String : 300,938,900ns
  • StringBuilder : 130,211,000ns
  • StringBuffer : 353,035,600ns

str1.equals(str2);

  • str2를 Object 매개변수로 받은 후 str1과 비교 연산자(주소 값 비교) 수행
  • str2가 String을 상속받고 있다면 str2를 String으로 형 변환 후 길이 비교, char 배열로 나누어서 비교연산자 수행

 

str1 == str2;

  • str1 과 str2 의 주소 값을 비교하는 방식
  • literal == object; : false || obj1 == obj2; : false

*thread-safe

  • 하나의 함수를 여러 Thread가 호출하더라도 함수 실행이 바르게 진행되는 것
  • 하나의 자원을 여러 쓰레드가 참조하게 되면 동시성 문제가 발생된다.

하나의 자원(클래스)를 여러 쓰레드가 참조했을 때 결과값이 다르게 나오는 이유

멀티 쓰레드에서의 동시성 문제

  • 연산 로직이 동시에 이루어지면 쓰레드의 실행 순서가 불명확하므로 서로 다른 결과를 만들어낼 수 있다
  • ex) A = 100 변수에 1을 더하는 쓰레드 T1, T2가 동시에 접근했을 때 T1이 100을 조회하고 101을 저장하기 전에 T2가 100을 조회해서 1을 더하면 마지막 값은 101이 남게 되는 오류가 발생된다.

 

'Back-End > Java & Spring' 카테고리의 다른 글

[JAVA] JVM 메모리 구조와 라이프 사이클  (0) 2022.08.02
[JAVA] Java Framework 종류  (0) 2022.08.02
[JAVA] Collection Framework 정의/성능 비교  (0) 2022.08.02
[JAVA] int / Integer 차이  (0) 2022.08.02
[JAVA] DBMS Driver  (0) 2022.08.02
복사했습니다!