------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、基本概念

1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序

保存元素,而Set不能有重复元素。Queue按照排队规则了确定对象产生的顺序(通常与它们被插

入的顺序相同)。

2)Map:一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值

,因此在某种意义上讲,他讲数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某

个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字

典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是强大的编程

工具。

Collection vs Collections

  首先,Collection 和 Collections 是两个不同的概念。之所以放在一起,是为了更好的比较。

Collection是容器层次结构中根接口。而Collections是一个提供一些处理容器类静态方法的类。

JDK不提供Collection接口的具体实现,而是提供了更加具体的子接口(如Set和List)实现。

那Collection接口存在有何作用呢?存在即是道理。

  原因在于:所有容器的实现类(如ArrayList实现了List接口,HashSet实现了Set接口)提供

了两个‘标准’的构造函数来实现:1、一个无参的构造方法(void)2、一个带有Collection类型单

参数构造方法,用于创建一个具有其参数相同元素新的Collection及其实现类等。实际上:因为所

有通用的容器类遵从Collection接口,用第二种构造方法是允许容器之间相互的复制。

二、Collection和Iterator接口

  Conllection接口概括了序列的概念——一种存放一组对象的方式。Collection接口里定义了如下

操作集合元素的方法。

  • boolean add(Object o):该方法把集合c里的所有元素添加到指定集合了i。如果集合对象被添加操

作改变了,则返回true。

  • boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。如果集合对象被添

加操作改变了,则返回true。

  • void clear():清除集合里的所有元素,将集合长度变为0。
  • boolean contains(Object o):返回集合了是否包含指定元素。
  • boolean containsAll(Collection c):返回集合里是否包含集合c里的所有元素。
  • boolean isEmpty():返回集合是否为空。当集合长度为0时返回true,否则返回false。
  • Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
  • boolean remove(Object o):删除集合中的指定元素o,当集合中包含了一个或多个元素o时,这些

元素将被删除,该反复将返回true。

  • boolean removeAll(Collection c):从集合中删除集合c里包含的所有元素(相当于调用该方法的集

合减集合c),如果删除了一个或多个以上的元素,则该方法返回true。

  • boolean retainAll(Collection c):从集合中删除集合c里不包含的元素(相当于用调用该方法的集

合变成该集合和集合c的交集),如果该操作改变了调用该方法的集合,则该方法返回true。

  • int size():该方法返回集合里元素的个数。
  • Object[] toArray():该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素。

下面程序将示范如何通过上面的方法来操作Collection集合里的元素:

 import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet; public class CollectionTest { public static void main(String[] args) {
Collection collection = new ArrayList();
// 添加元素
collection.add("暨雪");
// 虽然集合里不能放基本类型的值,但Java支持自动装箱
collection.add(21);
System.out.println("collection集合的元素个数为:" + collection.size());
// 删除指定元素
collection.remove(21);
System.out.println("collection集合的元素个数为:" + collection.size());
// 判断是否包含指定字符串
System.out.println("Collection集合是否包含\"暨雪\"字符串"
+ collection.contains("暨雪"));
collection.add(18);
System.out.println("collection集合的元素个数为:" + collection.size()); Collection action = new HashSet<>();
action.add(18);
action.add('x');
System.out.println("collection是否完全包含action集合?"
+ collection.containsAll(action));
//用Collection集合减去action集合里的元素
collection.removeAll(action);
System.out.println("collection集合的元素个数为:" + collection.size());
//删除Collection集合里的所有元素
collection.clear();
System.out.println("collection集合的元素个数为:" + collection.size());
//action集合里只剩下Collection集合里也包含的元素
action.retainAll(collection);
System.out.println("action集合的元素:" + action);
} }

运行结果:

collection集合的元素个数为:2
collection集合的元素个数为:1
Collection集合是否包含"暨雪"字符串true
collection集合的元素个数为:2
collection是否完全包含action集合?false
collection集合的元素个数为:1
collection集合的元素个数为:0
action集合的元素:[]

  上面程序中创建了两个Collection对象,一个是collection集合,一个是action集合,其中

collection集合是ArrayList,二action集合是HashSet。虽然它们使用的实现类不同,但当把

