一、Java集合概览

Java中集合分2大块,Collection和Map,分别代表不同功能的集合类对象,整体结构图如下:

Collection
List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
Set

Map
├Hashtable
├HashMap
└WeakHashMap

二、Colleciton

1. List特点及常用类

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

常用类有ArrayList、LinkedList、Vector(线程安全)、Stack(线程安全)。

1.1 ArrayList

ArrayList的内部实现为数组,因此,插入和删除操作效率较低(涉及到元素移位),但查询效率较高。示例代码如下:

  1. package com.yyn.collectionandmap;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.Collections;
  6. import java.util.Comparator;
  7. import java.util.LinkedList;
  8.  
  9. public class ListTest {
  10.  
  11. public static void testArrayList(){
  12. System.out.println("####Begin ArrayList Test####");
  13. ArrayList<String> list = new ArrayList<String>();
  14. for(int i=0;i<10;i++){
  15. list.add("a"+i%3);
  16. }
  17. list.add("a9");
  18. System.out.println("Original: " + list);
  19. System.out.println("contains test:" + list.contains("a2"));
  20. list.remove("a3");
  21. System.out.println("index of a9: " + list.indexOf("a9"));
  22. //对list排序,可用Colletions的静态方法
  23. //list.sort(new MyComparator<String>());
  24. Collections.sort(list, new MyComparator<String>());
  25. System.out.println("After sort: " + list);
  26. System.out.println("####End ArrayList Test####");
  27. }
  28.  
  29. public static void testLinkedList(){
  30. LinkedList<String> list = new LinkedList<String>();
  31.  
  32. }
  33.  
  34. public static void main(String[] args) {
  35. // TODO Auto-generated method stub
  36. testArrayList();
  37. }
  38.  
  39. }
  40.  
  41. class MyComparator<T> implements Comparator<T>{
  42.  
  43. public int compare(T o1, T o2) {
  44. // TODO Auto-generated method stub
  45. int result = o1.toString().compareTo(o2.toString());
  46. if(result < 0)
  47. return -1;
  48. else if (result > 0)
  49. return 1;
  50. return 0;
  51. }
  52. }

1.2 LinkedList

LinkedList内部实现为双向链表,因此,插入和删除效率较高(只需改变前后节点关系),但查询效率较低,适用于改动多,但查询少的场景。

LInkedList的使用方法跟ArrayList类似。

2. Queue特点及常用类

。。。。。。

3. Set特点及常用类

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

Set的常用类有HashSet、TreeSet。

  1. package com.yyn.collectionandmap;
  2.  
  3. import java.util.*;
  4.  
  5. public class ListTest {
  6.  
  7. public static void testArrayList(){
  8. System.out.println("####Begin ArrayList Test####");
  9. ArrayList<String> list = new ArrayList<String>();
  10. for(int i=0;i<10;i++){
  11. list.add("a"+i%3);
  12. }
  13. list.add("a9");
  14. System.out.println("Original: " + list);
  15. System.out.println("contains test:" + list.contains("a2"));
  16. list.remove("a3");
  17. System.out.println("index of a9: " + list.indexOf("a9"));
  18. //对list排序,可用Colletions的静态方法
  19. //list.sort(new MyComparator<String>());
  20. Collections.sort(list, new MyComparator<String>());
  21. System.out.println("After sort: " + list);
  22. System.out.println("####End ArrayList Test####");
  23. }
  24.  
  25. public static void testLinkedList(){
  26. LinkedList<String> list = new LinkedList<String>();
  27.  
  28. }
  29. public static void testHashSet(){
  30. //创建一个线程同步的HashSet对象
  31. //Set<String> set = Collections.synchronizedSet(new HashSet<String>());
  32. Set<String> set = new HashSet<String>();
  33. set.add("xxx");
  34. set.add("yyy");
  35. System.out.println(set);
  36. set.add("xxx");
  37. System.out.println(set);
  38. //若需要对HashSet排序,直接新建一个TreeSet即可,效率较高
  39. TreeSet<String> treeSet = new TreeSet<String>(set);
  40. System.out.println(treeSet);
  41. }
  42.  
  43. public static void main(String[] args) {
  44. // TODO Auto-generated method stub
  45. //testArrayList();
  46. testHashSet();
  47. }
  48.  
  49. }
  50.  
  51. class MyComparator<T> implements Comparator<T>{
  52.  
  53. public int compare(T o1, T o2) {
  54. // TODO Auto-generated method stub
  55. int result = o1.toString().compareTo(o2.toString());
  56. if(result < 0)
  57. return -1;
  58. else if (result > 0)
  59. return 1;
  60. return 0;
  61. }
  62. }

