를 반복 건의 할 것입니다. 특히, 내부적으로는 StringBuffer (URLDecoder의 경우 불필요하게 동기화를 도입 함)에 의존합니다. Apache commons는 URLCodec을 제공하지만 성능과 관련하여 유사한 문제가있는 것으로보고되었지만 가장 최신 버전에서는 여전히 그 사실을 확인하지 않았습니다.
Mark A. Ziesemer은 URLDecoder를 사용하여 문제와 성능에 관한 게시물을 잠시 후 작성했습니다. 그는 몇몇 버그 리포트를 기록하고 완전한 대체물을 작성했습니다. 이 SO이기 때문에, 여기 몇 가지 주요 발췌 인용 것입니다,하지만 당신은 정말 여기에 전체 소스 문서를 읽어야 http://blogger.ziesemer.com/2009/05/improving-url-coder-performance-java.html
선정 따옴표 :
자바 자바에서이 기능의 기본 구현을 제공합니다 .net.URLEncoder 및 java.net.URLDecoder. 불행히도, 구현 내에서 API가 작성된 방법과 세부 정보로 인해 가장 좋은 수행 결과는 이 아닙니다. URLEncoder와 관련하여 성능 관련버그가 sun.com에 접수되었습니다.
대안이 있습니다 : org.apache.commons.codec.net.URLCodec from Apache Commons Codec. (Commons Codec은 또한 Base64 인코딩에 유용한 구현을 제공합니다.) 불행히도 Commons의 URLCodec 은 Java의 URLEncoder/URLDecoder와 동일한 문제를 겪고 있습니다.
...모두 JDK 및 가공에 대한
권장 사항 :
구성 할 때 "버퍼"클래스의, 예를 들어, ByteArrayOutputStream, CharArrayWriter, StringBuilder 또는 StringBuffer, 예상 용량을 예상하고 전달합니다. JDK의 URLEncoder는 현재 StringBuffer에 대해이 작업을 수행하지만 CharArrayWriter 인스턴스에 대해서도 this를 수행해야합니다. Common의 URLCodec 은 ByteArrayOutputStream 인스턴스에 대해이 작업을 수행해야합니다. 클래스의 ' 기본 버퍼 크기가 너무 작은 경우 을 새롭고 더 큰 버퍼로 복사하여 크기를 조정해야 할 수 있습니다. 이는 "값싼"작업이 아닙니다. 클래스의 기본 버퍼 크기가 너무 큰 경우 메모리가 불필요하게 낭비 될 수 있습니다.
모두 구현이 캐릭터 세트에 의존하고 있지만 자신의 문자열 이름으로 그들을 동의합니다. Charset은 이름 검색을 위해 간단하고 작은 캐시를 제공합니다. 사용 된 마지막 2 개의 Charsets 만 저장합니다. 이것은 에 의존해서는 안되며, 둘 다 다른 상호 운용성 이유로 Charset 인스턴스를 받아 들여야합니다.
두 구현은 고정 크기 입력 및 출력 만 처리합니다. JDK의 URLEncoder는 String 인스턴스에서만 작동합니다. Commons의 URLCodec 도 Strings를 기반으로하지만 byte [] 배열에서도 작동합니다. 이는 더 큰 또는 가변 길이 입력의 효율적인 처리 을 본질적으로 방해하는 설계 수준 제약 조건 인 입니다. 대신, CharSequence, Appendable 및 java.nio의 Buffer ByteBuffer 및 CharBuffer 구현과 같은 "스트림 지원" 인터페이스를 지원해야합니다.
...
com.ziesemer.utils.urlCodec가 최대한 빨리 JDK URLEncoder로 3 배 이상주의, 이상 1.5 배 빠른 JDK URLDecoder있다. 합니다 (JDK의 URLDecoder 빠르게 URLEncoder에 비해, 그래서 개선을위한 많은 여지가 없었다.)
내가 당신의 동료가 URLDECODE는 스레드로부터 안전하지 않습니다 제안 할 잘못된 생각합니다. 여기에 대한 다른 해답이 자세하게 설명되어 있습니다.
EDIT [2012-07-03] - 당신이 더 많은 아이디어 여부를 찾고 있다면
확실하지 OP에 의해 게시 후 주석 당? 목록에서 원자 집합으로 작업하려는 경우 메서드 외부의 참조를 포함하여 목록에 대한 모든 액세스를 동기화해야합니다. 그러나 반환 된 목록의 내용이 잠재적으로 다음 원래 목록이 같은 것을 볼 수 있었다 다른 스레드에 의해 수정 될 수있는 컬렉션에서 문자열 "배치"에 운영에 대한 무력 접근 방식에서 각기 다른 괜찮 경우 :
/**
* @param origList will be copied by this method so that origList can continue
* to be read/write by other threads.
* @return list containing decoded strings for each entry that was
in origList at time of copy.
*/
public List<String> decodeListOfStringSafely(List<String> origList)
throws UnsupportedEncodingException {
List<String> snapshotList = new ArrayList<String>(origList);
List<String> newList = new ArrayList<String>();
for (String urlStr : snapshotList) {
String decodedUrlStr = URLDecoder.decode(urlStr, "UTF8");
newList.add(decodedUrlStr);
}
return newList;
}
그다지 도움이되지 않는다면, 나는 아직도 당신이 무엇인지 확신 할 수 없으므로 새롭고보다 간결한 질문을 만드는 것이 더 나을 것입니다. 그것이 당신이 묻고있는 것이라면, 여러 가지 이유로 컨텍스트에서 벗어난 예제가 좋은 아이디어가 아니므로 조심하십시오.
정적 메서드가 URLDecoder 클래스의 정적 변수에 의존하지 않는 한 각 메서드 호출은 스택에서 별도로 진행되며 스레드로부터 안전합니다. URLDecoder.decode (...)가 공유 리소스에 액세스해야하는 이유가 없습니다. – Thomas