최근 Tomcat7 에서 다음과 같이 코드를 바꾸었다.
성능은 오히려 System.arraycopy()가 좋은데, Arrays.copyOf를 쓰는 걸까 하는 생각이 들었다.
(참고 : http://www.javapractices.com/topic/TopicAction.do?Id=3)


-        System.arraycopy(applicationEventListenersObjects, 0,
-                newListeners, 0, len);
+        Object[] newListeners = Arrays.copyOf(applicationEventListenersObjects,
+                len + 1);


왜 바꾸었나 API를 확인 해보니..
static
<T> T[]
copyOf(T[] original, int newLength) 
          Copies the specified array, truncating or padding with nulls (if necessary) so the copy has the specified length.
static
<T,U> T[]
copyOf(U[] original, int newLength, Class<? extends T[]> newType) 
          Copies the specified array, truncating or padding with nulls (if necessary) so the copy has the specified length


jdk5의 시절에는 아래와 같이 java generic를 이용하여 Array 에 대한 type별로 copy되는  array를 구하려는 메소드를 다음과 같이 만들었는데..

@SuppressWarnings("unchecked")
private final <T> T[] copy(T[] source) {
   Class type = source.getClass().getComponentType();
   T[] target = (T[])Array.newInstance(type, source.length);
   System.arraycopy(source, 0, target, 0, source.length);
   return target;
}


JDK6부터는 Arrays.copyOf가 위의 메소드를 대신 하게 되었다. 
톰캣 정신은 코드 유지보수성과 세련미가 우선이지. 민감한 성능차이는 아닌듯 싶다..


Posted by '김용환'
,