您好,欢迎访问一九零五行业门户网

Java集合:Set、List、Queue、Map四个体系的归纳总结

java集合大致分为set、list、queue、map四个体系
其中set代表无序、不可重复的集合;list代表有序、重复集合;map代表具有映射关系的集合;queue是队列的实现。
集合和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),集合里面只能保存对象(实际上只是保存对象的引用变量)。
java集合中有两个派生的 接口:collection 和 map
collection集合体系的继承树:
map集合体系的继承树:
下面分别讲述
set集合:
set集合类似一个罐子,程序可以依次将多个对象“丢进”里面,set不会记住元素的添加顺序,set集合不允许有相同的元素。
hashset:
特点:
不能保证元素的排列顺序
hashset不是同步的
集合元素值可以为null
hashset判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的hashcode()方法返回值也相等。
注意:当把一个对象放进hashset中时,如果需要重写该对象的equals()方法,则应该重写其hashcode()方法。规则是:如果两个对象通过equals()方法比较返回true,两个对象的hashcode值应该相同。
linkedset:
linkedset根据原始的hashcode的值来决定元素的存储位置,但是他同时使用链表维护元素的次序,这样使得元素的插入的顺序保存。linkedset会按照元素的添加顺序来访问集合里的元素。
linkedset需要维护元素的插入位置,因此性能会略低于hashset的性能。
treeset:
treeset可以确保集合元素处于排序状态。
treeset并不是根据元素的插入顺序进行排序的,而是根据元素的实际值的大小来进行排序的。
treeset采用红黑树的数据结构来存储集合元素。
treeset支持两种排序方法:自然排序和定制排序。在默认情况下,treeset采用自然排序。
自然排序:treeset会调用集合元素的compareto(object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。在默认情况下,treeset采用自然排序。
当把一个对象加入treeset集合中时,treeset调用该对象的compareto(object obj)方法与容器中的其他对象比较大小,然后根据红黑树结构找到它的存储位置。
判断两个对象是否相等的唯一标准是:两个对象通过compareto(object obj)方法比较是否返回0。
如果两个对象通过equals()方法比较返回true时,这两个对象通过compareto(object obj)方法比较应返回0。
定制排序:如果需要实现定制排序,则需要在创建treeset集合对象时,提供一个comparator对象与该treeset集合关联,由该comparator对象负责集合元素的排序逻辑。
enumset:
enumset的集合元素也是有序的,enumset以枚举值在enum类内部的定位顺序来决定集合元素的顺序。
enumset内部以位向量的形式存储。
enumset集合不允许加入null元素。
各set实现类的性能分析:
hashset的性能总比treeset好,因为treeset需要额外的红黑树算法来维护集合的次序。
linkedset对于普通的插入、删除操作,linkedset比hashset要稍微慢一些,这是由维护链表所带来的额外开销造成的。但是由于有链表,遍历linkedset比较快。
enumset性能最好,但只能保存同一个枚举类得枚举值作为集合元素。
list:
list代表一个元素有序,可重复的结合,集合中的每个元素都有对应的顺序索引。
list集合可以根据位置索引来访问集合中的元素,因此list可以使用for循环来遍历。
arraylist、linkedlist和vector
arraylist源码分析:
linkedlist源码分析:
queue:
queue用于模拟队列这种数据结构。
priorityqueue:
priorityqueue保存队列元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。
priorityqueue不允许插入null元素。
deque:
deque接口是queue接口的子接口,它代表一个双端队列。
当程序中需要使用“栈”这种数据结构时,推荐使用arraydeque。
各种线性表的性能分析:
1.如果需要遍历list集合元素,对arraylist、vector集合,应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于linkedlist集合应该使用迭代器(iterator)来遍历集合元素。
2.如果需要经常执行插入、删除,应使用linkedlist。
3.如果多线程同时访问list集合中的元素,应该使用collections将集合包装成线程安全的集合。
map:
map的key不允许重复,即同一个map对象的任何两个key通过equals方法比较总是返回false。
map中存在一个keyset()方法,用于返回map中所有key组成的set集合。
hashmap、hashtable:
hashmap和hashtable的区别:
1.hashtable是一个线程安全的map,hashmap是非线程安全的,所以hashmap的性能比较好。
2.hashtable不允许使用null作为key和value,hashmap允许使用null作为key或者value。
hashtable、hashmap判断两个key相等的标准是:两个的key的equals()方法返回true,两个key的hashcode值相同;判断两个value相等的标准是value的equals()方法返回值相同。
linkedmap:
linkedmap会记住key-value的添加顺序。
treemap:
treemap也是采用了红黑树的结构,treemap中判断两个key相等的标准是:
两个key通过compareto()方法的返回值为0.(在自然排序下)
两个key通过compareto()方法的返回值为0.同时equals()方法比较返回为true。(定制排序下)。
enummap:
enummap内部以数组的形式保存。
enummap不允许使用null作为key,但是允许value为null。
map的性能分析:
hashmap的性能要比hashtable的性能要好。
treemap中的key-value对总是处于有序状态,无须进行专门的排序操作。
对于一般的运用场景,多考虑使用hashmap。
linkedmap要比hashmap慢,是因为需要维护链表来保持key-value的添加顺序。
enummap的性能最好,但是只能使用同一个枚举类的枚举值作为key。
相关推荐:
java集合set、list、map的遍历方法
一段代码搞懂关于java中list、set集合及map的使用
以上就是​java集合:set、list、queue、map四个体系的归纳总结的详细内容。
其它类似信息

推荐信息