Java集合就是一个容器。面向对象语言对事物的体现都是以对象的形式存在,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。如果往集合里存放基本数据类型,在存取过程中会有个自动装箱和拆箱。

因为容器中数据结构不同,容器有很多种。不断地将共性功能向上抽取,形成了集合体系,称之为集合框架。

集合框架的顶层就称之为Collection接口。所有的集合类都位于java.util包下,查阅API可以得到如下体系结构。在使用一个体系时,原则:参阅顶层内容。建立底层对象。

集合和数组的区别:

1:数组是固定长度的;集合可变长度的。

2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。

3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

2. LIST 接口

 
实现 List 接口的常用类有 ArrayList 和 LinkedList。它们都可以容纳所有类型的对象,包括 null,允许重复,并且都保证元素的存储顺序。
 
 

ArrayList 集合类

 
ArrayList 对数组进行了封装,实现了长度可变的数组,和数组采用相同存储方式,在内存中分配连续的空间,它的优点在于遍历元素和随即访问元素的效率比较高。
 
List 接口中定义的各种常用方法(也是 ArrayList 的各种常用方法),见下表。
 

返回类型

方法

说明

boolean

add(Object o)

在列表的末尾顺序添加元素,起始索引位置从 0 开始

void

add(int index,Object o)

在指定的索引位置元素注意:索引位置必须介于 0和列表中元素个数之间

int

size()

返回列表中的元素个数

Object

get(int index)

返回指定索引位置处的元素注意:取出的元素是 Object类型,使用前需要进行强制类型转换

boolean

