private final char value[];
private final byte[] value;
String stringLiteral = "TopJava";
String stringViaConstructor = new String("TopJava");
char[] chars = { 'T', 'o', 'p', 'J', 'a', 'v', 'a' };
String str = new String(chars);
public class StringExampleOne {
public static void main(String[] args) {
String str1 = "TopJava";
String str2 = "TopJava";
System.out.println("Строка 1 равна строке 2? " + (str1 == str2));
}
}
public class StringExampleTwo {
public static void main(String[] args) {
String str1 = "TopJava";
String str2 = "Top" + "Java";
System.out.println("Строка 1 равна строке 2? " + (str1 == str2));
}
}
public class StringExampleThree {
public static void main(String[] args) {
String str1 = "TopJava";
String str2 = "Java";
String str3 = "Top" + str2;
System.out.println("Строка 1 равна строке 3? " + (str1 == str3));
}
}
public class StringExampleFour {
public static void main(String[] args) {
String str1 = "TopJava";
String str2 = "TopJava";
String str3 = new String("TopJava");
String str4 = new String("TopJava");
System.out.println("Строка 1 равна строке 2? " + (str1 == str2));
System.out.println("Строка 2 равна строке 3? " + (str2 == str3));
System.out.println("Строка 3 равна строке 4? " + (str3 == str4));
}
}
public class StringExampleFive {
public static void main(String[] args) {
String str1 = "TopJava";
String str2 = "TopJava";
String str3 = (new String("TopJava")).intern();
String str4 = (new String("TopJava")).intern();
System.out.println("Строка 1 равна строке 2? " + (str1 == str2));
System.out.println("Строка 2 равна строке 3? " + (str2 == str3));
System.out.println("Строка 3 равна строке 4? " + (str3 == str4));
}
}
public class StringExampleSix {
public static void main(String[] args) {
String str1 = "interned TopJava";
String str2 = "TopJava";
String str3 = ("interned " + str2).intern();
System.out.println("Строка 1 равна строке 3? " + (str1 == str3));
}
}
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class CHMInterner <T> {
private final Map<T, T> map;
public CHMInterner() {
map = new ConcurrentHashMap<>();
}
public T intern(T t) {
T exist = map.putIfAbsent(t, t);
return (exist == null) ? t : exist;
}
public int internSize() {
return map.size();
}
}
public class Main {
public static void main(String[] args) {
CHMInterner chmInterner = new CHMInterner();
chmInterner.intern("TopJava_1");
chmInterner.intern("TopJava_2");
chmInterner.intern("TopJava_2");
chmInterner.intern("TopJava_3");
chmInterner.intern("TopJava_3");
chmInterner.intern("TopJava_3");
chmInterner.intern("TopJava_4");
chmInterner.intern("TopJava_4");
chmInterner.intern("TopJava_4");
chmInterner.intern("TopJava_4");
System.out.println("Размер пула строк равен: " + chmInterner.internSize());
}
}
-XX:MaxPermSize=1G
-XX:+PrintStringTableStatistics
и
-XX:+PrintFlagsFinal
SymbolTable statistics:
Number of buckets : 32768 = 262144 bytes, each 8
Number of entries : 517 = 8272 bytes, each 16
Number of literals : 517 = 19712 bytes, avg 38,000
Total footprint : = 290128 bytes
Average bucket size : 0,016
Variance of bucket size : 0,016
Std. dev. of bucket size : 0,125
Maximum bucket size : 2
StringTable statistics:
Number of buckets : 65536 = 524288 bytes, each 8
Number of entries : 68 = 1088 bytes, each 16
Number of literals : 68 = 4648 bytes, avg 68,000
Total footprint : = 530024 bytes
Average bucket size : 0,001
Variance of bucket size : 0,001
Std. dev. of bucket size : 0,032
Maximum bucket size : 1
-XX:StringTableSize=4901
private final byte[] value;
import java.lang.reflect.Field;
public class DeduplicationDemo {
public static void main(String[] args) throws InterruptedException, NoSuchFieldException, IllegalAccessException {
char[] chars = {'T', 'o', 'p', 'J', 'a', 'v', 'a'};
String[] strings = {new String(chars), new String(chars)};
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
System.out.println("Хеш первого объекта: " + value.get(strings[0]));
System.out.println("Хеш второго объекта: " + value.get(strings[1]));
System.gc();
System.out.println("Запустили сборщик мусора");
Thread.sleep(100);
System.out.println("Хеш первого объекта: " + value.get(strings[0]));
System.out.println("Хеш второго объекта: " + value.get(strings[1]));
}
}
import java.lang.reflect.Field;
public class DeduplicationDemo {
public static void main(String[] args) throws InterruptedException, NoSuchFieldException, IllegalAccessException {
char[] chars = {'T', 'o', 'p', 'J', 'a', 'v', 'a'};
String[] strings = {new String(chars), new String(chars), "TopJava"};
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
System.out.println("Хеш первого объекта: " + value.get(strings[0]));
System.out.println("Хеш второго объекта: " + value.get(strings[1]));
System.out.println("Хеш третьего объекта: " + value.get(strings[2]));
System.gc();
System.out.println("Запустили сборщик мусора");
Thread.sleep(100);
System.out.println("Хеш первого объекта: " + value.get(strings[0]));
System.out.println("Хеш второго объекта: " + value.get(strings[1]));
System.out.println("Хеш третьего объекта: " + value.get(strings[2]));
}
}