`
mdxdjh2
  • 浏览: 12278 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA 常用集合内部机制原理

    博客分类:
  • JAVA
阅读更多

对于常用的集合大家都不陌生,但是深入到内部原理可能都是一知半解,通过阅读源码理解如下。

 

ArrayList

ArrayList内部就是一个默认大小为10的动态对象数组容器,每当add一个新数据的时候,如果大于原来的容器大小,则会通过Arrays.copyOf把容器大小增加到原来的1.5倍,以此类推。当可以预知数据大小,可以通过initialCapacity来默认设置动态数据的大小,减少扩容带来的资源消耗。

 

时间复杂度:

get()  -  直接读取下标  -  O(1)

add(E)  -  直接在后面添加  - O(1)

add(idnex, E)  -  插入数据后需要移动后面的数据  -  O(n)

remove(index)  -  删除后需要移动  -  O(n)

 

LinkedList

LinkedList内部是一个双向链表,add新数据的时候,其实就是调用linklast在链表尾部插入数据。删除的时候直接找到对应数据,替换掉链表的前后节点即可。

 

时间复杂度:
get()  -  需要遍历  -  O(n)

add(E)  -  调用linklast直接添加在最后  -  O(1)

add(index, E)  -  需要先查找到原来index位置的数据,再重新指定链表前后的数据  -  O(n)

remove()  -  直接调用removeLast删除最后数据  -  O(1)

remove(index)  -  需要先查找到原来index位置的数据  -  O(n)

 

HashMap



 

HashMap内部其实是一个数组,每个数组下是一个单向链表。HashMap中的数组是一个取名为Entry的类,类包含(key, value, next)这几个属性。存放规则为,数组下标按hash(key)%len获得,取得数组后则查找对应数组的值。HashMap还有个负载因子(默认0.75),当里面数组填满了75%的时候,会进行扩展到原来大小的2倍。

 

那么问题来了,如果在put的时候,取到hash(key)%len的值相等时不就冲突了?

HashMap的处理方法是:原来有一个Entry[0] = A,此时来一个index也是0的B,则会把Entry[0] = B,B.next = A,又来一个C的时候,则会把Entry[0] = C,C.next = B,以此类推。这样Entry就会形成一个链表,取的时候则是遍历链表取值。

 

这里需要提到的是,使用hashMap的时候,引入的key对象必须重写hashCode()和equal()两个函数,原因可以参考源码判断条件(if (e.hash == hash && ((k = e.key) == key || key.equals(k)))),如果hashCode()没重写,则压根找不到对应数组,如果equal()没重写,则无法判断key值的内容是否相等。

 

public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value); //null总是放在数组的第一个链表中
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        //遍历链表
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            //如果key在链表中已存在,则替换为新value
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))){
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        addEntry(hash, key, value, i);
        return null;
}

    

   补充:

   在java8之后hashmap进行了优化:由于单向链表的查询时间复杂度为O(n),在极端情况下可能存在性能问题,于是java8针对链表长度大于8的情况会使用时间复杂度为O(log n)的红黑树进行存储来提升存储查询的效率。

 

LinkedHashMap:

 

 LinkedHashMap内部双向链表和HashMap的结合,支持多种迭代顺序,默认按插入顺序,也可以按访问顺序。 

访问顺序(accessOrder=true):调用过get访问的元素会放到链尾,迭代会从链首开始

插入顺序(accessOrder=false):按插入顺序迭代出来

 

TreeMap:

 

 TreeMap内部是基于红黑树实现的,并且默认会通过compareTo按照key类型进行自然排序。TreeSet的低层是TreeMap。

  • 大小: 8 KB
分享到:
评论

相关推荐

    Java集合框架常用集合源代码及其实现

    此外,Java集合框架还包括`Collection`、`Iterable`、`Iterator`等接口,它们定义了通用的操作和迭代机制。`Collections`工具类提供了大量静态方法,可以用来操作集合,如排序、填充、复制等。 总的来说,Java集合...

    java对象集合转json格式

    博文可能深入分析了Jackson库的源码,解释了其内部的工作原理,如对象映射机制、序列化过程等,这对于理解JSON转换的底层逻辑非常有帮助。 8. **工具** 除了库,还有一些在线工具可以辅助开发者快速转换JSON和...

    Java 集合类 简单Demo

    最后,对于源码部分,可能讲解了集合类的内部实现原理,例如`ArrayList`如何通过扩容机制保证添加元素,`HashMap`的冲突解决策略——开放寻址法或链地址法,以及`TreeSet`的红黑树平衡算法。 总的来说,这个示例...

    Java集合框架详解

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一种高效、灵活的方式来存储和操作数据。...此外,深入学习集合框架的源码,可以进一步理解其内部实现机制,有助于编写更高效、更优化的代码。

    Java常用类源码

    以上只是Java常用类的一部分,实际上还有很多其他重要的类,如`ArrayList`的同胞`Vector`,线程安全的`ConcurrentHashMap`,网络编程中的`Socket`和`ServerSocket`等。通过深入学习这些类的源码,不仅可以提高编程...

    Java集合容器面试题(2020最新版)陆小马功钟浩.pdf

    了解集合框架的原理、特点、常用类及其实现的内部机制,对于通过Java集合相关的面试题至关重要。通过深入理解集合框架的实现细节,程序员可以在实际开发中做出更加合适的选择,编写出更加高效和可维护的代码。

    java的集合详解!!!

    Java的集合详解 Java集合框架是Java编程语言中不可或缺的一部分,它为数据存储和操作提供了丰富的接口和类。...理解和掌握这些集合类及其内部工作原理,对于提升Java编程效率和代码质量具有重要意义。

    Java集合排序及java集合类详解.doc

    这篇文档将深入解析Java集合的实现机制,并详细阐述其中的类与接口,包括Collection、List、Set和Map。 1. 集合框架概述 Java集合框架是一个统一的体系,它为数据结构(如数组、链表、树等)提供了通用的接口和实现...

    java常用类库源码

    源码是理解这些类库工作原理的关键,它可以帮助开发者深入学习Java的内部机制,并提高编程技能。下面,我们将深入探讨Java的一些常用类库及其源码。 1. **集合框架**:Java的集合框架包括ArrayList、LinkedList、...

    java 特效 集合

    8. **性能优化**:了解集合的内部原理和操作效率对于优化游戏性能至关重要。例如,如果频繁进行插入和删除操作,LinkedList可能比ArrayList更合适;如果需要快速查找,HashMap则优于LinkedList。 总的来说,Java...

    28个java常用的类库源码

    在这个“28个java常用的类库源码”压缩包中,你将找到一些核心且实用的Java工具类源码,这对于学习、理解和优化你的Java代码非常有帮助。下面我们将详细探讨这些类库及其可能包含的知识点。 1. **集合框架**: ...

    02-Java集合容器面试题(2020最新版)-重点.pdf

    - **线程安全**:某些集合类如`Vector`、`Hashtable`等内部采用了同步机制来保证线程安全。 - **非线程安全**:`ArrayList`、`LinkedList`等不是线程安全的,但在多线程环境中可通过外部同步机制来保证线程安全。 #...

    大型国企内部Java面试题

    主要是Java后端的,16K左右的,涉及...Redis:集群底层原理、持久化内部机制等 多线程、集合等 内容过多,就不一一例举。整理不易,互相努力 公司名就不说了,怕被查到,最近这块抓的比较严,不知道算不算泄漏公司机密

    Java 集合学习指南 - v1.1.pdf

    Java集合框架是Java编程中不可或缺的一部分,它提供了一组用于存储和操作对象的高效数据结构。...在阅读本书的过程中,读者将会深入了解到Java集合的内部工作机制,从而能够更加熟练地运用这些工具。

    28个java常用的工具类源码

    Java编程语言中有许多工具类库,它们为开发者提供了丰富的功能,极大地提高了开发效率。这些工具类通常包含了各种实用方法,可以处理字符串、集合、...通过阅读源码,可以深入了解其内部实现原理,进一步提升编程技能。

    java面试题集合(大综合)

    4. **集合框架**:List、Set、Map接口及其实现类的理解和应用,例如ArrayList、LinkedList、HashSet、HashMap的内部实现原理和性能特点。 5. **多线程**:Java并发编程是面试中的难点,包括线程的创建、同步机制...

    达内it培训 java培训电子书 内部资料 系列4 java核心API(下) pdf

    1. **集合框架**:Java集合框架是编程中最常用的部分,包括List、Set、Map等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。学习这部分内容,你将了解如何有效地存储和操作数据。 2. **多线程**:Java...

    java程序员面试集合

    最后,JVM(Java虚拟机)的内部工作原理也是面试的重点。这包括垃圾回收机制、内存模型(堆、栈、方法区等)、类加载机制以及性能优化策略。面试中可能会让你分析内存泄漏或性能瓶颈,所以理解JVM调优工具(如...

    Java集合排序及java集合类详解(Collection、List、Map、Set)讲解.pdf

    本文将深入探讨Java集合框架,包括Collection、List、Set和Map四大接口,以及它们的实现原理和排序方法。 **1. 集合框架概述** 集合框架是一组接口和类,用于存储、管理和操作对象的容器。这些接口和类为开发者...

Global site tag (gtag.js) - Google Analytics