对Android中的堆栈的理解(Stack)

更新时间:2023-06-18 14:22:19 阅读: 评论:0

对Android中的堆栈的理解(Stack)
版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。 blog.csdn/Ln_ZooFa/article/details/50337529堆栈空间分配
栈(操作系统):由操作系统⾃动分配释放,存放函数的,的值等。其操作⽅式类似于数据结构中的栈。
大学生贫困证明堆(操作系统):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配⽅式倒是类似于链表。
堆栈缓存⽅式
栈使⽤的是,他们通常都是被调⽤时处于存储空间中,调⽤完毕⽴即释放。
堆则是存放在中,⽣命周期由虚拟机的垃圾回收算法来决定(并不是⼀旦成为孤⼉对象就能被回收)。所以调⽤这些对象的速度要相对来得低⼀些
Stack
栈(stack)在计算机科学中是限定仅在表尾进⾏插⼊或删除操作的线性表。栈是⼀种数据结构,它按照后进先出的原则存储数据,先进⼊的数据被压⼊栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈是只能在某⼀端插⼊和删除的特殊线性表。⽤桶堆积物品,先堆进来的压在底下,随后⼀件⼀件往上堆。取⾛时,只能从上⾯⼀件⼀件取。读和取都在顶部进⾏,底部⼀般是不动的。栈就是⼀种类似桶堆积物品的数据结构,进⾏删除和插⼊的⼀端称栈顶,另⼀端称栈底。插⼊⼀般称为进栈,删除则称为退栈。栈也称为后进先出表。
Heap
堆(heap)⼜被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。回忆⼀下,在中,我们可以进⾏的限定操作是dequeue 和enqueue。dequeue是按照进⼊队列的先后顺序来取出元素。⽽在堆中,我们不是按照元素进⼊队列的先后顺序取出元素的,⽽是按照元素的优先级取出元素。
这就好像候机的时候,⽆论谁先到达候机厅,总是头等舱的乘客先登机,然后是商务舱的乘客,最后是经济舱的乘客。每个乘客都有头等舱、商务舱、经济舱三种个键值(key)中的⼀个。头等舱->商务舱->经济舱依次享有从⾼到低的优先级。
<E>母爱作文500
<E>
<E>
java.util.Stack<E>
所有已实现的接⼝:
,, <E>, <E>, <E>,
public class Stack<E>怎么设置电脑壁纸
extends <E>
Stack类表⽰后进先出(LIFO)的对象堆栈。它通过五个操作对类Vector进⾏了扩展,允许将向量视为堆栈。它提供了通常的push和pop操作,以及取堆栈顶点的peek⽅法、测试堆栈是否为空的empty⽅法、在堆栈中查找项并确定到堆栈顶距离的arch⽅法。
⾸次创建堆栈时,它不包含项。
接⼝及其实现提供了 LIFO 堆栈操作的更完整和更⼀致的 t,应该优先使⽤此 t,⽽⾮此类。例如:
Deque<Integer> stack = new ArrayDeque<Integer>();
如果你的应⽤中涉及到的东西⽐较耗内存的话,⽐如:相机、第三⽅地图、、新浪、录⾳、视频播放、⼤量图⽚时,如果这些东西同时存在于应⽤中时,会有很多奇怪的问题出现,⾃动退出还不报错等等⼀系列的问题,还有,如果我们的应⽤中使⽤startActivity()过多⽽且并没有及时finish()掉的话,也会出现这样那样的问题,⽐如:退出应⽤时没有退出⼲净,或者的报OOM,启动的服务⾃动挂起什么的!其实,Google已经提供了⼀套完整的机制让开发⼈员控制活动栈与任务栈
像这样的跳转我们在开发的过程中算是很长见到的了,在这⾥我就不贴代码了,假如就是有三个活动窗⼝(Activity1,Activity2,Activity3,)按先后顺序从Activity1--startActivity()到Activity2再到Activity3这个过程⼤家应该可以想象的到,在这个过程⽣成的活动堆栈如图所⽰:
这个地⽅说明下,有时候⼤家可以想着从1到2时可以绑定数据完成回显,但是如果要简单的回显⽤绑定或startActivityForResult()这两种⽅式启动,但是如果涉及到三个以上的活动惑更多活动之间的跳转时,有时候不得不必须重新启动新的活动,也就出现了前⾯的1>>2>>3>>4>>>>>>>甚⾄更多的活动跳转,这样⼀个个关闭有时候还是关不⼲净,应⽤退出的时候也还是不⼲净的,更搞笑的是有时候还有⽤户在多个活动之间跳转并不进⾏任何数据操作时还要求返回上⼀个Activity时你就不能直接finish掉
上⼀个Activity,不然⼈家说你跳转不对,针对这个问题我们来看下Google提供的堆栈任务控制机制吧,很简单,⽤Flag来控制,这个时候就有个问题,提供的⽅法有tFlag()、addFlag(),这两个肯定有什么区别的,不然不会出现两个控制Flag的⽅法的
如果是点击回退键的过程中也会有不⼀样同样点击了六次按钮之后按的返回键,第⼀种效果必须点击六次Back键后⽅可退出,⽽第⼆种效果只点击⼀次即可退出,这就是Flag的魅⼒,激动….再来看Flag都有哪⼏种吧,此处我列在这个地⽅,上⾯两个效果中设置的是:i.tFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);另外还有很多可以控制活动堆栈与任务栈的Flag,⼩马在这个地⽅随便列出两个,剩余的Flag值以的形式显⽰,节约时间:
1. i.tFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
2. i.tFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)其它:
⼀、Activity和Task(栈)的关系
  Task就像⼀个容器,⽽Activity就相当与填充这个容器的东西,第⼀个东西(Activity)则会处于最下⾯,最后添加的东西(Activity)则会在最低端。从Task中取出东西(Activity)则是从最顶端取出。
  ⼆、界⾯跳转和服务的启动都会⽤到Intent,现在介绍Intent Flag是关于Activity的跳转
  Intent intent = new Intent(this,xxx.class);红酒怎么打开
  //如果activity在task存在,拿到最顶端,不会启动新的Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
  //如果activity在task存在,将Activity之上的所有Activity结束掉
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  //默认的跳转类型,将Activity放到⼀个新的Task中
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  //如果Activity已经运⾏到了Task,再次跳转不会在运⾏这个Activity
  intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
