java中List、Set、Map之间的关系

java中关于实现数组有许多种方法,诸如ArrayList,Hashmap,Linklist....此类太多的数组类型实在是让人晕头转向,很难掌握其要点.今天我就带大家来整理一下List,set,map之间的区别和联系:

首先说明一下他们之间所有的所属关系:

1.Collection接口之下有List和Set两个接口

List接口:以特定顺序存储

List的实现类:ArrayList、LinkList、Vector

Set接口:不能包含重复的元素

List的实现类:HashSet、TreeSet

2.Map接口

HashMap、HashTable、TreeMap

 分别讲解

一,Conllection:

接下来先看一下Collection接口:

他有两个子接口,Set和List,

1,Set(公共特点;无序)

是一个无序的集合接口,并且元素不可重复,当然,这里的无序是针对放入顺序而言,并不是绝对的无序,他有两个子类,一个是hashSet,还有一个是继承了SortedSet接口的TreeSet,这两个set集合有什么特点呢?

首先,hashSet的底层是hashmap,他有着hashmap中键的特性,那就是,无序,不可重复性,

其次,treeset实现了sortset接口,sortedset有排序能力,也就意味着treeset也有着排序的能力,他是使用二叉树进行排序的。

2,list(有序):

list接口也有两个子类,一个是arraylist,一个是linkedList,

首先arralist的底层是object[]是一个数组,也就意味着他有着数组的特性,但是和数组相比他比数组灵活,无需设置长度,他是有序的,所以查找块,增删比较慢,

和arralist其实有一个兄弟叫vector,他和arralist是一样的

Vector是线程安全的,也就是说是它的方法之间是线程同步的,而arralist线程是异步的也就是说他是不安全的,但是效率高,相比之下,建议使用arralist.,
linkedlist:
他底层是以链表的形式进行排序的,两个元素之间就如同链子一样前关联,如果进行增删操作的时候,只需要将某个元素替换然后将后边的关联简单修改就可以完成,所以说建议查询用arralist,增删用linkedlist;
二,map(公共特点特点:以键值对的形式存储,):
简单来讲常用的map类的集合也有三个,常用的有三个子类实现了mapj接口:map存在的意义就是为了快速查找,通过键的直接找到值,因为键是不可重复的。
1,hashMap和hashtable:
两者放在一起比较(底层都是hash表结构):hashmap线程是不安全的允许键值对为null,二hashtable线程是安全的不允许键值对为null,两者的其他属性是一样的,所以两者的使用要看具体的情况而定,
2,treemap(底层是二叉树),线程不同步,可用于给Map集合中的键进行排序.

Java 里什么时候使用 List、Set 和 Map?

基于以上我们对 Set、List 和 Map 的理解,现在我们可以决定什么时候使用 List、Set 还是 Map 了。

  1. 如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问。
  2. 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
  3. 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
  4. 如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择

猜你喜欢

转载自blog.csdn.net/weixin_42504145/article/details/83119088