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. node.js的异步I/O、事件驱动、单线程

    nodejs的特点总共有以下几点 异步I/O(非阻塞I/O) 事件驱动 单线程 擅长I/O密集型,不擅长CPU密集型 高并发 下面是一道很经典的面试题,描述了node的整体运行机制,相信很多人都碰到了 ...

  2. Linux下无法执行tree命令问题

    Linux下不能使用tree命令,是因为没有安装命令, 执行下面代码就行了 yum install tree -y

  3. 什么是JS跨域请求

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  4. CentOS 常用命令合集

    tail -f ../logs/catalina.out    在Tomcat中的bin目录下查看Tomcat日志 ps -ef|grep java                 查看Tomcat服 ...

  5. git中常用的操作命令有哪些?常用操作命令归纳

    git中常用的操作命令有哪些?本篇文章就给到大家归纳了一些git中常用操作命令.有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. git开始 全局配置:配置用户名和e-mail地址 1 ...

  6. 微信开发:微信js_sdk分享,使用场景,网页在微信app内部分享时的标题与描述,包括logo设置(一)

    主要有下面几步.首先大家先分清楚 小程序的appid,appSecret 跟公众号的appid,appSecret是不一样的.因为这两个都能拿到token,且是不同的值. 准备开始: 1.准备好 公众 ...

  7. kuangbin专题 专题一 简单搜索 Fliptile POJ - 3279

    题目链接:https://vjudge.net/problem/POJ-3279 题意:格子有两面,1表示黑色格子,0表示白色格子,奶牛每次可以踩一个格子,踩到的格子和它周围的上下左右格子都会翻面,也 ...

  8. NetCore 中间件获取请求报文和返回报文

    using System; using System.IO; namespace WebApi.Restful.Middlewares { public class MemoryWrappedHttp ...

  9. cogs 2320. [HZOI 2015]聪聪的世界题解

    2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...

  10. python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递

    ---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...