JAVA集合只能存放引用类型的的数据,不能存放基本数据类型,int 可以用 Integer代替。

一、集合接口
  1、  Iterable<E> 实现这个接口允许对象成为 "foreach" 语句的目标。
  2、  Collection<E> 接口扩展了Iterable 接口。该接口是Collection 层次结构中的根接口。
         集合类的基本接口 是Collection 接口,该接口有两个基本方法 :   add (向集合添加元素) 和 iterator ( 返回一个实现了Iterator 接口的 对象)。
         还有很多有用的方法,如size、isEmpty、contains 等等。而为了能够让实现者更容易地实现这个接口,java类库提供了一个类 AbstractCollection。它将基础方法size和iterator抽象化了,但是在此提供了例行方法。
  3、  Iterator<E> 接口。对 collection 进行迭代的迭代器。替代了 Enumeration接口。包含三个方法:
    next 、
    hasNext 调用next方法前应该先执行hasNext方法判断是否还有下一个元素
    remove 删除上次调用next方法时返回的元素。

二、具体的集合
以上以Map结尾的实现了Map接口,其它全部实现了Collection接口。
★ArrayList  数组列表 实现了List接口
  另一个动态数组类 Vector类 ,此类的所有方法是同步的,而ArrayList中的方法不是同步的。当不需要同步时使用ArrayList,以节省资源。
数组和数组列表从中间位置删除一个元素要付出很大代价,原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。插入一个元素也是如此。下边的链表解决了这个问题。 
★ LinkedList  链表   实现了List接口
  java中所有链表实际上都是双向链接的,即每个结点还存放着指向前驱结点的引用。这样从链表删除一个元素时只需要对被删除元素附近的结点更新一下即可。

   链表与泛型一个重要区别。链表是有序集合,每个对象的位置十分重要。
   链表不支持快速地随机访问。如果要查看链表中第n个元素,必须从头开始,越过n-1个元素。因此,当需要采用整数索引访问元素时,通常不选用链表。尽管如此,LinkedList类还是提供了一个get方法,用来获取第n个元素,效率当然不高。
★散列集 (HashSet) 
   散列表可以快速地查找所需要的对象,散列表为每个对象计算一个整数,称为散列码。
  在java中散列表用链表数组实现。
   散列表可以用于实现几个重要的数据结构。其中最简单的是set类型。set类型是没有重复元素的元素集合。(保证无重复:当添加元素时如果此 set 没有包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则向该 set 中添加指定的元素 e。如果此 set 已经包含该元素,则该调用不改变此 set 并返回 false。结合构造方法上的限制,这就可以确保 set 永远不包含重复的元素。)
  java集合类库提供了一个HashSet类,实现set接口,实现了基于散列表的集。当不关心集合中元素的顺序时才应该使用HashSet。
★ 树集 (TreeSet)
 TreeSet类与散列集十分类似,不过,树集是一个有序集合。排序是用树结构完成的。
  每次添加元素时,都被放置在正确的位置上。因此,添加到树中比添加到散列表中慢。
   关于对象的比较 传递Comparator对象给TreeSet 构造器。
   与散列集比较,当不需要排序时用散列集,需要时用树集,以节省开销。
★ 队列与双端队列
  队列可以让人们有效地在尾部添加一个元素,在头部删除一个元素。
  双端队列即两个端头,可以有效地在头部和尾部同时添加或删除元素。不支持在中间添加元素。
   Deque接口,由ArrayDeque和LinkedList类实现,这两个类都提供了双端队列。而且必要时可以增加队列的长度。
  优先级队列(PriotiryQueue)
  优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索。也就是说无论何时调用remove方法,总会获得优先级队列中最小的元素。 优先级队列使用数据结构为堆(heap)。堆是一个可以自我调整的二叉树,对树执行添加和删除操作,可以让最小的元素移动到根,而不必花费时间对元素进行排序。d而迭代并不是按照元素的排列顺序访问的。
使用优先级队列的典型示例是任务调度。
★ 映射表
 映射表存放键/值对。
 映射表数据结构实现通过某些键查找与之对应的元素的需求。
 Java类库中两个通用的实现:HashMap和TreeMap。这两个类实现了Map接口。与集一样,如果不需要排序,就选择散列HashMap。
 集合框架没有将映射表本身视为一个集合,而是提供了映射表的视图,这是一组实现了Collection接口对象,或者它的子接口的视图。
这三个视图为:键集(keySet)、值集合(values)和键/值对集(entrySet)。
★ 专用集与映射表集
    1 弱散列映射集。 负责从长期存活的映射表中删除无用的值。
        WeakHashMap 类
    2 链接散列集和链接映射表。用来记住插入元素项的顺序。
    LinkedHashSet类和 LinkedHashMap类
   链接散列映射表用访问顺序而不是插入顺序对映射表条目进行迭代。访问顺序对实现高速缓存的“最近最少使用"原则十分重要。
    3 枚举集和映射表
   EnumSet是一个枚举类型元素集的高效实现。   可以使用Set接口的常用方法修改EnumSet。
EnumMap是一个键类型为枚举类型的映射表。它可以直接且高效地用一个值数组实现。
   4 标识散列映射表
   IdentityHashMap。不同的键对象,即使内容相同,也被视为不同的对象。这个特性可以用来跟踪每个对象的遍历状况。
