Java——(二)Java集合容器
------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集合容器的更多相关文章
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- java中的集合/容器的数据结构
最近双11在网上买了本 数据结构和算法--java语言实现,正在啃,同时在慕课网上的学习进度来到了集合框架这一类,对于这一块算是刚刚了解,本科的时候数据结构学习的是严蔚敏老师的那本数据结构,代码的实现 ...
- JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14
一.集合Collection 1. 集合介绍 变量:表示的内存中的一个空间,只能保存确定类型的单个数据 数组:表示的是内存中的多个连续的空间,这些空间中可以存储多个同类型的数据. 后期继续学习面向对象 ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- Java中的集合框架-Collection(二)
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- 编程体系结构(03):Java集合容器
本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...
- 面霸篇:Java 集合容器大满贯(卷二)
面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...
- 【Java并发编程二】同步容器和并发容器
一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...
随机推荐
- open files
/* * * Copyright (c) International Business Machines Corp., 2001 * * This program is free software; ...
- 当今流行的 React.js 适用于怎样的 Web App?
外村 和仁(株式会社 ピクセルグリッド) React.js是什么? React.js是Facebook开发的框架. http://facebook.github.io/react/ 官网上的描述是「 ...
- 如何使用 Docker、ECS、Terraform 重建基础架构?
早期 Segment 基础架构普遍组合在一起.我们通过 AWS 界面设定实例,使用许多闲散的 AMI,并且采用三种不同的部署方式. 然而随着商业的飞速发展,工程师团队的规模不断扩大,基础架构的复杂度也 ...
- SQL server 触发器、视图
一.触发器 1.触发器为特殊类型的存储过程,可在执行语言事件时自动生效.SQL Server 包括三种常规类型的触发器:DML 触发器.DDL 触发器和登录触发器. 主要讲述DML触发器,DML触发器 ...
- duck type鸭子类型
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于 ...
- 14.5.4 Phantom Rows 幻影行
14.5.4 Phantom Rows 幻影行 所谓的幻读问题发生在一个事务 当相同的查询产生不同的结果集在不同的时间. 例如,如果一个SELECT 是执行2次,但是第2次返回的时间不第一次返回不同, ...
- JAVA中IO技术:BIO、NIO、AIO
1.同步异步.阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的. 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作 ...
- Spark Streaming fileStream实现原理
fileStream是Spark Streaming Basic Source的一种,用于“近实时”地分析HDFS(或者与HDFS API兼容的文件系统)指定目录(假设:dataDirectory)中 ...
- excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1
编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...
- 关于JNI程序中引用另外一个lib
我最近在写一个j2se的程序,我用的是开源的org.amse.ys.zip包里的代码,这部分代码是在FBReaderJ里抽取的,但是其中包含了一些native的方法,需要用的zlib库,而FBRead ...