Подтвердить что ты не робот

Точка останова хита Hashmap.put() простая программа Hello World

Программа проста:

public class HelloWorld {
    public static void main(String args[]){
       System.out.println("Hello World");
    }
}

Теперь я установил точку останова в функцию put(K key, V value) в HashMap.class

public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
        inflateTable(threshold);
    }
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);

а затем я начинаю отладку HelloWorld.class, он будет работать в точке останова в HashMap. Мне странно, как он может работать в put() в HashMap?
Я попробовал HashMap, Hashtable, и они все одинаковы.

4b9b3361

Ответ 1

Вот трассировка стека, которую я получил при воспроизведении вашего сценария.

Когда приложение запускается Eclipse, оно не просто вводит главную функцию. Перед созданием экземпляра ваш класс должен быть загружен в JVM. Для этого будет использоваться Class Loader.

В вашем случае URLClassLoader имеет член типа URLClassPath, который использует объект HashMap.

введите описание изображения здесь

Ответ 2

Это связано с тем, как Eclipse запускает приложения.

Класс Eclipse LauncherHelper, запускающий приложение (HelloWorld), вызывает URLClassLoader и множество других вещей. URLClassLoader использует HashMaps, HashTables и т.д.

Ответ 3

Поскольку вы уже используете отладчик, вы также можете увидеть кадры, которые показывают, где был вызван метод put. В IntelliJ это выглядит так:

frames

Как вы можете видеть здесь, метод вызывается, когда JVM пытается загрузить определенный класс: здесь это ваш класс HelloWorld. Он делает это для вызова метода main.

Поскольку JVM только что начал, ему нужно заполнить определенный HashMap<String, URLClassPath.Loader> lmap в классе sun.misc.URLClassPath. Эта карта содержит записи для используемых ресурсов, таких как используемые файлы jar (например, файлы jar из установки Java) или .class, такие как ваш "bin" каталог вашего проекта. Он будет использоваться во время выполнения вашего приложения.

Но также будет использоваться Map, тогда JVM загрузит "разрешения" в java.security.Permissions, который имеет Map<Class<?>, PermissionCollection> permsMap.

Как вы можете видеть, вызов метода put не имеет никакого отношения к содержимому вашего собственного приложения. Он просто используется для загрузки базового материала для среды Java и среды выполнения приложения.

Btw: попытайтесь ознакомиться с вашим отладчиком, это поможет вам понять, почему вызываются определенные методы и какой класс/метод выполняет вызов.