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. JVM史上最全实践优化没有之一

    JVM史上最全优化没有之一 1.jvm的运行参数 1.1 三种参数类型 1.1.1 -server与-clinet参数 2.1 -X参数 2.1.1 -Xint.-Xcomp.-Xmixed 3.1 ...

  2. python 基础学习笔记(3)--列表与元组

    **本次笔记主要内容为 列表,元组主要的功能和特性** **1.列表**: 学习过c语言的同学应该知道,c语言有数组这一功能,就是将数据类型相同的元素放在一起.由于python的变量没有数据类型,也就 ...

  3. Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境

    一.JDK1.8 环境搭建 1.上传文件解压 [root@localhost mysoft]# tar -zxvf jdk-8u161-linux-x64.tar.gz [root@localhost ...

  4. 带你全面了解高级 Java 面试中需要掌握的 JVM 知识点

    目录 JVM 内存划分与内存溢出异常 垃圾回收算法与收集器 虚拟机中的类加载机制 Java 内存模型与线程 虚拟机性能监控与故障处理工具 参考 带你全面了解高级 Java 面试中需要掌握的 JVM 知 ...

  5. git简单使用-GitHub

    本文描述window下如何使用git工具,操作GitHub远程代码库 一,准备工作: 1,安装git工具,一路默认next安装即可,下载地址 2,注册账号或者创建厂库(已有忽略) 注册账号后,创建仓库 ...

  6. django基础知识之URLconf:

    URLconf 在settings.py文件中通过ROOT_URLCONF指定根级url的配置 urlpatterns是一个url()实例的列表 一个url()对象包括: 正则表达式 视图函数 名称n ...

  7. 安装Win10,ERROR_0x8007025D问题解决

    Windows10安装的时候,出现ERROR CODE:0x8007025D 大概提示为:windows 无法安装所需的文件.请确保安装所需的所有文件可用,并重新启动安装. 本人在出现这个问题的原因, ...

  8. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  9. 第二章 Session会话管理

    采用网址重写的缺点: 在有些Web浏览器中,URL限制为2000个字符. 仅当有链接要插入值时,值才能转换成后面的资源.此外,要把值添加到静态页面的链接中,可不是一件容易的事情. 网址重写必须在服务器 ...

  10. [记录]NGINX配置HTTPS性能优化方案一则

    NGINX配置HTTPS性能优化方案一则: 1)HSTS的合理使用 2)会话恢复的合理使用 3)Ocsp stapling的合理使用 4)TLS协议的合理配置 5)False Start的合理使用 6 ...