Java-java 数组和集合

Java-java 数组和集合

想挽留 发布于 2017-10-25 字数 115 浏览 1179 回复 6

有个面试题。。现在就是队列原理 写了个实现类来更快的实现高效实现这个队列。。。是用数组还是集合啊 。。请指教

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

瑾兮 2017-10-28 6 楼

有两种情形存在:
1、队列定长,即固定长度,这样应该优先选择数组,但要注意的是,因为这块内存是你自己维护,所以一定要注意内存溢出,在pop的时候将已经pop的元素置空。
2、队列不定长,这个数组实现是很麻烦而且是不正确的选择,因此应该使用集合,LinkedList是很好的选择,每次push在使用addLast就可以,每次pop使用getFirst方法就可以取到然后再调用removeFirst方法就把元素删除了。

想挽留 2017-10-27 5 楼

既然是队列,那就是先进先出,肯定要频繁删除,添加,而且长度未知。所以用集合应该合理一点。
不过既然是面试题,不见得就有标准答案,理论上用数组也可以,只不过你要控制好数组的可变长度,以及下一个出队和入队的位置索引,这就有些复杂。

想挽留 2017-10-27 4 楼

如果频繁增删,建议用集合

瑾兮 2017-10-27 3 楼

用集合怎么控制顺序,既然是要先进先出,所以首先要保证顺序。
另外,如果用集合的话,相同的元素只能放一次,所以会出现元素丢失。
因此,从这两个角度来说只能用数组

虐人心 2017-10-26 2 楼

设计消息队列(java语言) 我的建议是:

如果FIFO方式 则当:

1、如果:单个消息内容大 建议使用ArrayBlockingQueue,因为Linked方式由于有内部存储节点类(Node)和无限制长度,所以可能导致GC严重。
2、如果:并发量高,则选择LinkedBlockingQueue,因为2把锁会比Array的单把锁效率高。

如果是Priosity方式 则当:

1、如果:存储任务要求A B严格先后顺序,则使用SynchronousQueue 处理
2、如果:队列异步任务完成、缓存超时设计、单点中间件session超时设计、连接池超时设计则使用DelayedBlockingQueue

备注:

如果想更高效的设计,考虑CAS实现的无锁队列(一般为Linked类型),重点在于cursor的设计。

以上仅供参考

清晨说ぺ晚安 2017-10-26 1 楼

要在数组和集合之间做选择。

首先要清楚数据和集合的区别:(1)数组的长度固定,在定义数组的时候,就确定了数组长度;而集合的定义不需要指定长度,大小是动态调整的。(2)数组既可以容纳基本数据类型,也可以容纳对象;而集合只能容纳对象。数组和集合容纳对象的时候,存放的都是对象的引用;而数组在容纳基本数据类型的时候,持有的是数值。

其次,要清楚队列的概念,队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。这也就是我们平常经常用说到的先进先出原则(FIFO)。

最后,用数组和集合都是可以的,数组的特点是它存储的物理地址和逻辑地址都是连续的,所有在读写的性能上会优于集合,数组实现重点在于控制front和rear两个标记和动态扩展数组长度。
集合的特点是插入和移除方便,并且不必关心容量,但是性能可能不如数组,比如可以直接采用Collection->List->LinkedList的add和remove来完成push和pop。