[问题] 关于 Collection 的相关问题

楼主: sam92260 (中坜炸豆腐)   2020-08-23 03:16:25
嗨大家好,小弟我还是学生想请问大家一些关于 collection 的问题,因为想了很久还是
想不通,所以想请大家帮帮忙。
先假设我今天想要实作一个stack
List<Integer> stack1 = new LinkedList<Integer>();
List<Integer> stack2 = new ArrayList<Integer>();
第一种方法为用LinkedList 类别实作 List 接口
第二种方法为用ArrayList 类别实作List接口
可是 stack1 和 stack2 同样都只能使用 List 接口的方法,所以我不太懂说用哪个类别
实作会有什么差。
如果我今天就只是要实作 LIFO的特性而上述,那上述实作方法都可达成我的目的。
我知道假设对stack1 做 get(int index) 最差为 O(n)
然后对 stack2 做 get(int index) 只要O(1)
(Question 1)可是假如我今天只是想要有LIFO 的这种特性,那我是不是不需要考虑这么
多,这两种用哪一种看心情随便使用即可?
————————————————————————————
(Question 2)又或著说我今天也直接宣告成底下这样也没差?
LinkedList<Integer> stack3 = new LinkedList<Integer>();
ArrayList<Integer> stack4 = new ArrayList<Integer>();
因为上述这两种宣告方式,我反而能有更多 methods 可以使用,不会侷限于只能用 List
接口的 methods。
————————————————————————————
但!但是!我今天也有查到,发现大家在实作 queue 和 stack都比较常用底下这方法:
Queue queue1 = new ArrayDequeue();
Queue stack5 = new ArrayDequeue();
(Question 3)但是我看到这实作方法后,我一样浮出跟上面的疑问,如果我只是想要有FI
FO orLIFO 的特性的话我何不直接这样宣告:
ArrayDequeue queue2 = new ArrayDequeue();
ArrayDequeue stack6 = new ArrayDequeue();
这样宣告,我甚至还有更多 methods 可以是使用!
————————————————————————————
(Question 4) 假设我今天要养成良好的Coding习惯的话,我该用哪种宣告方式呢?
能请大家说一下业界的习惯是什么吗?
————————————————————————————
(Question 5) 我在查这些资料的时候还有看到一下关键字:
Thread-Safe
Non Thread-Safe
上述这两个东西好像也会影响我们选择用哪种方式去做宣告,但是小弟我看了资料也不是
很了解,还请各位帮忙一下!
最后感谢大家的回答,和花时间看这篇!
作者: ssccg (23)   2020-08-23 03:45:00
1. LIFO你都还没谈到add、remove的成本,是考虑太少不是不需要这么多,根本不够多吧2.以程式效能来说是没差,但是“反而有更多方法能用”可不见得是好处,通常会选符合设计逻辑、刚好够用的接口,避免用到限制实作的方法,真的需要换实作时就麻烦了5. https://en.wikipedia.org/wiki/Thread_safetythread safe简单说就是多个thread用同个物件保证不会出错
作者: tw11509 (John-117)   2020-08-26 08:58:00
你的问题可以去了解一下多型与ADT
作者: jej (晃奶大馬桶)   2020-08-27 13:55:00
先了解什么是物件 就能解你的一堆问题再去了解算法 你就知道FIFO是说哪一个了 加油!

Links booklink

Contact Us: admin [ a t ] ucptt.com