详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A3

集合详解转自博客:https://www.cnblogs.com/ysocean/p/6555373.html

三大接口:Iterator  ,  Collection ,  Map

1.Collection接口:

Collection是 Set、 List、 Queue和 Deque(Queue: 先进先出队列  Deque: 双向链表)的接口。

基本方法:

boolean add(E e) 添加新元素,但不能添加集合中已有的元素 ,这是考虑到Set中不能有重复的元素。

boolean addAll(Collection<? extends E> c) , 添加某一集合的所有元素到该集合中。 (如果添加的集合中有和本集合重复的元素怎么办?)

boolean contains(Object o)  如果集合中包含指定元素那么返回true。特别的,如果集合中也包含NULL元素的时候并且要查找的元素也是NULL的时候也返回true。

boolean containsAll()  ,  boolean isEmpty()  ,  void clear() 等等

1.1  List接口

List接口在Collection的基础上添加了一些方法,重写了一些列函数,使得可以在List的中间插入和移除元素。

和Set集合不同的地方是:有序,允许重复元素

List的常见实现类:

(1)ArrayList:

List<E> alist = new ArrayList<>();

底层数据结构是数组,查询快,增删慢;线程不安全,效率高

它善于随机访问元素,但是在List的中间插入和移除元素时较慢。

(2)LinkedList:

List<E>  llist = new LinkedList<>();

底层数据结构是链表,查询慢,增删快;线程不安全,效率高

它通过代价较低地在List中间进行插入和删除工作,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。

(3)Vector:

List<E>  vlist = new Vector<>();

底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合

1.2  Set接口

Set与List不同点:无序(不是普通意义上的无序,具体可以看顶部的博客),不允许重复元素

Set不保存重复的元素,Set中最常被使用的是测试归属性,你可以很容易地询问某个对象是否在某个Set中。正因为如此,查找成为了Set中最重要的操作,因此通常会选择一个HashSet的实现,它专门对快速查找进行了优化。

Set具有与Collection完全一样的接口,因此没有额外功能。实际上Set就是Collection,只是行为不同(继承与多态的表现)。

Set的实现类:

(1)HashSet:底层数据结构是哈希表(是一个元素为链表的数组) 。

它是Set的典型实现,不能保证元素的顺序,不可重复,不是线程安全的,集合元素可以为NULL

 (2)TreeSet:底层数据结构是红黑树(是一个自平衡的二叉树)。保证元素的排序方式 ,不可重复,善于范围查询

                          *  如果使用 TreeSet() 无参数的构造器创建一个 TreeSet 对象, 则要求放入其中的元素的类必须实现 Comparable 接口,所以 在其中不能放入 null 元素

(3) LinkedHashSet:底层数据结构由哈希表和链表组成。不可以重复,有序

因为底层采用 链表 和 哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性

以上三个 Set 接口的实现类比较:
  共同点:1、都不允许元素重复
      2、都不是线程安全的类,解决办法:Set set = Collections.synchronizedSet(set 对象)
 
 
  不同点:
    HashSet:不保证元素的添加顺序,底层采用 哈希表算法,查询效率高。判断两个元素是否相等,equals() 方法返回 true,hashCode() 值相等。即要求存入 HashSet 中的元素要覆盖 equals() 方法和 hashCode()方法
 
    LinkedHashSet:HashSet 的子类,底层采用了 哈希表算法以及 链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于 HashSet    
 
    TreeSet:不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用 红-黑 树算法(树结构比较适合范围查询)
 public void setrun(){
//HashSet中的数据不按添加顺序存储
HashSet<Integer> hset =new HashSet<>();
hset.add(88);
hset.add(8);
hset.add(888); System.out.println(hset); //LinkedHashSet中的数据按照添加顺序存储
LinkedHashSet<Integer> lhset = new LinkedHashSet<>();
lhset.add(88);
lhset.add(8);
lhset.add(888); System.out.println(lhset); //TreeSet中的数据会进行排序
TreeSet<Integer> tset = new TreeSet<>();
tset.add(88);
tset.add(8);
tset.add(888); System.out.println(tset);
}

2.Map:key-value 的键值对,key 不允许重复,value 可以

