Java类库中帮助我们在程序设计中实现了传统的数据结构。本文章跳过理论部分,主要介绍如何使用标准库中的集合类。
1 将集合的接口与实现分离
Java集合类库将接口与实现分离。以队列为例:
public interface Queue<E> extends Collection<E> {
boolean add(E e); E remove(); /*
其他方法
*/
}
上述代码为Java类库中队列的一部分代码,可以看到,这个接口没有说明队列是如何实现的。
队列通常有两种实现方式:
1.使用循环数组
2.使用链表
而在Java中,每一种实现都可以通过一个实现了Queue接口的类表示:
实现循环数组方式的双端队列,Java中使用 ArrayDeque类实现,这个类实现了继承自Queue接口的Deque接口,并使用一个数组存储队列中的元素。
实现链表方式的双堆队列,Java中的 LinkedList类通过实现同样的Deque接口实现。
使用接口与实现的模式,当程序中使用到队列时,一旦构建了集合便不需要知道使用了那种实现,当一旦改变了想法,可以轻松的在构建集合的位置改成另外一种实现。
2 Collection 接口
public interface Collection<E>
{
boolean add(E element);
Iterator<E> iterator();
...其他方法
}
add 方法用于添加元素,如果添加元素改变了集合就返回true,否则返回false。如果试图想一个集中添加一个已有对象,添加请求就不会生效,因为集中不允许存在重复对象。
iterator 方法返回一个实现了Iterator 接口的对象。
3 迭代器
package java.util; import java.util.function.Consumer; public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
void forEachRemaining(Consumer<? super E> action);
}
Iterator 接口中包含4个方法:
next() :通过反复调用next()方法,可以逐个访问集合中的元素,但是如果到达了集合的末端,next方法将抛出一个 NoSuchElementException,因此,一般在调用next()方法前调用hasNext()方法。
hasNext() :如果迭代器对象还有供访问的对象,则返回true。
forEachRemaining:Java8中的遍历方法,参数为一个lambda表达式,迭代器将对每一个元素执行这个lambda表达式。
remove() :删除上次调用next方法时返回的元素,如果调用remove前没有调用next方法,这将是不合法的,会抛出一个 IllegalStateException 异常。
如果要删除两个相邻的元素,不能直接调用两次remove
iterator.remove();
iterator.remove(); //error iterator.remove();
iterator.next();
iterator.remove(); //true
Collection 接口声明了许多实用的方法,为了让实现者更好实现Collection接口,Java提供了一个AbstractCollection的类,它将基础方法size和iterator抽象化了,而其他的方法提供了默认的实现,实现者只需要一个具体的集合类继承AbstractCollection类,就可以实现Collection接口。
4 集合框架中的接口
Java集合框架为不同类型的集合提供了大量的接口
集合中的两个基本接口:
- Collection:
List 是一个有序集合,可以支持迭代器访问和随机访问。
Set 其add方法不允许增加重复的元素,因此使用时应 适当地定义Set的equals方法:只要两个集包含同样的元素就认为是相等的;适当地定义hashCode方法 :保证包含相同的元素的两个集会得到相同的散列码。
SortedSet 会提供用于排序的比较器对象,定义了可以得到集合子集的视图。
NavigableSet 包含一些用于搜索和遍历有序集的方法,TreeSet实现了这个接口。
Queue 是一个先进先出的队列。
Deque 双端队列
- Map:包含键值对的映射
SortedMap 会提供用于排序的比较器对象,定义了可以得到集合子集的视图。
NavigableMap 包含一些用于搜索和遍历映射的方法,TreeMap实现了这个接口。
ListIterator 是Iterator 的一个子接口。它定义了一个方法用于在迭代器位置前面增加一个元素:void add(E element)
为了避免对链表进行随机访问操作,Java引入了RandomAccess标记接口,该接口不包含任何方法,但可以用它来测试一个集合是否支持随机访问。
if(c instanceof RandomAccess){
使用随机访问
}else{
使用迭代器访问
}
【集合】Java集合框架的更多相关文章
-
Java集合-----java集合框架常见问题
1什么是Java集合API Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法. 简言之,API在上层完成以下几件事: ● 编程更加省力,提高城 ...
-
[Java核心技术]第九章-集合(Java集合框架、具体的集合、映射)
9.1Java集合框架 一些有的没的 可以使用接口类型存放集合的引用.一旦改变了想法,只需要在调用构造函数的地方做一处修改. add方法用于向集合添加元素,如果添加元素确实改变了集合就返回true. ...
-
java 集合框架(一)概述
一.概述 Java Collection Framework (JCF) 提供给我们一系列的类和接口,方便开发者处理集合对象. 在Java 2之前,Java是没有完整的集合框架的.它只有一些简单的可以 ...
-
Java集合框架总览
Java集合 Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口有 3 种子类型,Lis ...
-
第八章.Java集合
Java集合类是一种特别有用的工具类,可用于存储数量不等的对象.Java集合大致可分为Set.List.Queue和Map四种体系 Set代表无序.不可重复的集合 List代表有序.重复的集合 Map ...
-
Java集合原理分析和知识点大杂烩(多图初学者必备!!)
一.数据结构 数据结构就是计算机存储.组织数据的方式. 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. 时间复杂度是同一问题可用不同算法解决, ...
-
深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
-
Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
-
Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
-
【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
随机推荐
-
CSS3制作立体导航
<ul class="nav"> <li><a href="">首页</a></li> <li ...
-
js 获取鼠标位置坐标
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
-
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
input输入框在获得或失去焦点时隐藏或显示文字,这样的焦点效果想必很多朋友在填写form表格的时候都曾见识过吧,本文使用jquery实现以下,感兴趣的朋友可以参考下哈 大家可以看效果图的搜索输入框, ...
-
cocos2d_x_06_游戏_一个都不能死
终于效果图: 环境版本号:cocos2d-x-3.3beta0 使用内置的物理引擎 游戏主场景 // // HeroScene.h // 01_cocos2d-x // // Created by b ...
-
RabbitMQ java 参数
channel.exchangeDeclare(exchange, "direct", true, false, null); 第一个参数:交换组名字, 第二个参数:队交换组类型: ...
-
Java Me-List控件的用法案例
/** * Java Me-List控件的用法案例 */package com.xushouwei.cn; import java.io.IOException;import javax.microe ...
-
Codeforces Round #551 (Div. 2) EF Solution
E. Serval and Snake 对于一个矩形,如果蛇的一条边与它相交,就意味着这条蛇从矩形内穿到矩形外,或者从矩形外穿到矩形内.所以如果某个矩形的答案为偶数,意味着蛇的头尾在矩形的同一侧(内或 ...
-
html计时发送验证码功能的实现
function countdown() { var time=60; setTime=setInterval(function(){ if(time<=0){ clearInterval(se ...
-
二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...
-
tornado登陆装饰器
tornado作为鼎鼎大名的web异步框架,用来作为高性能服务器以及web框架都是首选.自从python3.4加入了asyncio原生协程后,tornado的最新版本也开始使用了原生的协程.定义协程函 ...