0、写在前面的话

集合是Java的API中非常重要的概念,用来存储多个数据,并实现了不同的数据结构。

Java集合框架中常见的有三大接口:
  • Collection
  • Map
  • Iterator
 

1、Collection

Collection接口是最基本的集合接口,和Map最主要的不同在于,它每次存储的是单个元素,而Map则存储的是键值对。

其下两大常用接口List和Set,还有个用得比较少的Queue:
  • List 有序的集合,元素有序存入
  • Set 无重复的集合,即存入的元素不重复
  • Queue 队列,JDK1.5新增,实现了先进先出的存储结构

1.1 List

List接口是泛型接口,并继承自Collection接口,并扩展出属于自己的方法。元素都是与索引有关系,因此扩展的方法也基本与索引有关:
  • add(int index, E)
  • ...

1.1.1 ArrayList

ArrayList称之为数据列表,其底层采用的是数据方式的存储,它允许任何规则的元素存储,甚至包括null。

其默认初始容量为10(底层为数组),每次新增元素时,都要进行容量检查,如若超过容量则自动扩容为原来的1.5倍。
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
} public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
x
 
1
public boolean add(E e) { 
2
    ensureCapacity(size + 1);  // Increments modCount!!
3
    elementData[size++] = e;
4
    return true;
5
}
6

7
public void ensureCapacity(int minCapacity) {
8
    modCount++;
9
    int oldCapacity = elementData.length;
10
    if (minCapacity > oldCapacity) {
11
        Object oldData[] = elementData;
12
        int newCapacity = (oldCapacity * 3) / 2 + 1;
13
        if (newCapacity < minCapacity)
14
            newCapacity = minCapacity;
15
        // minCapacity is usually close to size, so this is a win:
16
        elementData = Arrays.copyOf(elementData, newCapacity);
17
    }
18
}

1.1.2 LinkedList

和ArrayList不同的在于,LinkedList底层不再是动态数组,而是实现了“链表”的数据结构,每个节点上存放数据信息,也因此拓展了一些方法:
  • addFirst(E element)
  • addLast(E element)
  • ...

同时也因链表的数据接口,其访问不再具有随机性,查找元素无法像ArrayList通过索引来到达,而必须遍历访问。

链表的特点可以轻松地进行插入和删除操作,因为只需要移动指针,相反ArrayList比较麻烦,需要移动数据;但是在查找元素上LinkedList不如ArrayList。

1.1.3 Vector

Vector和ArrayList基本相似,不同的在于Vector是同步的,即它是线程安全的动态数组,而ArrayList是线程异步的,是不安全的

1.2 Set

Set接口继承自Collection接口,其特点是内部元素不重复,且是无序的,即Set中的元素是没有索引的。

Set中对于元素是否重复的判定是通过equals方法来进行比较的,所以往往我们在使用Set时要考虑重写equals方法,另外要注意的是,一旦重写equals方法,一定要同时重写hashCode方法。

1.2.1 HashSet

HashSet查询速度快,其底层是哈希码值hashCode,也因此它不保证Set迭代的顺序。

1.2.2 TreeSet

HashSet不保证元素的顺序,但是TreeSet是可以实现内部元素排序的,但是要求内部元素必须实现Comparable接口,以规定排序的规则。


2、Map

Map和Collection接口不同的在于,其存储的内容是以键值对的形式存在的。所谓键值对,即 key:value 形式,键即你存值的编号,值即存放的数据,显然,如此的存储方式要求key值唯一,不得重复,一旦重复,那么数据会进行覆盖。

常用方法:
  • put(K key, V value)
  • get(Object key)
  • ...

Map类型的遍历,往往通过keySet()方法,返回其key值的集合,再通过key值获取对应的数据。

2.1 HashMap

较常用的Map集合类,key值通过hashCode和equals保证元素的唯一性,但数据是无序的。

2.2 TreeMap

在保证key值不重复的情况下,还可以对value数据进行排序。TreeMap的排序是根据key值来进行的,key值必须实现Comparable接口,即compareTo方法。

2.3 Hashtable

HashMap和Hashtable都实现了Map接口,用法也几乎相同,不同在于:
  • Hashtable自JDK1.0开始,线程安全,效率低,不允许null作为键或值
  • HashMap线程不安全,效率高,非同步,null既可以作为键,也可以作为值

