数据结构有哪些是内存连续,哪些内存不延续?
1 个回答
有些东西不需要答案,态度就是答案。小五# 内存连续(单块顺序存放) * 一维原始类型数组:`byte[] / short[] / int[] / long[] / char[] / float[] / double[] / boolean[]` * 一维引用数组:`Object[]`(连续的是**引用槽位**,真正对象散落在堆上) * `ArrayList`(内部 `Object[]` 连续;扩容时整块复制) * `Vector`、`Stack`(继承自 `Vector`,内部数组连续) * `ArrayDeque`(环形数组实现,底层连续) * `PriorityQueue`(二叉堆,底层 `Object[]` 连续) * `ArrayBlockingQueue`(定长数组,连续) * `CopyOnWriteArrayList`(底层数组连续;写时整体拷贝) * `BitSet`(底层 `long[]` 连续) * `AtomicIntegerArray / AtomicLongArray / AtomicReferenceArray`(包装的数组连续) * `EnumSet`(`RegularEnumSet` 用位图一个 `long`;`JumboEnumSet` 用 `long[]`,连续) * `IdentityHashMap`(开放寻址,底层交替存放 key/value 的 `Object[]`,连续) * `ByteBuffer` * `HeapByteBuffer`:底层 `byte[]` 连续(在堆内) * `DirectByteBuffer` / `MappedByteBuffer`:堆外一块连续区域 # 非连续(节点分散,通过指针/引用连接) * `LinkedList`(双向链表,节点对象分散) * `LinkedBlockingQueue / LinkedBlockingDeque`(链表节点分散) * `ConcurrentLinkedQueue / ConcurrentLinkedDeque`(无锁链表,节点分散) * 树与哈希类(“混合”:**桶数组连续**,桶内节点/树**不连续**) * `HashMap` / `LinkedHashMap`(`Node[]` 连续;链表/树节点分散) * `ConcurrentHashMap`(段/桶数组连续;节点/树分散) * `WeakHashMap`(表数组连续;条目链表分散) * `HashSet` / `LinkedHashSet`(基于上述 `Map`,同理) * `TreeMap` / `TreeSet`(红黑树节点分散) # 特别说明 * 多维数组:`int[][]` 是“数组的数组”。外层 `int[][]` 自身连续,但每个内层 `int[]` 各自是独立连续块,整体**不是一块大矩阵**。 * `String` / `StringBuilder` / `StringBuffer`:内部都有**连续**的缓冲区(JDK8 为 `char[]`;JDK9+ 为 `byte[] + coder`)。`String` 不可变,`StringBuilder/Buffer` 会按需扩容复制。 * “连续”不代表对象本体连续:例如 `ArrayList<Foo>` 连续的是**引用**,`Foo` 对象本身在堆上分散。 # 选型原则(性能直觉) * 需要高效随机访问/遍历、良好缓存局部性:优先“数组系”(`ArrayList`、`ArrayDeque`、`PriorityQueue`、各类 `*Array`)。 * 需要频繁头部插入/删除或跨线程无锁入队:链表/无锁队列(非连续)更合适,但遍历局部性差。 * 哈希/树:查找/插入复杂度友好,但节点分散、指针跳转多,遍历时缓存命中差于数组结构。发布于 2025-08-18 00:24 •IP属地 甘肃举报评论收藏
公众号进入网站体验更佳