contains(Object o

判断列表中是否存在指定元素

boolean

remove(Object o)

从列表中删除元素

Object

remove(int index)

从列表中删除指定位置元素,起始索引位置从 0 开始

 

对比

Vector 和 ArrayList 的异同。
在 ArrayList 类出现之前,JDK 中存在一个和它同样分配连续存储空间,实现了长度可变数组的集合类 Vector。两者实现原理相同,功能相同,在很多情况下可以互用。
 
两者的主要区别如下
  • Vector 是线程安全的,ArrayList 重速度轻安全,是线程非安全的,所以当运行到多线程序环境中时候,需要程序员自己管理线程的同步问题。

  • 当长度需要增长时,Vector 默认增长为原来的一倍,而 ArrayList 只增长 50%,有利于节约内存空间。
 
开发过程中,最好使用新版本的 ArrayList。
 

LinkedList 集合类

 
LinkedList 采用链表存储方式,优点在于插入、删除元素时效率比较高,它提供了额外的 addFirst()、addLast()、removeFirst()和 removeLast()等方法,可以在
 
LinkedList 的首部或尾部进行插入或者删除操作。这些方法使得LinkedList 可被用作堆栈(stack)或者对列(queue)。
 
下面我们总结一下 LinkedList 的各种常用方法。LinkedList 除了之前列出的各种方法之外,还包括一些特殊的方法,见下表 。

返回类型

方法

说明

void

addFirst(Object o)

在列表的首部添加元素

void

addLast(Object o)

在列表的末尾添加元素

Object

getFirst()

返回列表中的第一个元素

Object

getLast()

返回列表中的最后一个元素

Object

removeFirst()

删除并返回列表中的第一个元素

Object

removeLast()

删除并返回列表中的最后一个元素

3. MAP 接口

 
Java 集合框架中提供了 Map 接口,专门来处理键值映射数据的存储。Map 中可以存储多个元素,每个元素都由两个对象组成,一个键对象和一个值对象,可以根
据实现对应值的映射。
 
 
Map 接口存储一组成对的键一值对象,提供 key(键)到 value(值)的映射。Map 中的 key不要求有序,不允许重复。value 同样不要求有序,但允许重复。最常见的
 
Map 实现类是 HashMap,它的存储方式是哈希表,优点是查询指定元素效率高。
 
Map 接口中定义的各种常用方法(也是HashMap的各种常用方法),见下表。

返回类型

方法

说明

Object

put(Object key,Object value)

以“键-值对”的方式进行存储注意:键必须是唯一的,值可以重复。如果试图添加重复的键,那么最后加入的键-值对将替换原先的键-值对。

Object

get(Object key)

根据健返回相关联的值,如果不存在指定的键,返回 null。

Object

remove(Object key)

删除由指定的键映射的“键-值对”

int

size()

返回元素个数

Set

keySet()

返回键的集合

Collection

values()

返回值的集合

boolean

containsKey(Object key)

如果存在由指定的键映射的“键-值对”,返回true

对比:
Hashtable 和 HashMap 的异同。
HashMap 类出现之前,JDK 中存在一个和它同样采用哈希表存储方式,同样实现键值映射的集合类 Hashtable。两者实现原理相同,功能相同,很多情况下可以互用。
两者的主要区别如下。
  • Hashtable 继承自 Dictionary 类,而 HashMap 实现了 Map 接口。
  • Hashtable 是线程安全的,HashMap 重速度轻安全,是线程非安全的,所以当运行到多线程环境中时,需要程序员自己管理线程的同步问题。
  • Hashtable不允许null值(key和value都不允许),HashMap允许null值(key和 value 都允许)。
 
开发过程中,最好使用新版本的 HashMap。
 遍历方式:

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MAP {
public static void main(String[] args) {
//遍历方式1:
Map<String,String>c=new HashMap<String,String>();
c.put("CN", "中国");
c.put("RU", "俄罗斯");
c.put("FR", "法兰西");
Set<String> set=c.keySet();
for (String key : set) {
System.out.println(key);
System.out.println(c.get(key));
}
//遍历方式2:
System.out.println("=====================================");
Collection<String> c1=c.values();
for (String values : c1) {
System.out.println(values); }
//遍历方式3:
System.out.println("=======================================");
Set<Entry<String, String>> c2=c.entrySet();
for (Entry<String, String> entry : c2) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
//遍历方式4:
System.out.println("=============================");
Set<String>keyset=c.keySet();
Iterator<String> iterator=keyset.iterator();
while(iterator.hasNext()){
String key=iterator.next();
System.out.println(key);
System.out.println(c.get(key));
}
//遍历方式5:
System.out.println("===============================");
Iterator<Entry<String, String>> c3=c.entrySet().iterator();
while (c3.hasNext()) {
Entry<String, String> en=c3.next();
System.out.println(en.getKey());
System.out.println(en.getValue()); } }
}

  

4. 迭代器 I TERATOR

 
所有集合接口和类都没有提供相应的遍历方法,而是把遍历交给迭代器 Iterator 完成。Iterator 为集合而生,专门实现集合的遍历。它隐藏了各种集合实现类的内部细
 
节,提供了遍历集合的统一编程接口。
Collection 接口的 iterate()方法返回一个 Iterator,然后通过 Iterator 接口的两个方法即可方便实现遍历。
 
  • boolean hasNext():判断是否存在另一个可访问的元素。
  • Object next(),返回要访问的下一个元素。
 

5 泛型集合

 
前面已经提到 Collection 的 add(Object obj)方法的参数是 Obect 类型,不管把什么对象放入 Collection 及其子接口或实现类中,认为只是 Object 类型,在通过get(int
 
index)方法取出集合中元素时必须进行强制类型转换,不仅繁琐而且容易出现 ClassCastException 异常。Map 中使用 put(Object key,Object value)和get(Object key)
 
存取对象时,使用 Iterator 的 next()方法获取元素时存在同样问题。
JDK1.5 中通过引入泛型(Generic)有效解决了这个问题。在 JDK1.5 中已经改写了集合框架中的所有接口和类,增加了泛型的支持。
使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行类型强制转换,并且如果把非指定类型对象放入集合,会出现编译错误。
 
对比:
数组和集合的主要区别包括以下几个方面。

  • 数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基本数据类型)。
  • 数组长度固定,集合长度可以动态改变。
  • 定义数组时必须指定数组元素类型,集合默认其中所有元素都是 Object。
  • 无法直接获取数组实际存储的元素个数,length 用来获取数组的长度,但可以通过size()直接获取集合实际存储的元素个数。
  • 集合有多种实现方式和不同的适用场合,而不像数组仅采用分配连续空间方式。
  • 集合以接口和类的形式存在,具有封装、继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
JDK 中有一个 Arrays 类,专门用来操作数组,它提供了一系列静态方法实现对数组搜索、排序、比较和填充等操作。JDK 中有一个 Collection 类,专门用来操作集
 
合,它提供一系列静态方法实现对各种集合的搜索、赋值、排序和线程安全化等操作。
 

总结

①集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高了软件的开发效率,而且不同的集合可适用于不同场合。

②集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
③通常说 Java 的集合框架共有三大类接口:List,Set 和 Map,区别如下。

  • Collection 接口存储一组不唯一、无序的对象。
  • Set 接口继承 Collection 接口,存储一组唯一、无序的对象。
  • List 接口继承 Collection 接口,存储一组不唯一、有序的对象。
  • Map 接口存储一组成对的键一值对象,提供 Key 到 value 的映射。key 不要求有序、 不允许重复。value 同样不要求有序,但允许重复。

