POP: извлекает верхний элемент из одного слова из стека и удаляет его.
POP2: удаляет два элемента из одного слова из стека (например, два целых числа, или целое число и ссылку на объект) илиодин элемент из двух слов (т. е. двойной или один за другим).
Тот же Javadoc, упомянутый в вопросе, содержит информацию ниже:
Таблица 2.3.Фактические и вычислительные типы в виртуальной машине Java
Actual type Computational type Category
1. byte int 1
2. char int 1
3. short int 1
4. int int 1
5. float float 1
6. reference reference 1
7. returnAddress returnAddress 1
8. boolean int 1
9. long long 2
10. double double 2
Как вы можете видеть, только long и double относятся к категории 2. Это происходит потому, что все остальные являются 32-битными в вычислительном отношении, а long и double - 64-битными.
В приведенном ниже примере показано, как сделать это ясным.
public class PopVsPop2 {
public static int popint(){
return 1;
}
public static long poplong() {
return 1;
}
public static Long popLong() {
return 1L;
}
public static void main(String[] args) {
popint();
poplong();
popLong();
}
Вышеуказанный javacode имеет следующий сгенерированный байт-код:
public static main(String[]) : void
L0
LINENUMBER 24 L0
INVOKESTATIC PopVsPop2.popint () : int
POP
L1
LINENUMBER 25 L1
INVOKESTATIC PopVsPop2.poplong () : long
POP2
L2
LINENUMBER 26 L2
INVOKESTATIC PopVsPop2.popLong () : Long
POP
L3
LINENUMBER 27 L3
RETURN
L4
LOCALVARIABLE args String[] L0 L4 0
MAXSTACK = 2
MAXLOCALS = 1
Как вы можете видеть
popint () - POP -Потому что int относится к категории 1.
poplong () -POP2 - Потому что long относится к категории 2. То же самое будет для double.
popLong () - POP- Потому что здесьLong относится к java.lang.Long, который является ссылочным типом.Отсюда категория 1.