Thinking in java基础之集合框架


大家都知道我的习惯,先上图说话。

  1. 集合简介(容器)
    把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫容器)。然后呢,我们按照不同的方法装,就是不同的框架。

    换句话说,集合框架就是数据结构的实现。

  2. 链表(数据结构)
    LinkedList的结构

    public class chain {private class Data{private Object obj;private Data next = null;Data(Object obj){this.obj = obj;}
    }
    private Data first = null;
    public void insertFirst(Object obj){Data data = new Data(obj);data.next = first;first = data;
    }public Object deleteFirst() throws Exception{  if(first == null)throw new Exception("empty!");  Data temp = first;first = first.next;return temp.obj;
    }  public Object find(Object obj) throws Exception{  if(first == null)  throw new Exception("LinkedList is empty!");  Data cur = first;  while(cur != null){  if(cur.obj.equals(obj)){  return cur.obj;  }  cur = cur.next;  }  return null;
    }  public void remove(Object obj) throws Exception{  if(first == null)  throw new Exception("LinkedList is empty!");  if(first.obj.equals(obj)){  first = first.next;  }else{  Data pre = first;  Data cur = first.next;  while(cur != null){  if(cur.obj.equals(obj)){  pre.next = cur.next;  }  pre = cur;  cur = cur.next;  }  }
    }  public boolean isEmpty(){  return (first == null);
    }
    public void display(){if(first == null)System.out.println("empty");Data cur = first;while(cur != null){System.out.print(cur.obj.toString() + " -> ");cur = cur.next;}System.out.print("\n");
    }
    public static void main(String[] args) throws Exception {chain ll = new chain();ll.insertFirst(4);ll.insertFirst(3);ll.insertFirst(2);ll.insertFirst(1);ll.display();ll.deleteFirst();ll.display();ll.remove(3);ll.display();System.out.println(ll.find(1));System.out.println(ll.find(4));
    }
    }