3.1 HashSet

HashSet中的对象是无序的,若需要进行排序,直接利用HashSet创建TreeSet即可。

3.2 TreeSet

三. Map

“集合框架”提供两种常规的 Map 实现:HashMap 和TreeMap。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按顺序遍历键,那么TreeMap 会更好。根据集合大小,先把元素添加到 HashMap,再把这种映射转换成一个用于有序键遍历的 TreeMap 可能更快。

实现类:HashMap、Hashtable、LinkedHashMap和TreeMap

1.HashMap

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

2.Hashtable

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

3.ConcurrentHashMap

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

4.LinkedHashMap

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

5.TreeMap

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

四、主要实现类区别小结

1.Vector和ArrayList

1,vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
2,如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%。如果在集合中使用数据量比较大的数据,用vector有一定的优势。
3,如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,如果频繁的访问数据,这个时候使用vector和arraylist都可以。而如果移动一个指定位置会导致后面的元素都发生移动,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据时其它元素不移动。
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快,插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快。

2.arraylist和linkedlist

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

3.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()时是整理了顺序了的。

4.HashTable与HashMap

1、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
2、HashMap允许存在一个为null的key,多个为null的value 。
3、hashtable的key和value都不允许为null。

01--Java集合知识的更多相关文章

  1. 《面试补习》- Java集合知识梳理

    一.ArrayList ArrayList 底层数据结构为 动态数组 ,所以我们可以将之称为数组队列. ArrayList 的依赖关系: public class ArrayList<E> ...

  2. Java集合知识总结

    集合概述 集合:集合是Java中提供的一种容器,可以用来存储多个数据. 集合和数组的区别: (1)数组长度的是固定的,集合的长度是可变的. (2)数组中存储的都是同一类型的元素.集合存储的都是对象,对 ...

  3. java 集合知识整理

    java集合类图 HashMap和Hashtable的区别   HashMap HashTable  继承方式 extends AbstractMap implements Map extends D ...

  4. Java 集合系列目录(Category)

    下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系 ...

  5. Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

    概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...

  6. Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  7. Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

    概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...

  8. Java 集合系列(四)—— ListIterator 源码分析

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比   Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素.  Iterator 包含四个方法 ...

  9. Java 集合系列(三)—— LinkedList

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 LinkedList    LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列.   它的最基本存储结构是一个节点:每 ...

  10. Java 集合系列01之 总体框架

      Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表.Set ...

随机推荐

  1. JRobin cpu 和 磁盘

    https://blog.csdn.net/li_zhongnan/article/details/3754053 https://blog.csdn.net/li_zhongnan/article/ ...

  2. hdu_1024_糖果大战_201404021640

    糖果大战 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. Codeforces 303A(构造)

    题意:对0到(n-1)这n个数进行全排列.请找出三个全排列a.b.c,使得“a与b的对应元素的和”与“c的对应元素”对模n同余,无解输出-1.(n<=1e5) 分析:n为奇数有解,n为偶数无解 ...

  4. redis 主从备份自动切换+java代码实现类

    转载:http://blog.csdn.net/qq_23430789/article/details/52185706 目录(?)[-] redis-0sentinel实例之间的通讯端口 maste ...

  5. Android Zxing框架扫描解决扫描框大小,图片压缩问题

    在我们是Zxing框架进行二维码扫描的时候,会发现,如今手机随着分辨率的添加.那个扫描框会越来越小,在1920*1280和1280*720还算比較正常.可是三星的几款手机note4,5.S6,等几款手 ...

  6. 完美解决EditText和ScrollView的滚动冲突(上)

    在网上搜了一下EditText和ScrollView的滚动冲突,发现差点儿全部的解决方式都是触摸EditText的时候就将事件交由EditText处理,否则才将事件交由ScrollView处理.这样确 ...

  7. 浅谈API网关(API Gateway)如何承载API经济生态链

    序言 API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的API规模以及调用量,使得企业IT在架构上.模 ...

  8. 从零讲Java,给你一条清晰地学习道路!该学什么就学什么!

                                             从零讲JAVA ,给你一条 清晰地学习道路!该学什么就学什么! 1.计算机基础: 1.1数据机构基础: 主要学习:1. ...

  9. The Open Graph protocol

    https://www.quora.com/What-does-this-tag-mean-html-lang-en-US-prefix-og-http-ogp-me-ns https://stack ...

  10. Data Url生成工具之HTML5 FileReader实现

    百度经验版本号:怎样用HTML5的FileReader生成Data Url 上一篇讲了:用Visual Studio 2010编写Data Url生成工具C#版 今天用HTML5 FileReader ...