2013-08-12 4 views
2

Java의 arrayList는 실제 객체 데이터가 아니라 객체에 대한 참조를 "보유"합니다. 우리가 직접 참조 대신 Object 데이터를 포함 할 수 있습니다 자바의 ArrayList를 구현할 수있는 경우Java에서 C++ 스타일 목록을 구현할 수 있습니까?

궁금 해서요. Java Unsafe Class를이 구현에 사용할 수 있습니까? 그렇다면 기존 Java ArrayList와 비교하여이 목록의 성능은 어떻게됩니까?

+5

이것은 어떤 이점이 있습니까? CPU 캐시 지역성이 최상입니까? –

+0

예 CPU 지역 및 아마도 내가 모르는 뭔가가있을 수 있습니다. 이것이 내가 묻는 이유입니다. – karakalos10

+2

자바에 C++ 목록을 항상 JNI 할 수 있습니다. 이것은 당신의 접근 방식보다 낫지 만, 당신의 어플리케이션이 대부분 Java라면 이점이 거의 보이지 않을 것입니다. –

답변

3

간략하게, 아니오.

Java는 객체에 대한 참조와 함께 작동합니다. 당신이 설명하는 것은 당신이 'n'엔트리를위한 메모리 블록을 할당 할 수 있도록 메모리 할당/사용에 대한 저수준 제어에 의존한다. Java는 단순히 작동하지 않습니다. 메모리를 제어 할 수 없으며 JVM은 메모리 내에서 객체를 자유롭게 이동할 수 있습니다. 을 참조하십시오. 또한 참조를 포함하는 객체가 상기 별개의 메모리 블록 등 오브젝트의 개념은 하나 개의 연속적인 메모리 블록에 포함되는 것으로 참조

참고 실제로 현재 존재하지 않는다. 당신이 정말로 메모리의 지원 바이트 배열을 원하는 경우에

DirectByteBuffer 사용 될 수있다. 클래스는 sun.misc.Unsafe 클래스를 사용하여 작성되었습니다. 아마도 객체를 직렬화/역 직렬화 할 수 있습니다 (색인 생성을 올바르게 결정하기 위해 크기를주의 깊게 계산). 그러나 직렬화 비용이 다른 절약을 막을 것입니다.

+0

자바 안전하지 않은 클래스를 사용하여 자바. – karakalos10

+0

@ 브라이언 : 당신은 맞습니다. 그리고 비슷한 말을하려고합니다. http://mishadoff.github.io/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/ 이 구현하는 데 사용 무엇인가, 그때 나는 sun.misc.Unsafe을 보았다 NIO 버퍼와 같은 저수준의 것들. _ 이론적으로 이걸로 C++ 스타일 목록을 만들 수는 있을지도 모르겠지만 느리고 매우 복잡하게 얽힌 해킹 일 가능성이 큽니다. 그리고 예수 라모스 (Ramos)가 말했듯이, 정말로 그럴만한 사례는 없습니다. –

+0

하지만 왜 이렇게 느릴까요? Java의 메모리 부족 작업은 JVM에서 내부 메모리로 처리하므로 즉시 어셈블리 코드로 변환됩니다. – karakalos10