27 * @bug 8080535
28 * @summary Expected size of Character.UnicodeBlock.map is not optimal
29 */
30
31 import java.lang.reflect.Field;
32 import java.util.HashMap;
33 import java.util.Map;
34
35 public class NonOptimalMapSize {
36 public static void main(String[] args) throws Throwable {
37 Class<?> ubCls = Character.UnicodeBlock.class;
38 Field mapField = ubCls.getDeclaredField("map");
39 mapField.setAccessible(true);
40 Map<?,?> map = (Map<?,?>)mapField.get(null);
41 if (!map.getClass().equals(HashMap.class)) {
42 throw new RuntimeException(
43 "Character.UnicodeBlock.map is expected to be HashMap");
44 }
45 int mapSize = map.size();
46
47 Field sizeField = ubCls.getDeclaredField("INITIAL_CAPACITY");
48 sizeField.setAccessible(true);
49 int INITIAL_CAPACITY = sizeField.getInt(null);
50
51 // Construct a HashMap with specified initial capacity
52 HashMap<Object,Object> map1 = new HashMap<>(INITIAL_CAPACITY);
53 Class<?> hmCls = HashMap.class;
54 Field tableField = hmCls.getDeclaredField("table");
55 tableField.setAccessible(true);
56 // ... and fill it up
57 map1.put(new Object(), new Object());
58 final Object initialTable = tableField.get(map1);
59 while (map1.size() < map.size() &&
60 initialTable == tableField.get(map1)) {
61 map1.put(new Object(), new Object());
62 }
63
64 // Now check that internal storage didn't change
65 if (initialTable != tableField.get(map1)) {
66 throw new RuntimeException(
67 "Initial capacity " + INITIAL_CAPACITY +
68 " was only enough to hold " + (map1.size()-1) +
69 " entries, but needed " + map.size());
|
27 * @bug 8080535
28 * @summary Expected size of Character.UnicodeBlock.map is not optimal
29 */
30
31 import java.lang.reflect.Field;
32 import java.util.HashMap;
33 import java.util.Map;
34
35 public class NonOptimalMapSize {
36 public static void main(String[] args) throws Throwable {
37 Class<?> ubCls = Character.UnicodeBlock.class;
38 Field mapField = ubCls.getDeclaredField("map");
39 mapField.setAccessible(true);
40 Map<?,?> map = (Map<?,?>)mapField.get(null);
41 if (!map.getClass().equals(HashMap.class)) {
42 throw new RuntimeException(
43 "Character.UnicodeBlock.map is expected to be HashMap");
44 }
45 int mapSize = map.size();
46
47 // This is the initial size of Character.UnicodeBlock.map
48 // See src/java.base/share/classes/java/lang/Character.java
49 int INITIAL_CAPACITY = 680; //(int)(510 / 0.75f + 1.0f);
50
51 // We will check that the capacity was sufficient:
52 // - create a new HashMap with this initial capacity
53 // - insert map.size() elements in it
54 // - check that the internal storage wasn't reallocated
55
56 // Construct a HashMap with specified initial capacity
57 HashMap<Object,Object> map1 = new HashMap<>(INITIAL_CAPACITY);
58 Class<?> hmCls = HashMap.class;
59 Field tableField = hmCls.getDeclaredField("table");
60 tableField.setAccessible(true);
61 // ... and fill it up
62 map1.put(new Object(), new Object());
63 final Object initialTable = tableField.get(map1);
64 while (map1.size() < map.size() &&
65 initialTable == tableField.get(map1)) {
66 map1.put(new Object(), new Object());
67 }
68
69 // Now check that internal storage didn't change
70 if (initialTable != tableField.get(map1)) {
71 throw new RuntimeException(
72 "Initial capacity " + INITIAL_CAPACITY +
73 " was only enough to hold " + (map1.size()-1) +
74 " entries, but needed " + map.size());
|