集合(2)

2. 具体的集合

集合框架中的类

从上图中可以看出,除了Map结尾的类都实现了collection接口

从下图中可以看出java库具体的集合

java集合

2.1 链表

我们知道数组和ArrayList有一个重大缺陷。这个缺陷就从数组的中间位置删除一个元素需要付出重大的代价,因为从数组中间删除一个元素,元素中间的位置都需要向前移动

所以我们可以利用一个大家非常熟悉的数据结构——链表来解决这个问题

数组在连续的位置上存放着对象的引用,但链表将每个对象存放在独立的节点中。每个结点存放着下个结点的引用

集合类库中提供了子接口ListIterator,其中包含add方法:

interface ListIterator <E> extends Interator<E> {     void add(E element);     E pervious();     boolean hasPervious(); }

与Collection.add不同,这个方法不返回boolean类型的值。

与next方法一样,previous总是返回被越过的值

不能利用一个interator对象删除一个数组的同时,利用第二个interator再读取这个链表

链表的set方法不会对造成结构性损害

collection 接口中声明了许多用于对链表进行操作的方法,其中大部分都是在LinkList的超类中AbstractCollection中实现的,可以利用contains来检测链表是否含有某一个元素

下面我们简单的写个LinkedList  (如果您知道输出请在评论区发表,就当一次测验)

import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class LinkedlistTest {     public static void main(String[] args){         List a = new LinkedList<>();         a.add("Amy"); a.add("Carl");         a.add("Eciri"); List b= new LinkedList<>();         b.add("x"); b.add("xx"); b.add("xxx");         b.add("xxxx");         // merge b into a ListIterator         aIter = a.listIterator();         Iterator bIter = b.iterator();         while (bIter.hasNext()){             if (aIter.hasNext()){                 String d = aIter.next();                 System.out.println(d);             }             aIter.add(bIter.next()); }             // remove every second word from b             bIter = b.iterator();             while (bIter.hasNext()){                 bIter.next();                 if (bIter.hasNext()){                     bIter.next();                     bIter.remove();                 }              }              System.out.println(a);              System.out.println(b);               a.removeAll(b) ;              System.out.println(a) ;     } }

介绍一下List接口常用的方法

ListIterator<E> lisIterator()     //访问列表迭代器,以便访问列表中的元素

ListIterator<E> listIterator(int index)     // 访问列表迭代器,从索引位置开始访问。

void add(int i, E element)      //在给定位置添加一个元素。

void addAll(int i, Col1ection elements) //将某个集合中的所有元素添加到给定位置。

2.2 数组列表

常见的就是ArrayList也实现了List接口,这个接口封装了一个动态可分的数组

2.3 散列表

在不在乎顺序的情况下,可以高效的读取数据

如果自定类需要实现自己的散列码,就是实现自己的hashCode。equals相等hashCode必定相等

散列表

左边每个列表称之为桶,要想查出表中对象的位置,就要先计算他的散列码,然后与桶的总数取余,所得到的就是这个元素在这个桶的索引。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏XAI

程序员必知的8大排序(java实现)

8种排序之间的关系: ?  1、 直接插入排序   (1)基本思想:   在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要...

19910
来自专栏杨熹的专栏

【LEETCODE】模拟面试-39. Combination Sum

和subset区别:规定了子集的sum==target 注意,这里传递的起始位置是i,而不是position+1,but why??? helper(res, ...

2815
来自专栏我的技术专栏

数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

1803
来自专栏皮皮之路

【JDK1.8】JDK1.8集合源码阅读——LinkedList

1413
来自专栏老马说编程

(54) 剖析Collections - 设计模式 / 计算机程序的思维逻辑

上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类。...

2479
来自专栏来自地球男人的部落格

[LeetCode] 442. Find All Duplicates in an Array

【原题】 Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elemen...

2038
来自专栏赵俊的Java专栏

从源码上分析 LinkedList(附图)

1585
来自专栏Bingo的深度学习杂货店

Q67 Add Binary

Given two binary strings, return their sum (also a binary string). For example, ...

2788
来自专栏LanceToBigData

JavaSE(八)之集合概述

前几天其实一直在学习关于linux的内容和kvm虚拟化的知识。今天有时间来回顾一下集合相关的知识,接下来我将带大家一起来回顾一起集合关联的知识。 不要辜负自己花...

1845
来自专栏郭耀华‘s Blog

Java集合框架(三)—— List、ArrayList、Vector、Stack

List接口 List集合代表一个有序集合,集合中每一个元素都有其对应的顺序索引。List集合容许使用重复元素,可以通过索引来访问指定位置的集合对象。 ...

3065

扫码关注云+社区