π String (2) - λ΄μ₯ ν¨μ
μλ νμΈμ, μ§λ μκ°μλ String - λ¬Έμμ΄ μμ± κ΄λ ¨ν΄μ μ΄ν΄λ³΄μλλ°μ, μ΄λ²μλ String ν΄λμ€μ μ‘΄μ¬νλ λ©μλλ€ μ€ μΌλΆ λ©μλλ€μ λν΄ λ΄λΆ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
(μμ μ½λλ κΉνλΈμμ νμΈνμ€ μ μμΌλ©°, λ²μ μ Java 11μ μ¬μ©νμ΅λλ€.)
String ν΄λμ€ λ΄μ λ©μλλ€μ μ μ¬μ§μ²λΌ κ΅μ₯ν λ§μ΄ μ‘΄μ¬νλλ°μ, κ°μΈμ μΌλ‘ μμ£Ό μ¬μ©νλ λ©μλλ€μ λν΄ μ λ¦¬ν΄ λ³΄κ² μ΅λλ€.
· String.length()
@Stable
private final byte[] value;
...
static final boolean COMPACT_STRINGS;
static {
COMPACT_STRINGS = true;
}
...
public int length() {
return value.length >> coder();
}
byte coder() {
return COMPACT_STRINGS ? coder : UTF16;
}
String ν΄λμ€μ length() λ©μλλ coder() λ©μλμ κ²°κ΄κ°μ λν΄ μννΈ μ°μ°μ μ μ©ν©λλ€.
coder() λ©μλλ COMPACT_STRINGS κ°μ΄ trueμ΄λ―λ‘(μ΅μ΄ static λΈλ‘μ trueλ‘ μ€μ ) coderλ₯Ό 리ν΄νκ³ , κ°μ 0μ λλ€.
κ²°κ΅μ value.lengthμ κ°μ 리ν΄νλλ°μ, valueλ byte λ°°μ΄ νμ μΌλ‘ λ¬Έμμ΄μ κ° λ¬Έμλ₯Ό μμ€ν€μ½λμ νμ λ°λΌ 10μ§μμ κ°μΌλ‘ λμ½λ©νμ¬ λ°°μ΄μ μ μ₯μ ν©λλ€.
· String.isEmpty()
public boolean isEmpty() {
return value.length == 0;
}
isEmpty() λ©μλλ λ¨μν byte λ°°μ΄μΈ valueμ lengthκ° 0μΈμ§ μλμ§λ₯Ό λΉκ΅ν©λλ€.
· String.charAt(int index)
public char charAt(int index) {
if (isLatin1()) {
return StringLatin1.charAt(value, index);
} else {
return StringUTF16.charAt(value, index);
}
}
final class StringLatin1 {
public static char charAt(byte[] value, int index) {
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return (char)(value[index] & 0xff);
}
charAt() λ©μλλ StringLatin1 νΉμ StringUTF16 ν΄λμ€μ charAt(byte[] value, int index) λ©μλλ₯Ό νΈμΆν©λλ€.
(μλμμ μ΄ν΄λ³Ό λλΆλΆμ λ©μλλ€λ Latin1 νΉμ UTF16μ λ°λΌ μ½λλ€μ΄ λ€λ₯Έλ° μλλ μ λΆ Latin1 κΈ°μ€ μ½λμ λλ€.)
λ΄λΆ μ μΌλ‘λ StringLatin1 ν΄λμ€κ° νΈμΆμ΄ λκ³ , indexμ μ ν¨μ± κ²μ¦μ ν ν 16μ§μμΈ 0xffμ and μ°μ°(&)μ κ²°κ΄κ°μ 리ν΄ν©λλ€.
(0xffμ & μ°μ°μ λΆνΈ λλ¬Έμ μ¬μ©μ νλλ°, μμΈν 건 ν¬μ€ν
μ μ°Έκ³ ν΄ μ£ΌμΈμ :)
private static void printByte() {
System.out.println((byte) 127); // 127
System.out.println((byte) 128); // -128
System.out.println((byte) 255); // -1
System.out.println((byte) 257); // 1
System.out.println((byte) 128 & 0xff); // 128
System.out.println((byte) 255 & 0xff); // 255
}
· String.compareTo(String anotherString)
public int compareTo(String anotherString) {
byte v1[] = value;
byte v2[] = anotherString.value;
if (coder() == anotherString.coder()) {
return isLatin1() ? StringLatin1.compareTo(v1, v2)
: StringUTF16.compareTo(v1, v2);
}
return isLatin1() ? StringLatin1.compareToUTF16(v1, v2)
: StringUTF16.compareToLatin1(v1, v2);
}
// StringLatin1.java
@HotSpotIntrinsicCandidate
public static int compareTo(byte[] value, byte[] other) {
int len1 = value.length;
int len2 = other.length;
return compareTo(value, other, len1, len2);
}
public static int compareTo(byte[] value, byte[] other, int len1, int len2) {
int lim = Math.min(len1, len2);
for (int k = 0; k < lim; k++) {
if (value[k] != other[k]) {
return getChar(value, k) - getChar(other, k);
}
}
return len1 - len2;
}
compareTo() λ©μλμ κ²½μ° λ¬Έμμ΄ μνμ λ°λΌ κ²°κ΄κ°μ΄ λ¬λΌμ§λλ°μ, λΉκ΅ν λ λ¬Έμμ΄μ κΈΈμ΄μ λ¬Έμμ λ°μ΄νΈ κ° λ±μ λΉκ΅ν©λλ€.
λ λ¬Έμμ΄μ λ°μ΄νΈ κ°μ λΉκ΅νλ©΄μ λ°μ΄νΈκ° λ€λ₯΄λ€λ©΄, λ λ°μ΄νΈμ μ°¨μ΄ κ°μ 리ν΄ν©λλ€.
μλ₯Ό λ€μ΄ μλμ μ½λμμλ λ λ²μ§Έ λ¬ΈμμΈ r, 1 μ΄ λ€λ₯΄λ―λ‘ λ λ°μ΄νΈ κ°μ μ°¨μ΄μΈ 65λ₯Ό 리ν΄ν©λλ€.
(1μ μμ€ν€μ½λλ 49, rμ μμ€ν€μ½λλ 114 μ λλ€.)
String str1 = "original";
String str2 = "o1r2iginal";
return str1.compareTo(str2);
μλμ μΌμ΄μ€λ λ λ¬Έμμ΄μ΄ λͺ¨λ λμΌνκΈ° λλ¬Έμ λ λ¬Έμμ΄μ κΈΈμ΄ μ°¨μΈ 0μ 리ν΄ν©λλ€.
String str1 = "original";
String str2 = "original";
return str1.compareTo(str2);
μλλ originalκΉμ§λ λͺ¨λ λ¬Έμκ° λμΌνκΈ° λλ¬Έμ, λ λ¬Έμμ΄μ κΈΈμ΄ μ°¨μΈ -4λ₯Ό 리ν΄ν©λλ€.
(str1μ΄ κΈ°μ€μ΄κΈ°μ κΈΈμ΄ μ°¨μ΄κ° μμμ λλ€.)
String str1 = "original";
String str2 = "original1234";
return str1.compareTo(str2);
· String.startsWith(String prefix, int toffset)
toffset λΆν° μμν΄μ prefixμ λ¬Έμμ΄μ΄ λμΌνμ§λ₯Ό λΉκ΅ν©λλ€.
μμμ toλ μμ μ§μ μ λνλ΄λ μΈλ±μ€μ΄κ³ , ν΅μ¬μ while λ΄λΆμΈλ°μ κΈ°λ³Έ λ¬Έμμ΄(ta)μ λΉκ΅ λ¬Έμμ΄(pa)κ° μΌμΉνλμ§λ₯Ό λΉκ΅νμ¬ κ²°κ΄κ°μ λ°νν©λλ€.
· String.endsWith(String prefix)
public boolean endsWith(String suffix) {
return startsWith(suffix, length() - suffix.length());
}
endsWith() λ©μλλ μμμ μ΄ν΄λ³Έ startsWith() λ©μλλ₯Ό νΈμΆνλλ°, λ λ²μ§Έ μΈμμ λΉκ΅λ₯Ό μμν index κ°μ ꡬνμ¬ νΈμΆν©λλ€.
· String.indexOf(String str)
indexOf() λ©μλλ μ¬λ¬ κ° μ‘΄μ¬ν©λλ€.
μ£Όλ‘ μ¬μ©νλ λ©μλλ String νμ μ νλλ§ λ°λ λ©μλμ΄λ―λ‘, ν΄λΉ μ½λλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
private static void indexOf() {
String str = "original";
System.out.println(str.indexOf("o")); // 0
System.out.println(str.indexOf("r")); // 1
System.out.println(str.indexOf("k")); // -1
}
str λ¬Έμμ΄κ³Ό 맀κ°λ³μμ λ¬Έμκ° μΌμΉν κ²½μ° μΈλ±μ€λ₯Ό 리ν΄νκ³ , μμκ²½μ° -1μ 리ν΄ν©λλ€.
· String.contains(CharSequence s)
contains() λ©μλλ μμμ μ΄ν΄λ³΄μλ indexOf() λ©μλλ₯Ό νμ©νκ³ μμ΅λλ€.
· String.replace(char oldChar, char newChar)
replace() λ©μλλ oldChar λ¬Έμλ₯Ό newChar λ¬Έμλ‘ λ³κ²½νλλ°μ, μλ μ¬μ§μ μ£Όμμ λμμλ―μ΄ λͺ¨λ λ¬Έμμ λν΄ λ³κ²½μ ν©λλ€.
replace() λ©μλμ κ²½μ° bufλΌλ μλ‘μ΄ byte λ°°μ΄μ μμ±ν ν κΈ°μ‘΄ κ°μ 볡μ¬νκ³ , while λ¬Έμ λ°λ³΅νλ©΄μ λ³κ²½ν λ¬Έμμ κ²½μ° μλ‘μ΄ λ¬Έμλ‘ κ°μ μ μ₯ν ν String κ°μ²΄λ₯Ό μμ±νμ¬ λ¦¬ν΄ν©λλ€.
LATIN1μ κ°μ 0μΌλ‘ String μμ±μμμ coder κ°μ μ€μ λ©λλ€.
· String.repeat(int count)
repeat() λ©μλμ κ²½μ° λ€μ΄λ° κ·Έλλ‘ μ£Όμ΄μ§ λ¬Έμμ΄μ μ΄μ΄λΆμ΄λ κΈ°λ₯μ νλ λ©μλμΈλ°μ, ν΄λΉ λ©μλλ Java 11 λ²μ λΆν° μ¬μ©μ΄ κ°λ₯ν©λλ€.
λΉ¨κ°μ λ€λͺ¨ λ°μ€λ₯Ό κΈ°μ€μΌλ‘ μ λΆλΆμ νλΌλ―Έν°μ μ ν¨μ± κ²μ¦, λ¬Έμμ΄μ κΈΈμ΄ λ±μ λν κ²μ¦μ νλ λΆλΆμ λλ€.
OOMμ΄ λ°μν μ μλ κ²μ¦ λΆλΆμ count, len κΈΈμ΄λ₯Ό λΉκ΅νμ¬ Stringμ μ΅λ μ¬μ΄μ¦μ λΉκ΅λ₯Ό νκ³ μμ΅λλ€.
μ€μ λ‘ λ¬Έμμ΄μ μ΄μ΄λΆμ΄λ λ‘μ§μ byte arrayμΈ multiple λ°°μ΄μ μμ±νκ³ , 첫 lenλ§νΌ 볡μ¬ν λ€ forλ¬Έμ λλ©΄μ μ΄ν λΆλΆμ System.arrayCopy() λ©μλλ₯Ό νΈμΆνμ¬ λ³΅μ¬λ₯Ό νκ³ μμ΅λλ€.
private static void repeat() {
String str = "ab";
str = str.repeat(3);
System.out.println(str); // ababab
}
λ§λ¬΄λ¦¬
μ΄μμΌλ‘ String ν΄λμ€μ μ‘΄μ¬νλ μΌλΆ λ©μλλ€μ λν΄ μ΄ν΄λ³΄μμ΅λλ€.
λ΄λΆ μ½λλ λλΆλΆ λ°μ΄νΈλ₯Ό κΈ°μ€μΌλ‘ μ°μ°μ΄ μ§νλκ³ , 볡μ¬μ κ²½μ° System ν΄λμ€μ arrayCopy() λ©μλλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
Java 11μ κΈ°μ€μΌλ‘ String ν΄λμ€μ μ½λλ λλ΅ 3300λΌμΈ μΈλ°μ, μ¬κΈ°μ κ΅μ₯ν λ§κ³ μΉμ νκ² μ£Όμμ΄ μμ±λμ΄ μμ΄μ ν¨μμ κΈ°λ₯μ νμ νλλ° λ§μ λμμ΄ λλ κ² κ°μ΅λλ€.
(μμΈνμ§ μμ§λ§, μ½λλ³΄λ€ μ£Όμμ΄ λ λ§μ λλμ λλ€.. π)
μ°Έμ‘°
- https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
- https://coding-factory.tistory.com/521
- http://younghwannam.blogspot.com/2017/02/javabyte-0xff.html
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java DeepDive] - Map(HashMap) 1. κ°λ , νλ, μμ±μ (2) | 2022.11.27 |
---|---|
[Java DeepDive] - List (ArrayList) (2) | 2022.10.29 |
[Java DeepDive] - String (1) λ¬Έμμ΄ μμ± (0) | 2022.10.10 |
[Java, λμμΈ ν¨ν΄] - μ±κΈν΄ ν¨ν΄(Singleton Pattern) (4) | 2021.10.24 |
[Java] - κΉμ 볡μ¬(Deep Copy) vs μμ 볡μ¬(Shallow Copy) (1) | 2021.07.30 |
λκΈ