
„Здрасти! Днес ще ти кажа Howво е проследяване на стек. Но първо трябва да ти кажа Howво е стек.“
„Представете си купчина documentи – указания за определен служител. Можете да поставите нова задача върху купчината or можете да вземете задача от върха. Това означава, че задачите няма да бъдат изпълнени в реда, в който са получени . Задачата, поставена на купчината най-скоро, ще бъде първата, която ще бъде изпълнена. Структурирането на елементите на колекция по този начин формира стек .
" Java има специална колекция за това – Stack . Това е колекция, която има методи за "добавяне на елемент" и "вземане (вземане) на елемент". Както може би се досещате, елементът, който е добавен последен, ще бъде първият да бъдат взети."
— Звучи доста просто.
"Страхотно. Сега ще обясня Howво е проследяване на стека ."
„Представете си, че в Java програма метод A извика метод B , който извика метод C , който от своя страна извика метод D. За да излезем от метод B , първо трябва да излезем от метод C , а за да направим това – първо трябва да излезем от метод D. Това поведението наподобява стек."
— Защо казваш, че прorча?
„За да стигнете до няHowва задача в средата на нашата купчина documentи, например, първо трябва да изпълните всички задачи, лежащи отгоре.“
— Има известно сходство, но не съм сигурен, че разбирам всичко правилно.
„Вижте. Купчината е набор от елементи. Като парчета хартия в купчина. За да вземете третото парче хартия отгоре, първо трябва да вземете второто, а за това трябва да вземете първото. винаги можеш да сложиш и вземеш парчета хартия, но винаги трябва първо да вземеш горната хартия."
„Същото важи и за извикванията на функции. Метод A извиква метод B , който извиква метод C. За да излезете от A , първо трябва да излезете от B , а за да направите това, трябва да излезете от C. “
„Чакай. Ако разбирам Howво искаш да кажеш, цялата концепция за стека се свежда до „вземете парчето хартия, което е добавено последно“ и „можете да излезете само от метода, който сте въвели последно“. Това точно ли е? "
„Да. Последователността от извиквания на функции е известна като „стек за повиквания“ or просто „стек“. Последната извикана функция е първата функция, която завършва. Нека да разгледаме един пример.“
Вземете и покажете текущия стек за повиквания: |
---|
|
Резултат: |
|
"ОК. Разбирам всичко за извикванията на функции. Но Howво е това StackTraceElement?"
„Машината на Java следи всички извиквания на функции. За това има специална колекция – стека. Когато една функция извиква друга, машината на Java поставя нов обект StackTraceElement в стека. Когато функцията приключи, този елемент се премахва от стека. Това означава, че стекът винаги съхранява актуална информация за текущото състояние на „стека от извиквания на функции“ .
„Всеки обект StackTraceElement съдържа информация за извикания метод. По-специално, можете да получите името на метода, като използвате метода getMethodName .“
„Можете да видите How работи това в примера по-горе:
1) Получаваме стека на повикванията.
2) Използваме цикъл for-each, за да преминем през него. Надявам се, че не сте забравor Howво е това.
3) Извеждаме имената на методите към System.out ."
„Очарователно! И не е твърде сложно. Благодаря ти, Риши!“
GO TO FULL VERSION