2.4 Properties

Properties类是Hashtable类的子类,所以也间接地实现了Map接口。在实际应用中,常使用Properties类对属性文件进行处理:
  • load(InputStream in)
  • getProperty(String key)


3、一张图

 

4、参考链接



[01] Collection和Map的更多相关文章

  1. Java特性-Collection和Map

    创建博客的目的主要帮助自己记忆和复习日常学到和用到的知识:或有纰漏请大家斧正,非常感谢! 之前面试,被问过一个问题:List和Set的区别. 主要区别很明显了,两者都是数组形式存在的,继承了Colle ...

  2. Java Collection或Map的同步

    新集合也提供了能防止多个进程同时修改一个容器内容的机制.若在一个容器里反复,同时另一些进程介入,并在那个容器中插入.删除或修改一个对象,便会面临发生冲突的危险.我们可能已传递了那个对象,可能它位于我们 ...

  3. 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

    原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...

  4. Collection和Map

    (1)Collection和Map的继承体系. (2)ArrayList(数组).LinkedList(链表).Vector(线程同步).Stack(继承Vector先进后出的栈).PriorityQ ...

  5. Java集合类根接口:Collection 和 Map

    前言 在前文中我们了解了几种常见的数据结构,这些数据结构有着各自的应用场景,并且被广泛的应用于编程语言中,其中,Java中的集合类就是基于这些数据结构为基础. Java的集合类是一些非常实用的工具类, ...

  6. spark提示Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Lscala.collection.immutable.Map;

    spark提示Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot b ...

  7. 初识Java集合框架(Iterator、Collection、Map)

    1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List ...

  8. JAVA集合详解(Collection和Map接口)

    原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...

  9. Java集合框架(Collection Framework)学习之 Collection与Map概貌

    写过Java的人都知道Java集合类,也用过Java集合类.Java集合类位于 java.util 这个包下,就像它的包名暗示的那样,Java集合类就是一套工具.它就像工匠的工具箱一样,它能给使用它的 ...

随机推荐

  1. 为什么radio没有出现单选效果?

    原因是radio一定要设置相同的name,如下: <input type="radio" name="yunsuan" checked="che ...

  2. Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

    今天抽出一点点时间来造一个小轮子,是关于定时任务这块的. 这篇文章主要从一下几点介绍: 创建数据库管理表 创建web项目 引入quarzt nuget 包 写具体配置操作,实现定时任务处理 第一步:创 ...

  3. Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  4. C#中禁止跨线程直接访问控件

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...

  5. Python 文档学习

    1.在命令行执行Python脚本(获取输入) import sys print(sys.argv[1]) 2.compile Python(编译Python) 编译后,生成的文件是.pyc,但是要知道 ...

  6. [20171120]bash使用here documents的一个小细节.txt

    [20171120]bash使用here documents的一个小细节.txt --//昨天看bash文档,,发现一些小细节,做一个记录,就是EOF加引号的问题. command <<' ...

  7. 第七章 鼠标(CHECKER2)

    CHECKER2程序包含一个键盘接口,内容与CHECKER1完全相同.利用←.→.↑.↓四个方向键可以在25个矩形之间移动鼠标指针.Home键把鼠标指针移动到左上角的矩形:End键使鼠标指针落到右下角 ...

  8. Ubuntu18.04 更换源

    在虚拟机新建一个Ubuntu18.04.1-live-server-amd64当做服务器 在安装软件时报错: slave@slave:~$ sudo -s[sudo] password for sla ...

  9. 【PAT】B1080 MOOC期终成绩(25 分)

    还是c++好用,三部分输入直接用相同的方法, 用map映射保存学生在结构体数组中的下标. 结构体保存学生信息,其中期末成绩直接初始化为-1, 注意四舍五入 此题还算简单 #include<ios ...

  10. 使用Jenkins+gitlab自动化构建时排除分支

    我们的目的是gitlab上的代码有变动时会自动向Jenkins发送web钩子请求,触发指定的动作: 但默认情况下,所有分支(如测试环境和预生产)的代码有变动时都会触发,此时可以在Jenkins的项目设 ...