④ArrayList 和数组采用相同的存储方式,它的优点在于遍历元素和随机访问元素的效率比较高。LinkedList 采用链表存储方式,优点在于插入、删除元素时效率比较高。

⑤HashMap 是最常见的 Map 实现类,它的存储方式是哈希表,优点是查询指定元素效率高。
⑥Iterator为集合而生,专门实现集合的遍历,它隐藏了各种集合实现类的内部细节 ,提供了遍历集合的统一编程接口。
⑦使用泛型结合在创建集合对象时指定集合中元素的类型,在从集合中取出元素时无需进行类型强制转换,避免了 ClassCastException 异常。

S2:java集合框架的更多相关文章

  1. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  2. Java集合框架:HashMap

    转载: Java集合框架:HashMap Java集合框架概述   Java集合框架无论是在工作.学习.面试中都会经常涉及到,相信各位也并不陌生,其强大也不用多说,博主最近翻阅java集合框架的源码以 ...

  3. 【Java集合框架】规则集--Set

    集合: Java主要支持三种: 1.规则集(Set) 用于存储一组不重复的元素 2.线性表(List) 用于存储一个由元素构成的有序集合 3.队列(Queue) 同与数据结构中的队列,存储用先进先出的 ...

  4. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

  5. 第49节:Java集合框架中底层文档的List与Set

    Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...

  6. Java集合框架中底层文档的List与Set

    Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...

  7. (Set, Map, Collections工具类)JAVA集合框架二

    Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...

  8. (Collection, List, 泛型)JAVA集合框架一

    Java集合框架部分细节总结一 Collection List 有序,有下标,元素可重复 Set 无序,无下标,元素不可重复 以上为Collection接口 以ArrayList为实现类实现遍历:增强 ...

  9. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

随机推荐

  1. 在CentOS 7上安装Python3

    源码包安装 Python官方没有对Linux打包, 需要下载源码包进行编译. 可以自己下载最新版本的Python, 在Python下载页面, 点击Python3.x.x版本对应的Download, 在 ...

  2. python3的类

    python3的类: python是一门面向对象的编程语言,学习python下的类,,能帮助自己形成一个基本的面向对象的概念.关于类和实例的理解,一个易懂的栗子就是动物类,我们把动物看做一个类,而狗啊 ...

  3. Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作

    目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...

  4. vue.js打包部署线上

    你完成了工程开发,需要部署到外网环境,要进行下面的步骤: 一.首先你要购买一个服务器或者有自己的服务器.我介绍给大家的一个免费的服务器:http://free.3v.do/index.html可以免费 ...

  5. scrapy实战6爬取IT桔子国内所有融资公司:

    爬取融资公司,融资公司简介,融资时间,轮次,融资额,投资方,股权占比以及融资公司完整融资历史 如图 源码地址:https://github.com/huwei86/spiderITjuzi

  6. ES6中用&&跟||来简化if{}else{}的写法

    目录 ES6中用&&跟||来简化if{}else{}的写法 1. if else的写法 2. ES6中 && ||的用法 3 ES6实例 4 开发环境 ES6中用&am ...

  7. BeanUtils.copyProperties的用法

    实现原理 原理 target.set + source的属性名(source.get + source的属性名):所有source必须有get方法,target必须有set方法 一. springfr ...

  8. CF1194D 1-2-K Game (博弈论)

    CF1194D 1-2-K Game 一道简单的博弈论题 首先让我们考虑没有k的情况: 1. (n mod 3 =0) 因为n可以被分解成若干个3相加 而每个3可以被分解为1+2或2+1 所以无论A出 ...

  9. 和朱晔一起复习Java并发(三):锁(含锁性能测试)

    这个专题我发现怎么慢慢演化为性能测试了,遇到任何东西我就忍不住去测一把.本文我们会大概看一下各种锁数据结构的简单用法,顺便也会来比拼一下性能. 各种并发锁 首先,我们定一个抽象基类,用于各种锁测试的一 ...

  10. MFC在一个工程中启动其他工程的exe文件

    说明:有的时候把两个工程合并,但是偷懒不想在工程中添加代码,所以想到了这个办法,仅限偷懒哈哈哈哈 方法:新建一个主程序,在主程序的界面中添加按钮,在按钮的程序代码中添加以下语句: void CMain ...