Java集合中HashMap、TreeMap和HashTable区别是什么?

一、说到三者的区别首先要说一下集合和数组的区别是什么:

1.长度上的区别:集合的长度是可变的,而数组的长度是不可变;

2.内容上的区别:数组可以是基本数据类型的数据,也可以是引用数据类型的数据;而集合只能是引用数据类型数据;

3.元素内容上的区别:数组只能存储同一种数据类型;而集合可以存储不同数据类型(其实集合一般情况下也是存储同一种数据类型);

二、Java集合常见的接口和实现类有哪些?

java常见的集合有List、Set以及Map,但是List和Set都是继承了Collection接口,而Map接口是单独的一个接口,和Collection接口属于同一级别的;

Collection接口集合:

1.List接口:元素按照进入先后有序保存,可以存储重复元素,集合中每个元素都有其对应的顺序索引;包含ArrayList、LinkedList和Vector三种接口实现类:

ArrayList:每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

优点:底层数据结构是数组,查询快(因为地址连续,一旦数据存储好了,查询操作效率会比较高),增删慢;

缺点:非同步,线程不安全,效率高;

LinkedList:它是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。

优点:底层数据结构是链表,查询慢(因为LinkedList要移动指针,所以查询操作性能比较低),增删快(地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,新增和删除操作add和remove比较快);

缺点:非同步,线程不安全,效率高;

Vector:它与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。

优点:底层数据结构是数组,查询快,增删慢;

缺点:同步,线程安全,效率低;

注意:Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

Map接口集合:Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null,所以通过指定的key就可以取出对应的value。主要实现类有:HashMap、HashTable、TreeMap、LinkedHashMap以及IdentityHashMap和WeakHashMap等;

注意: Map 没有继承 Collection 接口,一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value 。

1.HashMap和HashTable

这两者的区别主要在于以下几个方面:

不同点:

(1)父类不同:HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口;

(2)Hashtable不允许null值(包括键或值),HashMap允许一个空键(其他的空键会覆盖第一个空键)和任意数量的空值;

(3)Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别;所以就意味着Hashtable是线程安全的,Hashtable效率较低;HashMap不是线程安全的,HashMap效率较高;

 如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized关键字,而HashMap的源码中则没有。

(4)HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法;

相同点:

(1)为了成功的在HashMap和Hashtable中存储和获取对象,用作key的对象必须实现hashCode()方法和equals()方法;

(2)HashMap和HashTable的数据元素是无序的;

(3)HashMap和Hashtable的底层实现都是数组+链表结构实现;

HashMap工作原理如下:   HashMap基于hashing原理,通过put()和get()方法存储和获取对象。当我们将键值对传递给put()方法时,它调用建对象的hashCode()方法来计算hashCode值,然后找到bucket位置来储存值对象。当获取对象时,通过建对象的equals()方法找到正确的键值对,然后返回对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会存储在链表的下一个节点中。

2.TreeMap集合:有序非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态;

   

TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。

TreeMap也有两种排序方式:  

♦ 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException;

♦ 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序;

 3.LinkedHashMap集合:

LinkedHashMap使用双向链表来维护key-value对的次序(其实只需要考虑key的次序即可),该链表负责维护Map的迭代顺序,与插入顺序一致,因此性能比HashMap低,但在迭代访问Map里的全部元素时有较好的性能。

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页