1、严格来说 Map 并不是一个集合,而是两个集合之间 的映射关系。

    2、我们可以把两个集合之间成映射关系的一对数据,看成是一条数据。即 Entry(key,value)。Map 可以看成是由多个 Entry 组成。

    3、因为 Map 集合即没有实现 Collection 接口,也没有实现 Iterable 接口,所以不能对 Map 集合进行 for-each 遍历

4、Map的通用实现类有:HashMap,HashTable,LinkedHashMap,TreeMap,WeakHashMap等等(这里主要实现HashMap)

public void HashMaprun(){
HashMap<Integer,String> hmap = new HashMap<>(); //添加元素到HashMap中
for (int i = 0; i < 10; i++) {
hmap.put(i,"String"+i);
}
System.out.println(hmap); //通过key值删除元素
String str = hmap.remove(3);
System.out.println(str); //通过key值获取元素
str = hmap.get(5);
System.out.println(str); //通过添加已有的key来修改该key中的value
hmap.put(2,"测试2");
str = hmap.get(2);
System.out.println(str); //通过keySet()方法得到key的集合,然后遍历keySet来遍历Value的集合
Set<Integer> keyset = hmap.keySet();
for(Integer i:keyset){
String temp = hmap.get(i);
System.out.print(temp+" -- ");
} System.out.println(""); //通过entrySet()得到Map的Entry集合,然后遍历
Set<Map.Entry<Integer,String>> entries = hmap.entrySet();
for(Map.Entry<Integer,String> entry:entries){
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"<===>"+value);
}
}

2.1 HashMap: 采用哈希表算法,此时Map中的key不会保证添加的先后顺序,key也不允许重复

key判断重复的标准是:key1和key2是否equals为true,并且hashCode相等

2.2  TreeMap:采用红黑树算法,此时Map中的key会按照自然顺序或定制顺序进行排序,key也不允许重复

key判断重复的标准是:compareTo/compare的返回值是否为0

2.3 LinkedHashMap:采用链表和哈希表算法,此时Map中的Key会保证先后添加的顺序,key不允许重复

key判断重复的标准和HashMap相同

2.4HashTable: 采用哈希表算法,是HashMap的前身

在java的集合框架之前,表示映射关系就用HashTable

所有的方法都是用synchronized修饰符,线程安全,但是性能比HashMap第

2.5 Properties: Hashtable的子类,此时要求key和value都是String类型

用来加载资源文件(I/O)

注意:Map和Set集合有很大程度上的相似,都有使用哈希表和红黑树实现的子类

实际上,Set集合就是由Map集合的key组成的。

最新文章

  1. DDD设计中的Unitwork与DomainEvent如何相容?
  2. 内存中OLTP与内存不足
  3. 关于mybatis 在C#.Net中批量增,删,改
  4. 端口占用问题——netstat命令
  5. Asp.Net 之 母版页中对控件ID的处理
  6. ThinkPHP中的视图
  7. (转)Jquery弹窗插件Lhgdialog的用法
  8. 我的Pandas应用场景
  9. Android非常实用的开源项目框架
  10. anaconda安装第三方库
  11. Github-karpathy/char-rnn代码详解
  12. DOM4J使用简介
  13. How tomcat works 读书笔记十七 启动tomcat 下
  14. 高效并发JUC锁-砖石
  15. Js闭包应用场合,为vue的watch加上一个延迟器
  16. css的扩展技术
  17. PHP+Ajax实现文件上传功能
  18. phpBB3.2 自动检测浏览器语言
  19. Python 装饰器实例
  20. [转载]ECMA-262 6th Edition / Draft August 24, 2014 Draft ECMAScript Language Specification

热门文章

  1. java中不定参数的使用
  2. vue的一些小坑
  3. kernel(二)源码浅析
  4. ADC触摸屏
  5. 《Apache kafka实战》读书笔记-kafka集群监控工具
  6. protobuf 编译安装
  7. 如何跨线程调用Windows窗体控件
  8. c++中sizeof的理解
  9. log 的 debug()、 error()、 info()方法
  10. 安装Blend+SketchFlow Preview for Visual Studio 2012出现错误