ecsimsw

자바는 문자열의 끝을 표시하지 않는다. 본문

자바는 문자열의 끝을 표시하지 않는다.

JinHwan Kim 2020. 4. 13. 02:17

자바는 문자열의 끝을 표시하지 않는다.

C나 C++은 문자열의 끝을 \0로 하여 끝을 표시하였지만, 자바는 길이를 따로 저장해 두는 방식으로 끝을 안다.

 

문자열 클래스 파일 따라가기

String.length()가 궁금해서 따라가보았다. 심심해서...

String.java와 StringCoding.java을 그냥 궁금한 부분만 검색해가면서 의식의 흐름 기법으로 정리 

 

char[] chars = new char[]{'d','e','s'};
String s2 = new String(chars);
System.out.println(s2.length());
public int length() {
    return value.length >> coder();
}
private final byte[] value;

byte coder() {
    return COMPACT_STRINGS ? coder : UTF16;
}

 

** Q) COMPACT_STRINGS는 final boolean이면 무조건 true아닌가,,,? 왜 COMPACT_STRINGS ? coder : UTF16; 이런 코드를 쓰지???

 

static final boolean COMPACT_STRINGS;

static {
  COMPACT_STRINGS = true;
}
public String(char value[]) {
    this(value, 0, value.length, null);
 }
 String(char[] value, int off, int len, Void sig) {
    if (len == 0) {
        this.value = "".value;
        this.coder = "".coder;
        return;
    }
    if (COMPACT_STRINGS) {
        byte[] val = StringUTF16.compress(value, off, len);
        if (val != null) {
            this.value = val;
            this.coder = LATIN1;
            return;
        }
    }
    this.coder = UTF16;
    this.value = StringUTF16.toBytes(value, off, len);
  }
 

 

** Q) Void sig를 왜 쓰지?? 어떤 역할을 하는지 모르겠다.

  @Native static final byte UTF16  = 1;
    public static byte[] compress(char[] val, int off, int len) {
        byte[] ret = new byte[len];
        if (compress(val, off, ret, 0, len) == len) {
            return ret;
        }
        return null;
    }
    public static int compress(char[] src, int srcOff, byte[] dst, int dstOff, int len) {
        for (int i = 0; i < len; i++) {
            char c = src[srcOff];
            if (c > 0xFF) {
                len = 0;
                break;
            }
            dst[dstOff] = (byte)c;
            srcOff++;
            dstOff++;
        }
        return len;
    }
public static byte[] toBytes(char[] value, int off, int len) {
     byte[] val = newBytesFor(len);
     for (int i = 0; i < len; i++) {
         putChar(val, i, value[off]);
         off++;
     }
     return val;
 }

 

Comments