2014-12-24 4 views
0

알려진 바와 같이 String은 Java에서 불변입니다.사용법 StringBuffer 및 String?

Partner partner = context.getComponent(ComponentNames.PARTNER_COMPONENT_NAME); 
String lastAccesDate = partner.getLastAccessDate(); 
if(lastAccesDate == null) { 
    return ""; 
} 
lastAccesDate = new SimpleDateFormat(DATE_PATTERN).format(); //1 
return lastAccesDate; 

것은 때문에, 새로운 String 객체가 그래서 실제로 나는 두 개의 문자열 개체를해야합니다, //1에서 생성됩니다 문자열 불변이며, 첫 번째는 partner.getLastAccessDate();이 포함되어 나는 String를 돌려 다음과 같은 방법의 몸이 , 두 번째 것은 new SimpleDateFormat(DATE_PATTERN).format();입니다. 오버 헤드가 좋지 않습니다. 어떻게 피할 수 있습니까?

+0

String 대신 StringBuilder를 사용합니다. –

+0

@Sharpedge StringBuffer를 사용하지 않는 이유는 무엇입니까? 하나는 변경 가능하므로 포함 된 문자열을 수정할 수 있습니다. –

+0

from java docs ** "모든 문자열 버퍼에는 용량이 있습니다. 문자열 버퍼에 포함 된 문자 시퀀스의 길이가 용량을 초과하지 않는 한 새로운 내부 버퍼 배열을 할당 할 필요가 없습니다. 내부 버퍼 오버 플로우되면 (자), 자동적으로 커집니다. 릴리스 JDK 5에서는,이 클래스에는 단일 thread의 StringBuilder 용으로 설계된 동등한 클래스가 추가되었습니다.이 클래스보다 우선적으로 StringBuilder 클래스를 사용합니다. 동기화를 수행하지 않기 때문에 더 빠릅니다. "** –

답변

1

멀티 스레딩의 경우 사용 StringBuffer 당신이 String 객체 lastAccessDate에 두 번째 문자열을 할당 할 때, 그렇지 않으면 볼 StringBuilder

+0

이 메서드는 웹 응용 프로그램에서 가져온 것입니다. 그래서 StringBuffer를 사용합니까? –

+0

@ St.Antario 그것은'public void foo() {StringBuilder sb = // ....}'와 같은 메소드 내부에서 객체를 생성하는 경우에 따라 달라집니다. 그러면 객체가 될 것이기 때문에'StringBuilder'가 선택됩니다 스택에 생성되고 모든 쓰레드는 아무런 문제가 없다. 하지만 메서드 밖에서 객체를 선언해야한다면 StringBuffer가 필요합니다. – sol4me

0

를 사용 (즉, 당신이 캐릭터의 스레드 안전, 가변 순서를 필요로하는 경우), 더 오버 헤드가 없다 automaticaly 가비지 컬렉터는 어떤 객체도 동일한 참조를 가지지 않기 때문에 첫 번째 객체가 차지하는 공간을 확보 할 수 있습니다. 오버 헤드를 걱정할 필요가 없습니다.

+0

피할 수 있다면 모든 것이 "오버 헤드"가 될 수 있습니다 ... – slowy