★ 集合框架
集合有两个基本的接口:Collection 和 Map。
List接口是一个有序集合。
RandomAccess接口。没有任何方法,但可以用来检测一个特定的集合是否支持高效的随机访问。
ListIterator接口定义了一个方法,用于将一个元素添加到迭代器所处位置的前面。
Set接口与Collection接口是一样的,只是其方法的行为有着更严谨的定义。(Set拒绝添加重复元素)。
SortedSet和SortedMap接口暴露了用于排序的比较器对象,并且定义的方法可以获得集合的子集视图。
最后,Java SE 6 引入了接口NavigableSet和NavigableMap,其中包含了几个用于在有序集和映射表中查找和遍历的方法。TreeSet和TreeMap类实现了这几个接口。

★ 遗留的集合
  1 Hashtable类 
   与HashMap作用一样。
  2 枚举 
   Enumeration接口对元素序列进行遍历。有两个方法hasMoreElements和nextElement 类似于Iterator接口的hasNext方法和next方法。
  3 属性映射表
  一个类型非常特殊的映射表结构。3个特性:键与值都是字符串;表可以保存到一个文件中,也可以从文件中加载;使用一个默认的辅助表。
   4 栈
   Stack类。Stack类扩展为Vector类
   5 位集
     BitSet类

我的Java之旅 第五课 JAVA 语言语法 集合的更多相关文章

  1. 我的Java之旅 第六课 JAVA WEB 请求与响应

    一.有关URL编码    1.在URL的规范中定义了一些保留字符,如::  /  ?  & =  @  % 等,在URI中有它的作用.如果要在URI中包含这些字符,必须转码,即%字符后跟十六进 ...

  2. 我的Java之旅 第四课 JAVA 语言语法 基础

    1  整型           int num = 1_000_000; //从java 7开始支持的语法 ,只是让人更易读,java编绎器会去除   2  字符串        一定不能使用==运算 ...

  3. 我的Java之旅 第七课 JAVA WEB 会话管理

    1.隐藏域       隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie    Cookie类    setMaxAge() 设置有效期 ...

  4. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  5. [Java并发编程(五)] Java volatile 的实现原理

    [Java并发编程(五)] Java volatile 的实现原理 简介 在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 sync ...

  6. JAVA中反射机制五(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  7. Java入门篇(五)——Java的字符串/String类

    前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...

  8. Java并发编程(五)-- Java内存模型补充

    前面我们已经介绍了:当对象和变量存储到计算机的各个内存区域时,必然会遇到的两个问题及解决方法 共享对象的可见性-- 解决方法:使用java volatile关键字 共享对象的竞争现象 -- 解决方法: ...

  9. 我的Java之旅 第三课 从Applet到JSP

    一.Applet   Applet是一种特殊的Java程序,它本身不能单独运行(因为本身没有main()),需要嵌入在一个HTML文件中,借助浏览器或者appletviewer来解释执行.   App ...

随机推荐

  1. zoj4110 Strings in the Pocket(manacher)

    传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意:给定两个串$S$和$T$,可以翻转$S$串中的任意一个子段, ...

  2. [CocoaPods]使用Pod Lib创建

    入门 我们将使用pod lib create引导过程来创建整个pod .那么让我们从初始命令开始: pod lib create MyLibrary 注意:要使用您自己的pod-template,您可 ...

  3. 人生苦短之---认识Python

    认识 Python 人生苦短,我用 Python —— Life is short, you need Python 目标 Python 的起源 为什么要用 Python? Python 的特点 Py ...

  4. Python集成开发工具Pycharm的使用方法:复制,撤销上一步....

    复制行,在代码行光标后,输入Ctrl + d ,即为复制一行,输入多次即为复制多行 撤销上一步操作:Ctrl + z 为多行代码加注释#  代码选中的条件下,同时按住 Ctrl+/,被选中行被注释,再 ...

  5. Mysql数据库操作命令行小结

    -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- students表 create ...

  6. 学习DDD之路--勇于纠正自己的错误

    写这篇文章主要是之前三篇对DDD的介绍算是自己学习的一次试水,也希望能够有更多的人能帮我发现其中的问题.昨天继续阅读了DDD书,发现了自己之前的例子存在了一些问题,早上也和园友进行了一些讨论.最后整理 ...

  7. (转)Python中操作mysql的pymysql模块详解

    原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...

  8. 数字对讲系统开发札记(前端linux c 后端 c#)

    前言 数字化是一种趋势,特别是在“提速降费”的大环境下,这种趋势愈发明显.对讲机这种古老的系统也处在时代的变革之中,虽然手机的功能越来越强,让人怀疑对讲机是否还有存在的必要.诚然,对讲机仍然有它的市场 ...

  9. 本地k8s环境minikube搭建过程

    首先要安装docker这个环境是需要自己安装的.相关步骤如下: 1 2 3 4 5 6 7 8 9 10 11 yum install -y yum-utils device-mapper-persi ...

  10. Ubuntu Docker版本的更新与安装

    突然发现自己的docker版本特别的低,目前是1.9.1属于古董级别的了,想更新一下最新版本,这样最新的一下命令就可以被支持.研究了半天都没有更新成功,更新后的版本始终都是1.9.1 :查阅了官网资料 ...