나는 C 문자열 abc
가 내부적으로 C에서 abc\0
이된다는 것을 알고있다. 자바와 같은 경우인가?Java에서 문자열이 내부적으로 어떻게 표현됩니까?
답변
아니요, C 문자열은 문자 배열이므로 관련 길이가 없습니다. 이 결정의 부작용은 문자열의 길이를 결정할 때 길이를 운반하는 것이 효율적이지 않은 \0
을 찾기 위해 문자열의 길이를 반복해야한다는 것입니다.
Java 문자열은 char에 대한 char 배열을 가지며 오프셋 길이와 문자열 길이를 전달합니다. 이것은 문자열의 길이를 결정하는 것이 오히려 효율적이라는 것을 의미합니다.
C 언어의 문자열은 char 형식의 배열이며 Java에서는 클래스와 마찬가지로 unicode chars의 컬렉션을 나타냅니다.
아니요, Java에서는 같지 않습니다. null 종결자는 없습니다. Java 문자열은 문자 배열을 가리키는 것이 아니라 객체입니다. 유니 코드 문자와 함께 길이를 유지하므로 널 종결자를 찾을 필요가 없습니다.
여기에 묻지 않아도됩니다. JDK와 함께 제공되는 src.zip의 String.java 소스를 확인하십시오. 여기에 그 시작이 있습니다 :
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
}
+1 소스가 결코 거짓이 아님 – alex
'value []'에 대해 UTF-16이 사용되었습니다 (또는 매우 약간 변형되었습니다). 모든 유니 코드 문자가 단일'char'에 채워질 수있는 것은 아닙니다. –
또한, 단지 'value []'(그리고'length') *이 있기 때문에 추가 null-terminator가 없다는 것을 의미하지 않습니다. (괜찮습니다. 표준 JVM에는 없습니다.) 예를 들어 [BCL - 일명 .NET/C# -에는 * both *] (http://stackoverflow.com/questions/6293457/why-are-c-net-strings-length-prefixed-and-null)이 있습니다. -terminated), 종료 코드는 관리 코드에 직접 노출되지 않습니다. (다른 한편, 이것 때문에 BCL은 Java에서'String.substring'처럼 한 문자열의 "보기"를 만들 수 없습니다. –
아니요. Null 종결자는 포인터와 크기를 전달하는 것보다 쉽기 때문에 C에서 사용됩니다. Java에서는 크기가 항상 알려져 있으므로 널 종결자가 필요하지 않습니다. 또한 Java에는 종료 문자가 없습니다 (\0
을 넣는 것은 리터럴 문자열의 일부가됩니다).
Java 문자열은 C 문자열과 같이 Null로 끝나지 않습니다. Java는 문자열의 길이를 저장하기 때문입니다. String.length()
으로 길이를 검색 할 수 있습니다.
클래스 String
은 Java로 구현됩니다. 예를 들어 OpenJDK의 implementation을 참조하십시오.
String
클래스는 문자열 자체를 보유하는 형태
char[]
의 배열뿐만 아니라 운반
오픈 JDK AN, 문자열의 길이와 문자열의 해시 코드합니다 (char[]
에서 처음 사용 된 위치를 알려주) 오프셋 .
또한 직렬화를위한 버전 ID와 직렬화 출력 스트림 (적어도 OpenJDK 7의 경우)과 관련하여 특별한 대소 문자로 인한 ObjectStreamField[]
이 있습니다.
'ObjectStreamField [] serialPersistentFields' 필드는'static'입니다. 'String'은 하나를 "포함하지"않습니다. 'serialVersionUID' 필드와 같습니다. 사실,'String' 인스턴스는 4 개의 필드를 가지고 있습니다. –
당신 말이 맞아요. 필자는보다 구체적인 답변을 만들었습니다. –
필자는 JDK7 이전에 오프셋 필드가 포기 된 것으로 생각했습니다. 아마도 백만 개가 넘는 문자열이 백만 자릿수 (10,3) 인 경우 구현자가 수백만 자의 백킹 스토어에 대한 참조를 가질 수 있음을 알았 기 때문일 수 있습니다. 매우 낭비가된다. IMHO, 그들은 이전 버전의 절반 이하를 사용할 때 새로운 백업 스토어를 만들려면 substr을 디자인해야하지만 그렇지 않은 경우 이전 버전으로 오프셋을 가져와야합니다. 이는 최악의 경우 메모리 사용을 최적의 2 배로 제한하면서 일반적으로 유용한 사용 패턴을 용이하게합니다. – supercat
내가 아는 한, Java String은 Object의 하위 클래스 인 힙 섹션에 객체로 저장됩니다. 문자 또는 문자열 만 지정하려면 '\ 0'을 사용할 필요가 없습니다.
- 1. LinkedList는 Java에서 내부적으로 어떻게 작동합니까?
- 2. NSNumber는 디스크에서 어떻게 표현됩니까?
- 3. 내부적으로
- 4. 실수는 어떻게 이진 형식으로 표현됩니까?
- 5. HoG 기능은 그래픽으로 어떻게 표현됩니까?
- 6. 일반 - 함수는 메모리에서 어떻게 표현됩니까?
- 7. Bash - 문자열이 다른 것보다 '큰'경우 테스트 - 어떻게 내부적으로 작동합니까?
- 8. 문자열이 Java에서 잘림니다.
- 9. lw는 C 또는 C++에서 어떻게 표현됩니까?
- 10. 트리의 형제 간의 친밀도가 어떻게 표현됩니까?
- 11. C# P/Invoke에서 Win32 유형은 어떻게 표현됩니까?
- 12. stringstream은 어떻게 내부적으로 작동합니까?
- 13. typedef는 내부적으로 어떻게 작동합니까?
- 14. LINQ는 내부적으로 어떻게 작동합니까?
- 15. (,) 내부적으로 어떻게 정의되어 있습니까?
- 16. 데이터베이스가 내부적으로 어떻게 작동합니까?
- 17. 근검은 어떻게 내부적으로 작동합니까?
- 18. Firebug는 내부적으로 어떻게 작동합니까?
- 19. Viewstate는 내부적으로 어떻게 작동합니까?
- 20. 프로토콜은 내부적으로 어떻게 구현됩니까?
- 21. \ 0이있는 문자열이 Java에서 이상하게 동작합니다.
- 22. Signalr : PersistentConnection에서 메시지를받는 것이 내부적으로 어떻게 작동합니까?
- 23. CreateMutex()는 내부적으로 어떻게 작동합니까?
- 24. CSS의 백분율 : 내부적으로 어떻게 계산됩니까?
- 25. HibernateTemplate은 내부적으로 어떻게 작동 하는가?
- 26. joomla breadcrumbs는 어떻게 내부적으로 작동합니까?
- 27. SQLite 커서는 내부적으로 어떻게 작동합니까?
- 28. 루비는 내부적으로 문자열을 어떻게 표현합니까?
- 29. "is"연산자는 내부적으로 어떻게 작동합니까?
- 30. ASP.NET 라우팅은 어떻게 내부적으로 작동합니까?
어 ... "의자"? – buruzaemon
@buruzaemon : 숯불조차도 앉을만한 자격이 있다는 것을 알지? – alex
+1'char's에 대한 인간적인 견해와 잠시 휴식 할 수있는 곳, @alex – buruzaemon