数据结构小节(1)

接口总结

UML类图中的关系

  1. 依赖 : 局部变量和外部类的关系
  2. 关联 : 简单理解的话就是成员变量
  3. 聚合:has-a的成员变量,整体与部分分离,有各自独立的生命周期。eg: 公司&员工,电脑&cpu
  4. 合成: contains-a关系的成员变量,外部类和内部成员保持同一个生命周期
  5. 实现 : 实现类 实现→ 接口 比如Chinese实现Person
  6. 泛化 : 父类与子类的关系,继承为其中一种

集合的分类

  • 集合主要被分为Collection和Map两个接口
  • Collection被List和Set继承
  • List被AbstractList实现,然后分为ArrayList,LinkedList和Vector
  • Set被AbstractSet实现,然后分为HashSet,TreeSet
  • Map衍生出HashMap,HashTable和TreeMap

Collection接口

Collection接口基本操作

  1. add()
  2. addAll()
  3. clear();
  4. contains();
  5. ...
  6. ...

AbstractCollection实现方法

  1. contains()
  2. isEmpty()
  3. toArray()
  4. remove()
  5. clear()

子接口List

一个list是元素有序,可以重复,可以为null的集合

最好做法是: 默认使用ArrayList,多插入删除时使用LinkedList,Vector太慢避免使用

List实现有序,可重复的原理

  1. List的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续空间,然后将空间地址与索引对应
  2. ArrayList本质为数组
  3. List元素存储是互不干扰,所以可以重复(与Set有很大区别)

List接口定义的方法

除了Collection自带方法还提供以下的操作:

  • 位置相关:比如get,set,add,addAll,remove;
  • 搜索: 从list中查找元素位置, indexof,lastindexof
  • 迭代: 使用Iterator的扩展版迭代器,ListIterator进行迭代操作
  • 范围性操作: subList;

集合操作

public boolean equals(Object o){
?    retrun this == o;
}
  • 比较地址是否相等,如果要比较内容,需要重写.equals().

    remove(), contains(), indexof() 都需要用.equals();

public boolean contains(Object object){
?    Object[] a = array;
?    int s = size;
?    if (object!= null){
?    for (int i =0;i < s; i++){
?        if(object.equals(a[i])){
?            return true;
?        }
?    }
}
}
  • indexof() 方法差不多,但是要多一个else{} 遍历Object等于null的情况

位置访问,搜索

get,set,add,remove

  • set,remove方法返回被覆盖,被删除的元素

indexOf,lastIndexOf

  • 返回指定元素在list中的首次出现,最后一次出现位置(lastIndexOf为倒序遍历)

addAll(int,Collection)

  • 在指定地点插入集合所有元素,元素按照迭代器Iterator返回的先后顺序进行插入

简单List swap()

public static <E> void swap(List<E> a, int i, int j){
?    E temp = a.get(i);
?    a.set(i,a.get(j));
?    a.set(j,temp);
}

局部范围操作

  • subList本质为返回原来list的引用,改变了开始位置的offset和size.
  • return new SubAbstractListRandomAccess<E>(this, start, end);
  • 对subList改动同样会影响原来的list;

List于Array的区别

相似之处

  • 都可以表示一组相同类型的对象
  • 都是用下标进行索引

不同之处

  • 数组可以存任何类型元素
  • List不可以存基本数据类型,必须包装
  • 数组容量固定, List容量可动态正常
  • 数组效率高, List由于需要维护,效率相对低

总结

  • 容量固定时先使用数组, 容纳类型更多更高效
  • 容量不确定的情况下, List更有优势

List与Array间的转换

  • Object[] toArray(): 返回一个包含List中所有元素的数组
  • T[] toArray(T[] array): 作用同上,不同的是,array长度大于List元素是.

    会使用参数array保存List中的元素; 否则会创建一个新的array存放List中元素

迭代器

  • List继承了Collection的iterator()方法,可以获取Iterator,使用它进行向后遍历
  • 在此基础上, List还可以获取更强大的迭代器ListIterator
  • ListIterator可以对list进行向前,向后双向遍历,同时还允许进行set,add,remove等操作

例子

