IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Java集合 -> 正文阅读

[数据结构与算法]Java集合

Java集合

在集合类库中,接口与实现是分离的。以队列为例:队列接口Queue声明了所需的方法,而队列实现有循环数组和链表两种实现方式。可以使用接口类型存放集合的引用,利用这种方式,一旦改变了想法, 可以轻松地使用另外一种不同的实现。

一,集合框架中的接口

在这里插入图片描述

集合框架有两个基本接口:Collection(也称为集合,容易和集合框架混淆,注意甄别)和 Map。

在Collection可以通过boolean add(E element)添加元素,在Map中由于映射包含键 / 值对,所以要用 put 方法来插人:V put(K key, V value)

要从集合读取元素,Collection可以用迭代器访问元素。不过,从映射中读取值则要使用 get 方法: V get(K key)

1,Collection接口

boolean add(E element);//向集合中添加元素,如果改变了集合就返回true,如果集合没有变化就返回false
Iterator<E> iterator()//返回一个实现了 Iterator 接口的对象。可以使用这个迭代器对象依次访问集合中的元素。

迭代器

Iterator接口包含四个方法:

public interface Iterator<E>{
	E next();//返回将要访问的下一个对象。如果已经到达了集合的尾部, 将拋出一个 NoSuchElementException。
	boolean hasNext();//如果存在可访问的元素, 返回true
	void remove();//删除上次访问的对象。这个方法必须紧跟在访问一个元素之后执行。如果上次访问之后,集合已经发生了变化, 这个方法将抛出一个IllegalStateException。
	default void forEachRemaining(Consumer<? super E> action);
}

“ for each” 循环可以与任何实现了 Iterable 接口的对象一起工作, 这个接口只包含一个抽象方法

public interface Iterable<E>{
    Iterator<E> iterator();
}

Collection 接口扩展了 Iterable 接口。因此, 对于标准类库中的任何集合都可以使用“ for each” 循环。在 Java SE 8中,甚至不用写循环。可以调用 forEachRemaining 方法并提供一个lambda 表达式(它会处理一个元素)。将对迭代器的每一个元素调用这个 lambda 表达式,直到再没有元素为止。

iterator.forEachRemaining(element -> do something with element);

Collection接口全部方法

Iterator<E> iterator();//返回一个用于访问集合中每个元素的迭代器。
int size();//返回当前存储在集合中的元素个数。
boolean isEmpty();//如果集合中没有元素,返回true。
boolean contains(Object obj);//如果集合中包含了一个与obj相等的对象,返回true。
boolean containsAll(Collection<?> other);//如果这个集合包含other集合中的所有元素,返回true
boolean add(Object element);//将一个元素添加到集合中。如果由于这个调用改变了集合,返回true。
boolean addAll(Collection<? extends E> other);//将一个元素添加到集合中。如果由于这个调用改变了集合,返回true。
boolean remove(Object obj);//将一个元素添加到集合中。如果由于这个调用改变了集合,返回true。
boolean removeAll(Collection<?> other);//从这个集合中删除 other集合中存在的所有元素。如果由于这个调用改变了集合,返回true
default boolean removeIf(Predicate<? super E> filter);//从这个集合删除 filter返回true的所有元素。如果由于这个调用改变了集合,则返回true。
boolean retainAll(Collection<?> c);//从这个集合中删除所有与other集合中的元素不同的元素。如果由于这个调用改变了集合,返回true。
void clear();//从这个集合中删除所有的元素。
Object[] toArray();//返回这个集合的对象数组。
<T> T[] toArray(T[] a);//返回这个集合的对象数组。如果arrayToFill足够大,就将集合中的元素填入这个数组中。剩余空间填补null;否则,分配一个新数组,其成员类型与arrayToFill 的成员类型相同,其长度等于集合的大小,并填充集合元素。

List接口

扩展于Collection接口

List 是一个有序集合,元素会增加到容器中的特定位置。可以采用两种方式访问元素:使用迭代器访问,或者使用一个整数索引来访问(随机访问)。

List 接口定义了多个用于随机访问的方法:

void add(int index, E element) ;
E remove(int index) ;
E get(int index) ;
E set(int index, E element);

Set接口(集)

扩展于Collection接口

