Java ArrayList 不服来辩

2023-07-28 16:48:23 +08:00
 guguji

get(int index) 方法时间复杂度 O(1),如何做的到? - 如果底层是基于数组,那么数组为什么可以根据索引快速访问到数据?

remove(int index) 方法时间复杂度 O(N2) - 如果有大批量的数据在 list 中,且要删除其中一个元素,请问如何优化? - 就基于 ArrayList 来做,不该变成 LinkedList 这种?

5800 次点击
所在节点    Java
67 条回复
deplivesb
2023-07-28 17:26:58 +08:00
op 的 blog 和他的三个帖子,看出来就是个 xx
Ericcccccccc
2023-07-28 17:29:06 +08:00
重新学下组成原理?
issakchill
2023-07-28 17:30:14 +08:00
为啥不问问神奇的 chatgpt?
coderxy
2023-07-28 17:35:41 +08:00
我原来面试别人的时候,不少人分不清数组跟链表的区别的时候我的心理活动跟现在一模一样的
oneisall8955
2023-07-28 17:40:20 +08:00
钓鱼贴
maxssy
2023-07-28 17:51:12 +08:00
1. ArrayList 的首个元素的地址是已知的
2. ArrayList 底层实现在内存上表现为各个元素顺序排放的数组
3. ArrayList 每个元素的内存占用大小是已知的
所以
get 在取得索引后可以通过公式: `目标元素的地址 = 首元素地址 + 索引 * 每个元素的内存占用大小` 来取得, 所以时间复杂度是 O(1)

又因为各元素是顺序排放的, remove 某个元素后需要重新排列整个数组, 所以是 O(n)
cyndihuifei
2023-07-28 17:52:44 +08:00
为什么这种问题都搞不清楚还要发技术文章
dragondove
2023-07-28 18:23:05 +08:00
@xaplux 实际上 LinkedList 已经基本没有适合使用的地方了,具体可以看这个知乎回答 https://www.zhihu.com/question/563680801/answer/2750393567
zengmingyang96
2023-07-28 18:48:17 +08:00
数组为什么可以根据索引快速访问到数据? 因为内存支持随机读取 😂
v2eb
2023-07-28 18:55:30 +08:00
@coderxy 真有这种人嘛😂
neptuno
2023-07-28 18:55:46 +08:00
我一般都是钻到内存里面,自己去找地址
BeautifulSoap
2023-07-28 18:59:53 +08:00
本来以为 lz 想要问的是内存电路是怎么寻址的,实但仔细想想 lz 可能真的连数组是啥都不懂。。。
oneisall8955
2023-07-28 19:11:04 +08:00
@dragondove 偶尔还是会用到的,不确定数量情况下
dk7952638
2023-07-28 19:23:12 +08:00
看这标题,以为来到了贴吧
xiangbohua
2023-07-28 19:37:12 +08:00
你说了几个问题,你都没给结论,辩论啥
haolongsun
2023-07-28 19:37:52 +08:00
没上过数据结构?底层是数组,再细说是对数组首地址的引用,快速访问到素就是首地址+偏移量*数组元素 sizeof,这就是 O(1),再多说就是 arraylist 的结构就是一个指向堆上数组的指针,一个 len ,一个 cap 。
BanGanExpert
2023-07-28 19:38:28 +08:00
@v2eb 以前本身业务需求多,JavaWeb 上手不又难,造成很多基础不扎实,不清楚基本的数据结构知识,很多人也能进入行业做开发。当然现在新人水平普遍是专业对口毕业的,自然很大程度上都没这个情况了。我以前面试人一般第一个问题就是,你写 Java 用了哪些线性结构的集合实现,分别在哪种场景,除了当普通集合还能干嘛( Stack 、Heap 、Queue )。
xhinliang
2023-07-28 19:40:28 +08:00
挺好,又 block 一个人
strrng
2023-07-28 19:43:00 +08:00
OP 感觉多少是有点搞笑了😄
zcm3579
2023-07-28 19:50:51 +08:00
辩了个勾巴 , 脑残就不要发帖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/960605

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX