Java常用集合的总结,集合中的(交集,并集,差集,补集,对称差集)

简介: Java常用集合的总结,集合中的(交集,并集,差集,补集,对称差集)

集合中的(交集,并集,差集,补集,对称差集)老是会弄混了

image.png常用的集合类有一下几种:


List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类


Map结构的集合类:HashMap类,Hashtable类


Set结构的集合类:HashSet类,TreeSet类


Queue结构的集合:Queue接口


20180604215335842.png

20180604215401807.png

如果要求线程安全,使用Vector,Hashtable


如果不要求线程安全,使用ArrayList,LinkedList,HashMap


如果要求键值对,则使用HashMap,Hashtable


如果数据量很大,又要求线程安全考虑Vector


HashTable 和 HashMap 是 Map 的实现类  

HashTable 是线程安全的,不能存储 null 值  

HashMap 不是线程安全的,可以存储 null 值


1.ArrayList: 元素单个,效率高,多用于查询


2.Vector:    元素单个,线程安全,多用于查询


3.LinkedList:元素单个,多用于插入和删除


4.HashMap:   元素成对,元素可为空


5.HashTable: 元素成对,线程安全,元素不可为空


ArrayList


底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。


而在LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。


双向循环链表的查询效率低但是增删效率高。


ArrayList和LinkedList在用法上没有区别,但是在功能上还是有区别的。


LinkedList


经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。


队列:先进先出的数据结构。


栈:后进先出的数据结构。


注意:使用栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。


Vector


(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)


结论:在考虑并发的情况下用Vector(保证线程的安全)。


在不考虑并发的情况下用ArrayList(不能保证线程的安全)。


几种重要的接口和类简介


1、List(有序、可重复)

List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。


2、Set(无序、不能重复)

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。


3、Map(键值对、键唯一、值不唯一)

Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。


Map集合


实现类:HashMap、Hashtable、LinkedHashMap和TreeMap


HashMap


HashMap是最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的


Hashtable


Hashtable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。


ConcurrentHashMap


线程安全,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。


LinkedHashMap


LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。


TreeMap


TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的;


主要实现类区别小结

Vector和ArrayList


1,vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。


2,如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%。如果在集合中使用数据量比较大的数据,用vector有一定的优势。


3,如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,如果频繁的访问数据,这个时候使用vector和arraylist都可以。而如果移动一个指定位置会导致后面的元素都发生移动,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据时其它元素不移动。


ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快,插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快。


Arraylist和Linkedlist

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。


HashMap与TreeMap

1、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。


2、在Map 中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。

两个map中的元素一样,但顺序不一样,导致hashCode()不一样。

同样做测试:

在HashMap中,同样的值的map,顺序不同,equals时,false;

而在treeMap中,同样的值的map,顺序不同,equals时,true,说明,treeMap在equals()时是整理了顺序了的。


HashTable与HashMap

1、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。

2、HashMap允许存在一个为null的key,多个为null的value 。

3、hashtable的key和value都不允许为null。


Map的遍历方法:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Stack;
/**
 * 
 * @Description :Map的遍历方式
 * @author Bush罗
 * @date 2018年2月26日
 *
 */
public class Main {
  public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    for (int i = 0; i < 10; i++) {
      map.put(""+i, "@sohu.com"+i);
    }
    System.out.println("普通的遍历方法,通过Map.keySet遍历key和value");// 普通使用,二次取值
    for (String key : map.keySet()) {
      System.out.println("key= " + key + " and value= " + map.get(key));
    }
    System.out.println("通过Map.entrySet使用iterator遍历key和value:");
    Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
    while (it.hasNext()) {
      Map.Entry<String, String> entry = it.next(); 
      System.out.println("key= " + entry.getKey() + " and value= "
          + entry.getValue());
    }
    System.out.println("通过Map.entrySet遍历key和value"); // 推荐这种,特别是容量大的时候
    for (Map.Entry<String, String> entry : map.entrySet()) {
      System.out.println("key= " + entry.getKey() + " and value= "
          + entry.getValue());
    }
  }
}

List遍历方式:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Stack;
/**
 * 
 * @Description :List的遍历方式
 * @author Bush罗
 * @date 2018年2月26日
 *
 */
public class Main {
  public static void main(String[] args) {
     ArrayList<String> list = new ArrayList<String>();  
          System.out.println("----------add-----------");  
          list.add("小明");  
          list.add("小红");  
          list.add("小芳");  
          //for循环遍历  
          for (int i = 0; i < list.size(); i++) {  
              String str = list.get(i);  
              System.out.println(str);  
          }  
          //iterator迭代器遍历  
          Iterator<String> it = list.iterator();  
          while(it.hasNext()){  
              String str = it.next();  
              System.out.println(str);  
          }  
          //foreach循环  
          for (String name : list) {  
              System.out.println(name);  
          }  
  }
}
相关文章
|
11天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
32 5
|
23天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
34 4
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
32 2
|
1月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
1月前
|
Java 开发者
|
2月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
66 5
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
33 0
|
1月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
39 0