Set 接口等同于 Collection 接口,不过其方法的行为有更严谨的定义。

  • 集(set) 的 add方 法不允许增加重复的元素。
  • 要适当地定义集的 equals 方法:只要两个集包含同样的元素就认为是相等的,而不要求这些元素有同样的顺序。
  • hashCode 方法的定义要保证包含相同元素的两个集会得到相同的散列码。

二,集合框架中的实现(具体的集合)

在这里插入图片描述

在这里插入图片描述

在表 9-1 中, 除了以 Map 结尾的类之外, 其他类都实现了Collection接口,而以Map结尾的类实现了Map接口。

1,链表LinkList

  • 链表是一个有序集合
  • 在 Java 程序设计语言中,所有链表实际上都是双向链接的
  • void add(E element)方法不返回boolean类型的值,假定添加操作总会改变链表
//List
void add(int index, E element) ;
E remove(int index) ;
E get(int index) ;
E set(int index, E element);
void addAll (int i, Collection<? extends E> elements );
int indexOf(Object element);
int lastlndexOf(Object element)
    
    
//LinkedList
LinkedList()//构造一个空链表。
LinkedList(Collection<? extends E> elements)//构造一个链表, 并将集合中所有的元素添加到这个链表中。
void addFirst(E element)
void addLast(E element)//将某个元素添加到列表的头部或尾部。
E getFirst()
E getLast()//返回列表头部或尾部的元素。
E removeFirst()
E removeLast()//删除并返回列表头部或尾部的元素

2,数组列表ArrayList

方法基本与List接口方法名相同。

3,散列表

散列表为每个对象计算一个整数,称为散列码(hash code) 。散列码是由对象的实例域产生的一个整数。更准确地说, 具有不同数据域的对象将产生不同的散列码。

注意,自己实现的hashCode方法应该与 equals方法兼容,即如果 a.equals(b)为true, a与 b必须具有相同的散列码。

在这里插入图片描述

图中链表数组,每个列表称为桶。

基于散列表查找是否相同的元素:首先计算hashcode得到散列码,与桶总数求余,得到索引,最后使用新对象与桶中所有对象进行比较,查看对象是否存在。大大缩短比较时间。

利用散列表思想:HashSet(散列集)来判断集中相同元素是否存在

4,树集TreeSet

树集是一个有序集合,对集合进行遍历时,每个值将自动按照排序后的顺序呈现。排序是用树结构完成的(红黑树),每次将一个元素添加到树中时,都会被放置在正确的排序位置上。

5,队列与双端队列

暂略


三,映射

映射用来存放键 / 值对。如果提供了键,就能够查找到值。Java类库为映射提供了两个通用的实现:HashMap和TreeMap。这两个类都实现了Map接口。

  • HashMap对键进行散列, TreeMap用键的整体顺序对元素进行排序, 并将其组织成搜索树。散列或比较函数只能作用于键。与键关联的值不能进行散列或比较。

1,常用方法

V get(Object key)//获取与键对应的值;返回与键对应的对象, 如果在映射中没有这个对象则返回null。键可以为null。
    
default V getOrDefault(Object key, V defaultValue)
//获得与键关联的值;返回与键关联的对象, 或者如果未在映射中找到这个键,则返回defaultValue。
    
V put(K key, V value)
//将键与对应的值关系插入到映射中。如果这个键已经存在, 新的对象将取代与这个键对应的旧对象。这个方法将返回键对应的旧值。如果这个键以前没有出现过则返回null。键可以为null,但值不能为 null。
    
void putAll(Map<? extends K , ? extends V> entries)
//将给定映射中的所有条目添加到这个映射中。

boolean containsKey(Object key)
//如果在映射中已经有这个键, 返回true。
    
boolean containsValue(Object value)
//如果映射中已经有这个值, 返回 true。

default void forEach(BiConsumer<? super K ,? super V> action)
//对这个映射中的所有键 / 值对应用这个动作。

2,映射视图

有3种视图:键集、值集合(不是一个集)以及键/值对集。

Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
//分别返回以上三个视图

Map.Entry<K,V>类中的方法:

K getKey()
V getValueC)
//返回这一条目的键或值。
V setVa1ue(V newValue)
//将相关映射中的值改为新值,并返回原来的值。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:21:25  更:2021-08-14 14:23:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:13:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计