public int indexOf(E e) { for (ListIterator<E> it = listIterator(); it.hasNext(); ) if (e == null ? it.next() == null : e.equals(it.next())) return it.previousIndex(); // Element not found return -1; }
public static <E> void replace(List<E> list, E val. E newVal){
?    for(ListIterator<E> it = list.listIterator();it.hasNext();){
?       if (val == null ? it.next == null ; val.equals(it.next()));
?       it.set(newVal);
?       }
}

原文地址:https://www.cnblogs.com/Kojima223/p/9840198.html

时间: 2024-07-30 22:14:38

数据结构小节(1)的相关文章

数据结构小节(上)

蒟蒻最近学习了一些数据结构,下面是蒟蒻的总结. $$$$ 1.线段树合并 所谓线段树合并,字面上理解,就是将两颗线段树合并在一起,所以多用于权值 线段树,而且多在 树形结构 的题中出现.然而对两颗满二叉树的合并一次复杂 度会达到\(O(nlog_2n)\) 对于总操作\(m\),一般来说每次就是动态开点复杂度\(O(mlog_2n)\).然后考虑每 次合并的活,我们每一次只会把 有的 都加起来,接着递归向下处理,把 没有 的直接接到新的线段树上.所以复杂度其实是关乎重叠部分的.如果重叠的越 多,

数据结构之网络流入门(Network Flow)简单小节

网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. 汇点:另一个点也很特殊,只进不出,叫做汇点. 容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常用c[i,j]表示,流量则通常是f[i,j]. 通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量.很显然的,流量<=容量.而对于每个不是源点和汇点的点来说,可以类比的想象成没有存储功能的货物的中转站,所有“进入”他们的流量和等于所有从他本身“出去”的流量. 最大流

HashMap数据结构

2.1 HashMap 2.1.1 HashMap介绍 先看看HashMap类头部的源码: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hash

redisbook笔记——redis内部数据结构

在Redis的内部,数据结构类型值由高效的数据结构和算法进行支持,并且在Redis自身的构建当中,也大量用到了这些数据结构. 这一部分将对Redis内存所使用的数据结构和算法进行介绍. 动态字符串 Sds(Simple Dynamic String,简单动态字符串) Sds在Redis中的主要作用有以下两个: 1. 实现字符串对象(StringObject): 2. 在Redis程序内部用作char* 类型的替代品: 对比C 字符串,sds有以下特性: –可以高效地执行长度计算(strlen):

【E2LSH源码分析】E2LSH源码综述及主要数据结构

上一小节,我们对p稳定分布LSH的基本原理进行了介绍(http://blog.csdn.net/jasonding1354/article/details/38237353),在接下来的博文中,我将以E2LSH开源代码为基础,对E2LSH的源码进行注解学习,从而为掌握LSH的基本原理以及未来对相似性搜索的扩展学习打下基础. 1.代码概况 E2LSH的核心代码可以分为3部分: LocalitySensitiveHashing.cpp--主要包含基于LSH的RNN(R-near neighbor)数

【算法与数据结构】B-树学习笔记

B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.按照翻译,B 通常认为是Balance的简称.这个数据结构一般用于数据库的索引,综合效率较高. B-tree中,每个结点包含: 1.本结点所含关键字的个数: 2.指向父结点的指针: 3.关键字: 4.指向子结点的指针: B-tree是一种多路搜索树(并不是二叉的),对于一棵M阶树: 1.定义任意非叶子结点最多只有M个孩子:且M>2: 2.根结点的孩子数为[2

【Java】Java集合框架源码和数据结构简要分析——Set和Map

前言 之前一直把集合框架分成Collection和Map来对待,主要是基于储存内容是单列和双列,实际上这样来区分不太正确,set实际上是双列的结构. 现在回顾集合框架,看到很多当初看不到的东西. 现在来看集合框架,一部分是List,一部分是Set和Map,Set和Map几乎就是一回事. 本文假设你已经对集合框架有一定了解,关于细节请看<集合框架和Map基础>. 一.数据结构 不讲太深入的东西,实际上我也讲不了多深入. 数据结构,就是一堆数据的关系. 逻辑结构--数据逻辑上的关系,其实就是数据结

数据结构课程设计论文--学生信息管理系统

数据结构课程设计论文--学生信息管理系统 1.学生成绩分析问题 (1)问题描述.录入并保存一个班级学生多门课程的成绩,并对成绩进行分析. (2)基本要求.a)通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat.b)对文件input.dat中的数据进行处理,要求具有如下功能:按各门课程成绩排序,并生成相应的文件输出:计算每个人的平均成绩,按平均成绩排序,并生成文件:求出各门课程的平均成绩.最高分.最低分.不及格人数.60~69分人数.70~79分人数.80~89分人数.90分以上

Redis系统学习 三、使用数据结构

前言:上一章,简单介绍了5种数据结构,并给出了一些用例.现在是时候来看看一些高级的,但依然很常见的主题和设计模式 一.大O表示法(Big O Notation ) 常用时间复杂度O(1)被认为是最快速的,无论我们是在处理5个元素还是5百万个元素,最终都能得到相同的性能.对于sismember命令,其作用是告诉我们一个值是否属于一个集合,时间复杂度为O(1).sismember命令很强大,强大的一部分原因是其高效的性能特征.许多Redis命令都具有O(1)的时间复杂度 对数的时间复杂度 O(log