3.Collection

  • ①List
    保存输入的顺序,而且可以重复的存储相关元素。
    ArrayList(随机访问)(数组线性表)
    ArrayList数组线性表的特点为:类似数组的形式进行存储,因此它的随机访问速度极快。
    ArrayList数组线性表的缺点为:不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。可以这样理解ArrayList就是基于数组的一个线性表,只不过数组的长度可以动态改变而已。ArrayList线程不安全,
    LinkedList(频繁删除添加)(链式线性表)
    您要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现更好。
    可以这样理解LinkedList就是一种双向循环链表的链式线性表,只不过存储的结构使用的是链式表而已。
    Vector(向量)
    如果一定在多线程使用List的,您可以使用Vector,因为Vector和ArrayList基本一致,区别在于Vector中的绝大部分方法都使用了同步关键字修饰,这样在多线程的情况下不会出现并发错误哦,还有就是它们的扩容方案不同,ArrayList是通过原始容量*3/2+1,而Vector是允许设置默认的增长长度,Vector的默认扩容方式为原来的2倍。
    切记Vector是ArrayList的多线程的一个替代品。
    Stack(栈)
    在各种List中,最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList();Vector总是比ArrayList慢,所以要尽量避免使用。使用最多的是ArrayList。
  • ②Set
    Set子接口: 无序,不允许有重复的元素,最多允许有一个null元素对象。
    HashSet(没有顺序)
    您会使用 HashSet 存储重复自由的集合。考虑到效率,添加到 HashSet 的对象需要采用恰当分配哈希码的方式来实现hashCode()方法。虽然大多数系统类覆盖了Object中缺省的hashCode()和equals()实现,但创建您自己的要添加到HashSet的类时,别忘了覆盖 hashCode()和equals()。
    LinkedHashSet(添加顺序会被记录)
    如果想跟踪添加给HashSet的元素的顺序,LinkedHashSet实现会有帮助。 按照元素的插入顺序来访问各个元素。它提供了一个可以快速访问各个元素的有序集合。
    TreeSet(按照比较器排序)
    当您要从集合中以有序的方式插入和抽取元素时,TreeSet实现会有用处。
    为了能顺利进行。添加到TreeSet的元素必须是可排序的。
  • 在各种Set中,HashSet通常优于TreeSet(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。
    TreeSet存在的唯一理由:能够维护其内元素的排序状态。
  • ③Queue(队列)

4.Map
Map接口用于维护键/值对(key/value pairs)。该接口描述了从不重复的键到值的映射。
HashMap
在Map 中插入、删除和定位元素,HashMap 是最好的选择。
LinkedHashMap(包含插入顺序)
以插入顺序将关键字/值对添加进链接哈希映像中
TreeMap(自定义顺序)
但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
WeakHashMap
它使用WeakReference(弱引用)来存放哈希表关键字。使用这种方式时,当映射的键在 WeakHashMap 的外部不再被引用时,垃圾收集器会将它回收,但它将把到达该对象的弱引用纳入一个队列。WeakHashMap的运行将定期检查该队列,以便找出新到达的 弱应用。当一个弱引用到达该队列时,就表示关键字不再被任何人使用,并且已经被收集起来。然后WeakHashMap便删除相关的映射。
HashTable

  • 在各种Map中HashMap用于快速查找,使用的最多。

    1. Array
      我们都知道,由于Array(数组)通常意义上讲只是一个单纯的线性序列,又基于Native(本地方法),凭此它的效率历来便号称Java中最高。所以通常我们也都承认Java中效率最高的存储方式就是使用数组。但是,由于数组初始化后大小固定,索引不能超出下标,缺少灵活的扩展功能等原因,使得很多人放弃了数组的使用, 转而使用Collection,List,Map,Set等接口处理集合操作。
  • 当元素个数固定,用Array,因为Array效率是最高的。
    1. 比较器(Comparator和Comparable接口)
      在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer
      等Java内建类实现 Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过 Comparator接口来定义您自己的比较方式。
      Comparable接口
      在java.lang包中,Comparable接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。
      (1) int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负
      值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值
      在 Java 2 SDK版本1.4中有二十四个类实现Comparable接口。下表展示了8种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。
      类排序 BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short 按数字大小排序
      Character 按 Unicode 值的数字大小排序
      String 按字符串中字符 Unicode 值排序
      利用Comparable接口创建您自己的类的排序顺序,只是实现compareTo()方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖equals()和hashCode()以确保两个相等的对象返回同一个哈希码。
      Comparator接口
      若一个类不能用于实现java.lang.Comparable,或者您不喜欢缺省的Comparable行为并想提供自己的排序顺序(可能多种排序方式),你可以实现Comparator接口,从而定义一个比较器。
      (1)int compare(Object o1, Object o2): 对两个对象o1和o2进行比较,如果o1位于o2
      的前面,则返回负值,如果在排序顺序中认为o1和o2是相同的,返回0,如果o1位于o2的
      后面,则返回正值“与Comparable相似,0返回值不表示元素相等。一个0返回值只是表示两个对象排在同一位置。由Comparator用户决定如何处理。如果两个不相等的元素比较的结果为零,您首先应该确信那就是您要的结果,然后记录行为。”
      (2)boolean equals(Object obj): 指示对象obj是否和比较器相等。
      “该方法覆写Object的equals()方法,检查的是Comparator实现的等同性,不是处于比较
      状态下的对象。”
    2. Iterator(迭代模式)
      调用iterator()方法,返回Iterator<T>对象,Iterator<T>对象有hasnext();next();方法提过循环
      Collection接口有iterator()方法。Map.entrySet()返回Set<Map.Entry<K,V>>,然后调用Collection对应的iterator();方法。
      Iterator iterator = Collection.iterator();
      while(iterator.hasNext()) {
      Object iter=iterator.next();
      System.out.println("object=" +object);
      }
      Iterator iterator = Map.entrySet().iterator();
      while (iterator .hasNext()) {
      Map.Entry entry = (Map.Entry) iterator .next();
      Object key = entry.getKey();
      Object value = entry.getValue();
      System.out.println("key=" + key + " value=" + value);
      }
    3. 工具类Collections and Arrays(静态方法)
      Collections(常用方法)
      addAll添加
      shuffle混排
      binarySearch二分查搜索法
      reverse反转
      fill 替换
      max/min 找出最大/最小(根据默认的自然排序或者自定义排序规则)
      sort排序(根据默认的自然排序或者自定义排序规则)
      Arrays
      binarySearch二分搜索法
      sort排序
      copyOf复制
      equals判断相等
      fill指定分配、替换
      toString 返货字符串
      hashCode哈希吗
      详情参考中文API oracle官网API
    4. 总结
      在实际工作中,若用到集合框架,最常用的是ArrayList,HashSet,HashMap。这三者也是首先考虑的。而且,因为TreeXXX继承SortedXXX,所以用TreeXXX都是排序的。
    5. 参看文献
      java集合框架的讲解
      JAVA中关于链表的操作和基本算法
      java的集合框架最全详解(图)
      集合_java集合框架
      《Thinking in java》
      《算法与数据结构》-------java语言描述 清华大学出版社

作者: 慕晓白 
链接:http://www.imooc.com/article/7577
来源:慕课网

Thinking in java基础之集合框架相关推荐

  1. java把map值放入vector_Thinking in java基础之集合框架

    Thinking in java基础之集合框架 大家都知道我的习惯,先上图说话. 集合简介(容器) 把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成 ...

  2. 7.Java基础之集合框架+JDK8新特性

    1.集合概述 1.1 为什么学集合 思考:数组有什么缺点? 长度一旦定义,不能改变!定义大了,浪费空间:小了,可能不够 ---->动态的数组 对于增删,需要移动位置 ->有人帮我们做这个事 ...

  3. java基础复习-集合框架(1)

    java集合概述 Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素:另一个是 Map 接口,主要用于存放键值对.对于Collection ...

  4. Java基础_集合框架1

    一.集合框架(体系概述) 为什么会出现集合框架(集合类)? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合框架 ...

  5. Java基础(集合框架——Collection、List、Set、泛型)

    为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多 个对象的操作,就对对象进行存储,集合就是存储对象常用的一 种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储 ...

  6. java基础_集合框架

    集合:例如 偶数.水仙花数.奇数,班集体 都属于集合 还有{"111","sss",aaa"}也是集合 集合框架JCF(java collection ...

  7. 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet

    一.集合的特点 二.继承结构图 三.List集合 1.特点     2.ArrayList类     3.LinkedList类     4.两者的对比     5.集合的遍历 四.Set集合 1.特 ...

  8. Java的并发集合框架

    文章目录 一.并发集合框架 1. 简介 2. 接口Iterable 2. 接口Collection 3. 接口List 4. 接口Set 5. 接口Queue 6. Deque 二.非阻塞队列 1. ...

  9. Java SE day14_集合框架4

    Java SE day14_集合框架4 Map集合的特点: Map集合的功能概述 ==HashMap中嵌套HashMap== 1:Hashtable和HashMap的区别? Collections集合 ...

最新文章

  1. PHP 安全email
  2. Thrust快速入门教程(一)——简介
  3. Winform中设置ZedGraph曲线图的水平与竖直参考线
  4. java 内联调用深度_Java中内联虚拟方法调用的性能
  5. 【Linux】宝塔Linux面板命令大全
  6. 辗转相除求最大公约数最小公倍数 扩展欧几里得算法
  7. python做些什么项目内容_现在比较流行的python做什么项目最适合?
  8. OPENCV用户手册之图像处理部分(之四):滤波器与色彩转换(中文翻译)
  9. 【通信】基于matlab Alamouti空频编码【含Matlab源码 801期】
  10. Black-Scholes-Merton欧式期权定价公式
  11. python爬虫做毕业设计_毕业设计之 --- 爬虫
  12. 阴阳师手游如何用云手机无限多开换IP防封
  13. Dubbo学习之DubboService
  14. 基于人本理念的绩效管理体系设计(一)
  15. Discuz论坛下载与安装
  16. DSShop单店铺商城B2C功能列表清单
  17. hbase的系统表、分裂、下载和上传
  18. python-pygame:实现飞机大战详情(含源码)
  19. 图说Twitter简史 Twitter四周年回顾
  20. 安装Android studio时遇到的问题

热门文章

  1. 电信用户流失预测案例(2)(特征工程)
  2. 数据挖掘十大经典算法之——AdaBoost 算法
  3. 卷积神经网络的网络结构——以LeNet-5为例
  4. LambdaMART的思想
  5. 从谷歌的招聘中,我们学到了什么?
  6. 快递信息css3手风琴代码_用纯CSS实现手风琴效果的示例代码
  7. jvm性能调优 - 16案例实战_每日上亿请求量的电商系统 年轻代垃圾回收参数如何优化
  8. 深入理解分布式技术 - 消息幂等性如何保障不重复消费
  9. Spring-AOP 流程切面
  10. Spring-基于注解的配置[02自动装载bean]