它们当成Collection来使用时,使用add、remove、clear等方法来操作集合时没有任何区别。

 

三、使用Iterator接口遍历集合元素

  Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样

:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(

即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。

  Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection

集合元素的统一编程接口。Iterator接口了定义如下三个方法:

  • boolean hasNext():如果被迭代的集合元素还没有被遍历,则返回true。
  • Object next():返回集合里的下一个元素。
  • void remove():删除集合了上一次next方法返回的元素。

  下面程序示范了通过Iterator接口来遍历集合元素。

 import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class IteratorTest { public static void main(String[] args) {
// 创建一个集合
Collection name = new HashSet<>();
name.add("张三");
name.add("李四");
name.add("王五");
// 获取name集合对应的迭代器
Iterator it = name.iterator();
while (it.hasNext()) {
// it.next()方法返回的数据类型是Object类型
// 需要强制类型转换
String names = (String) it.next();
System.out.println(names);
if (names.equals("李四")) {
// 从集合中删除上一次next方法返回的元素
it.remove();
}
// 对names变量赋值,不会改变集合元素本身
names = "测试字符串";
}
System.out.println(name);
} }

运行结果:

张三
李四
王五
[张三, 王五]

从上面代码中可以看出,Iterator仅用于遍历集合,Iterator本身并不提供盛装对象的能力。如

果需要参加Iterator对象,则必须有一个被迭代的集合。没有集合的Iterator仿佛无本之木,没

有存在的价值。

注意:

Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的

Collection对象。Iterator提供了两个仿佛来迭代访问Collection集合里的元素,并可以通过

remove()方法来删除集合中上一次next()方法返回的集合元素。

四、容器的打印

对TreeSet,HashSet,LinkedList,ArrayList,TreeMap,HashMap的例子如下:

 import java.util.*;

 public class CollectionAll
{ public static void main(String[] args)
{
printLists(); printSets(); printMaps();
} private static void printLists()
{
List<String> a1 = new ArrayList<String>();
a1.add("List");
a1.add("Set");
a1.add("Queue");
a1.add("Map");
a1.add("List");
System.out.println("ArrayList Elements:");
System.out.println(" " + a1); List<String> l1 = new LinkedList<String>();
l1.add("List");
l1.add("Set");
l1.add("Queue");
l1.add("Map");
l1.add("List");
System.out.println("LinkedList Elements:");
System.out.println(" " + l1);
}
private static void printSets()
{
Set<String> h1 = new HashSet<String>();
h1.add("List");
h1.add("Set");
h1.add("Queue");
h1.add("Map");
h1.add("List");
System.out.println("HashSet Elements:");
System.out.println(" " + h1); Set<String> t1 = new TreeSet<String>();
t1.add("List");
t1.add("Set");
t1.add("Queue");
t1.add("Map");
t1.add("List");
System.out.println("TreeSet Elements:");
System.out.println(" " + t1);
} private static void printMaps()
{
Map<String, String> h1 = new HashMap<String, String>();
h1.put("List", "ArrayList");
h1.put("Set", "HashSet");
h1.put("Queue", "PriorityQueue");
h1.put("Map", "HashMap");
h1.put("List", "ArrayList");
System.out.println("HashMap Elements:");
System.out.println(" " + h1); Map<String, String> t1 = new TreeMap<String,String>();
t1.put("List", "ArrayList");
t1.put("Set", "HashSet");
t1.put("Queue", "PriorityQueue");
t1.put("Map", "HashMap");
t1.put("List", "ArrayList");
System.out.println("TreeMap Elements:");
System.out.println(" " + t1); }
}

运行结果:

ArrayList Elements:
[List, Set, Queue, Map, List]
LinkedList Elements:
[List, Set, Queue, Map, List]
HashSet Elements:
[Map, Queue, Set, List]
TreeSet Elements:
[List, Map, Queue, Set]
HashMap Elements:
{Map=HashMap, Queue=PriorityQueue, Set=HashSet, List=ArrayList}
TreeMap Elements:
{List=ArrayList, Map=HashMap, Queue=PriorityQueue, Set=HashSet}

  这里展示了Java容器类库中的两种主要类型,它们的区别在于容器中每个“槽”保存的元素个

数。Collection在每个槽中只能保存一个元素。此类容器包含:

List:它以特定的顺序保存一组元素;

Set:元素不能重复;

Queue:值允许在容器的一“端”插入对象,并从另外一“端”移除对象。Map在每个槽内保存了两

个对象,即键和与之相关的值。

  从打印结果来看,ArrayList和LinkedList都是List类型,它们都按照被插入的顺序保存元素

。两者的不同之处不仅在于执行某些类型的操作时的性能,而且LinkedList包含的操作也多于

ArrayList。

  HashSet、TreeSet和LinkedHashSet都是Set类型,每个相同的项只有保存一次,但输出

也显示了不同的Set实现存储元素的方式也不同。HashSet使用的是相当复杂的方式来存储元素

的,因此,存储的顺序看起来并无实际意义。如果存储顺序很重要,那么可以使用TreeSet,它

按照比较结果的升序保存对象;或者使用LinkedHashSet,它按照被添加的顺序保存对象。

  本例使用了三种基本风格的Map:HashMap、TreeMap和LinkedHashSet。与HashSet一

样,HashMap也提供了最快的查找技术,也没有按照任何明显的顺序来曹操其元素。TreeMap

按照比较结果的升序保存键,而LinkedHashMap则按照插入顺序保存键,同时还保留了HashMap

的查询速度。

Java——(二)Java集合容器的更多相关文章

  1. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  2. java中的集合/容器的数据结构

    最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...

  3. JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14

    一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...

  4. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  5. Java中的集合框架-Collection(二)

    上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...

  6. [转载]Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  7. 编程体系结构(03):Java集合容器

    本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...

  8. 面霸篇:Java 集合容器大满贯(卷二)

    面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...

  9. 【Java并发编程二】同步容器和并发容器

    一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...

随机推荐

  1. Junit 源码剖析(一)

    采用Junit4.8.2分析Junit实现架构 源码架构两个大包:junit包 org包 首先分析org.junit.runners.model包下的几个类 org.junit.runners.mod ...

  2. 使用Unity游戏引擎在IOS模拟器中运行的方法

    在Unity编译IOS程序时,在Unity导航栏菜单中选择Edit->ProjectSettings ->Player(菜单项)选择IOS平台在下方SDK Version处选择运行设备为I ...

  3. Android系统的体系结构、开发语言及源码结构

    整理自android系统体系结构 Android 是google公司针对手机开发的一个平台,并公布了其中大部分代码,其大部分应用程序都是用JAVA开发的,毕竟它是商业性的产品嘛,有所保留也是理所 当然 ...

  4. 【poj1087/uva753】A Plug for UNIX(最大流)

    A Plug for UNIX   Description You are in charge of setting up the press room for the inaugural meeti ...

  5. Guava学习

    Guava学习笔记目录 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concu ...

  6. 14.6.1 InnoDB Startup Configuration 启动配置

    14.6.1 InnoDB Startup Configuration 启动配置 首先描述关于InnoDB 配置设计数据库文件,日志文件,page size 和内存buffer 的配置. 推荐你定义数 ...

  7. 为什么不走INDEX FAST FULL SCAN呢

    INDEX FULL SCAN 索引全扫描.单块读 .它扫描的结果是有序的,因为索引是有序的.它通常发生在 下面几种情况(注意:即使SQL满足以下情况 不一定会走索引全扫描) 1. SQL语句有ord ...

  8. Bluetooth LE(低功耗蓝牙) - 第五部分

    回顾: 在本系列前面的文章中我们完成了发现BLE传感器并与之建立连接.现在只剩下从其中获取数据了,但是这并没有看起来那么简单.在这篇文章中我们将讨论GATT的特点以及如何促进主机与传感器之间的数据交换 ...

  9. 【转】单独编译android framework模块出现的问题

    原文网址:http://blog.csdn.net/leonan/article/details/8629561 全编andorid后,单独修改编译一个framwork模块,make snod会有如下 ...

  10. 在.net MVC中异步上传图片或者文件

      @using (Ajax.BeginForm("AddMessages", "MenuInfo", new AjaxOptions { HttpMethod ...