⼤家可以很清楚的看到以后所含的标志中有针对于TASK的,对吧?指的就是任务堆栈,⾄于什么是任务堆栈,⼤家不⽤太过纠结于与活动堆栈之间的概念什么的,只记住⼀点:如果你在应⽤中启动Activity的时候没加任务堆栈的控制Flag时,开发环境肯定报错,⽽且提⽰的很准确,就是:你缺少添
加任务堆栈Flag标志位,具体少了哪个标志,开发环境也会很准确的指出,必须要你添加才可正常编译通过!下⾯列下⼩马犯的错误,就是在⼀个Activity找到⼀个amr录⾳⽂件,直接以下⾯的⽅式启动去播放录⾳,猛报错:
1. Intent i = new Intent(Intent.ACTION_VIEW);
2.      i.putExtra("filePath",path);
3.      startActivity(i);
如果加了 i.tFlags(Intent.FLAG_ACTIVITY_NEW_TASK);操作下任务堆栈就可以了,具体的原因,也可以⽤⼀句话来总结:如果在⼀个Activity中同⼀时间,要操作不⽤的功能,⽐如:跳转时还要操作视频录⾳⽂件的播放什么的,都得设置新的任务栈来启动打开,如果不启动新任务栈的话,有时候会⽆原⽆故的显⽰空⽩还不报错!上⾯的错只是⼀个⼩点,⼩到可以忽略不讲,写在这是提醒⼤家,该加的时候必须加Flag,⾄于什么时候加,⼤家可以参照下官⽅的⽂档及下⾯⼩马贴出的官⽅⽂档中解释堆栈的图解,加以理解学习,如下所⽰:Figure2:不多解释,就是在A B 丙个任务堆栈,如果⽤户正在于B任务堆栈进⾏交互时,A在等待唤醒,反之则反
Figure3: 下⾯这个就好玩了,学习了下官⽅的⽂档,讲的是:⽆论启动了⼀个新的任务堆栈或者在同
⼀堆栈中来启动⼀个活动,按返回键也还是会返回到⽤户之前操作的Activity,如果以单例堆栈(类似单位模式)载⼊的话,就会在后台⽣成⼀个针对于此活动的单独的⼀个任务堆栈,当这个任务堆栈被唤醒到前台时,此时的返回堆栈中就包含了从前⼏个任务传递过来的栈顶的所有Activity,栈顶与栈底的显⽰关系如果下图:
这个地⽅顺带着讲下,在控制活动堆栈时⽅式只有⼀种,就是直接在.java⽂件中tFlag,如果是控制任务堆栈的话可以以addFlag或直接在全局配置⽂件中添加配置的⽅式来控制,⼤家可以直接在l⽂件中activity节点中添加哪下属性:taskAffinity、launchMode、allowTaskReparenting、clearTaskOnLaunch、alwaysRetainTaskState、finishOnTaskLaunch,两种控制任务堆栈的⽅式换汤不换药,⼤家看个⼈习惯选择使⽤就可以了…切记,⽤的时候⼀定搞清楚你要加的标志位是什么意思,不要看到个task就addFlag,设置Flag是为了让应⽤更⼲净,控制更严密,如果加错了标志位,应⽤是不会报任何错的,只是出现怪异的跳转与关闭
Stack是⼀个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个⽅法⽽来
Deque(双端队列)⽐起Stack具有更好的完整性和⼀致性,应该被优先使⽤
[plain]
1. E push(E item)
大耳朵英语学习网
2. 把项压⼊堆栈顶部。
酒店培训课程3. E pop()
4. 移除堆栈顶部的对象,并作为此函数的值返回该对象。
5. E peek()
6. 查看堆栈顶部的对象,但不从堆栈中移除它。
7. boolean empty()
8. 测试堆栈是否为空。
9. int arch(Object o)
10. 返回对象在堆栈中的位置,以 1 为基数。
Stack本⾝通过扩展Vector⽽来,⽽Vector本⾝是⼀个可增长的对象数组( a growable array of objects)那么这个数组的哪⾥作为Stack的栈顶,哪⾥作为Stack的栈底?
答案只能从源代码中寻找,jdk1.6:
[java]
1. public class Stack<E> extends Vector<E> {
2.    /**
3.      * Creates an empty Stack.
4.      */
5.    public Stack() {
6.    }
7.
8.    /**
9.      * Pushes an item onto the top of this stack. This has exactly
10.      * the same effect as:
11.      * <blockquote><pre>
12.      * addElement(item)</pre></blockquote>
13.      *
14.      * @param  item  the item to be pushed onto this stack.
15.      * @return  the <code>item</code> argument.
16.      * @e    java.util.Vector#addElement
17.      */
18.    public E push(E item) {
19.    addElement(item);
20.
21.    return item;
22.    }
23.
24.    /**
25.      * Removes the object at the top of this stack and returns that
26.      * object as the value of this function.
27.      *
28.      * @return    The object at the top of this stack (the last item
29.      *            of the <tt>Vector</tt> object).
30.      * @exception  EmptyStackException  if this stack is empty.
31.      */
32.    public synchronized E pop() {
33.    E  obj;
34.    int len = size();
35.
36.    obj = peek();
37.    removeElementAt(len - 1);
38.
39.    return obj;
40.    }
41.
42.    /**
43.      * Looks at the object at the top of this stack without removing it
44.      * from the stack.
45.      *
46.      * @return    the object at the top of this stack (the last item
47.      *            of the <tt>Vector</tt> object).
48.      * @exception  EmptyStackException  if this stack is empty.
49.      */
50.    public synchronized E peek() {
51.    int len = size();
52.
53.    if (len == 0)
54.        throw new EmptyStackException();
55.    return elementAt(len - 1);
56.    }
57.
58.    /**
59.      * Tests if this stack is empty.
60.      *
61.      * @return  <code>true</code> if and only if this stack contains
62.      *          no items; <code>fal</code> otherwi.
63.      */
64.    public boolean empty() {
65.    return size() == 0;
66.    }
67.朱自清生平
68.    /**
69.      * Returns the 1-bad position where an object is on this stack.
70.      * If the object <tt>o</tt> occurs as an item in this stack, this
71.      * method returns the distance from the top of the stack of the
72.      * occurrence nearest the top of the stack; the topmost item on the
73.      * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
74.      * method is ud to compare <tt>o</tt> to the
75.      * items in this stack.
76.      *
77.      * @param  o  the desired object.
78.      * @return  the 1-bad position from the top of the stack where
79.      *          the object is located; the return value <code>-1</code>
80.      *          indicates that the object is not on the stack.
81.      */
82.    public synchronized int arch(Object o) {
83.    int i = lastIndexOf(o);
84.
85.    if (i >= 0) {
86.        return size() - i;
87.    }
88.    return -1;
89.    }
90.
91.    /** u rialVersionUID from JDK 1.0.2 for interoperability */三点水一个秦
92.    private static final long rialVersionUID = 1224463164541339165L;
93. }
通过peek()⽅法注释The object at the top of this stack (the last item of the Vector object,可以发现数组(Vector)的最后⼀位即为Stack的栈顶
pop、peek以及arch⽅法本⾝进⾏了同步
push⽅法调⽤了⽗类的addElement⽅法
empty⽅法调⽤了⽗类的size⽅法
Vector类为线程安全类
综上,Stack类为线程安全类(多个⽅法调⽤⽽产⽣的数据不⼀致问题属于原⼦性问题的范畴)
[java]
1. public class Test {
2.    public static void main(String[] args) {
3.        Stack<String> s = new Stack<String>();
4.        System.out.println("------isEmpty");
5.        System.out.println(s.isEmpty());
6.        System.out.println("------push");
7.        s.push("1");
8.        s.push("2");
9.        s.push("3");
10.        Test.it(s);
11.        System.out.println("------pop");
12.        String str = s.pop();
13.        System.out.println(str);
14.        Test.it(s);
15.        System.out.println("------peek");
16.        str = s.peek();
17.        System.out.println(str);
18.        Test.it(s);
19.        System.out.println("------arch");
20.        int i = s.arch("2");
21.        System.out.println(i);
22.        i = s.arch("1");
23.        System.out.println(i);
24.        i = s.arch("none");
25.        System.out.println(i);
26.    }
27.
28.    public static void it(Stack<String> s){
29.        System.out.print("iterator:");
30.        Iterator<String> it = s.iterator();
31.        while(it.hasNext()){
32.            System.out.()+";");
33.        }
34.        System.out.print("\n");
35.    }
36. }
结果:
[sql]
1. ------isEmpty
2. true
3. ------push
4. iterator:1;2;3;
5. ------pop
6. 3      --栈顶是数组最后⼀个
7. iterator:1;2;
8. ------peek
9. 2      --pop取后删掉,peek只取不删
10. iterator:1;2;
11. ------arch
12. 1      --以1为基数,即栈顶为1
13. 2      --和栈顶见的距离为2-1=1
14. -1      --不存在于栈中
Stack并不要求其中保存数据的唯⼀性,当Stack中有多个相同的item时,调⽤arch⽅法,只返回与查找对象equal并且离栈顶最近的item与栈顶间距离(见源码中arch ⽅法说明)

本文发布于:2023-06-18 14:22:19,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/983753.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:堆栈   任务   控制   活动   对象
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图