2011-12-16 6 views

답변

7

아니요, C 문자열은 문자 배열이므로 관련 길이가 없습니다. 이 결정의 부작용은 문자열의 길이를 결정할 때 길이를 운반하는 것이 효율적이지 않은 \0을 찾기 위해 문자열의 길이를 반복해야한다는 것입니다.

Java 문자열은 char에 대한 char 배열을 가지며 오프셋 길이와 문자열 길이를 전달합니다. 이것은 문자열의 길이를 결정하는 것이 오히려 효율적이라는 것을 의미합니다.

Source.

+2

어 ... "의자"? – buruzaemon

+4

@buruzaemon : 숯불조차도 앉을만한 자격이 있다는 것을 알지? – alex

+1

+1'char's에 대한 인간적인 견해와 잠시 휴식 할 수있는 곳, @alex – buruzaemon

2

C 언어의 문자열은 char 형식의 배열이며 Java에서는 클래스와 마찬가지로 unicode chars의 컬렉션을 나타냅니다.

10

아니요, 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; 
} 
+0

+1 소스가 결코 거짓이 아님 – alex

+0

'value []'에 대해 UTF-16이 사용되었습니다 (또는 매우 약간 변형되었습니다). 모든 유니 코드 문자가 단일'char'에 채워질 수있는 것은 아닙니다. –

+0

또한, 단지 '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'처럼 한 문자열의 "보기"를 만들 수 없습니다. –

2

아니요. Null 종결자는 포인터와 크기를 전달하는 것보다 쉽기 때문에 C에서 사용됩니다. Java에서는 크기가 항상 알려져 있으므로 널 종결자가 필요하지 않습니다. 또한 Java에는 종료 문자가 없습니다 (\0을 넣는 것은 리터럴 문자열의 일부가됩니다).

2

Java 문자열은 C 문자열과 같이 Null로 끝나지 않습니다. Java는 문자열의 길이를 저장하기 때문입니다. String.length()으로 길이를 검색 할 수 있습니다.

1

클래스 String은 Java로 구현됩니다. 예를 들어 OpenJDK의 implementation을 참조하십시오.

7 개 String 클래스는 문자열 자체를 보유하는 형태 char[]의 배열뿐만 아니라 운반

오픈 JDK AN, 문자열의 길이와 문자열의 해시 코드합니다 (char[]에서 처음 사용 된 위치를 알려주) 오프셋 .

또한 직렬화를위한 버전 ID와 직렬화 출력 스트림 (적어도 OpenJDK 7의 경우)과 관련하여 특별한 대소 문자로 인한 ObjectStreamField[]이 있습니다.

+0

'ObjectStreamField [] serialPersistentFields' 필드는'static'입니다. 'String'은 하나를 "포함하지"않습니다. 'serialVersionUID' 필드와 같습니다. 사실,'String' 인스턴스는 4 개의 필드를 가지고 있습니다. –

+0

당신 말이 맞아요. 필자는보다 구체적인 답변을 만들었습니다. –

+0

필자는 JDK7 이전에 오프셋 필드가 포기 된 것으로 생각했습니다. 아마도 백만 개가 넘는 문자열이 백만 자릿수 (10,3) 인 경우 구현자가 수백만 자의 백킹 스토어에 대한 참조를 가질 수 있음을 알았 기 때문일 수 있습니다. 매우 낭비가된다. IMHO, 그들은 이전 버전의 절반 이하를 사용할 때 새로운 백업 스토어를 만들려면 substr을 디자인해야하지만 그렇지 않은 경우 이전 버전으로 오프셋을 가져와야합니다. 이는 최악의 경우 메모리 사용을 최적의 2 배로 제한하면서 일반적으로 유용한 사용 패턴을 용이하게합니다. – supercat

0

내가 아는 한, Java String은 Object의 하위 클래스 인 힙 섹션에 객체로 저장됩니다. 문자 또는 문자열 만 지정하려면 '\ 0'을 사용할 필요가 없습니다.

관련 문제