集合
什么是算法和数据结构
算法:
可以解决具体问题。例如:1+2+3+4+5.。。+99+100
流程=算法
有设计解决的具体的流程
算法1:(1+100)× 50= 101 × 50–>高斯算法
有评价这个算法的具体指标
有评价这个算法的具体的指标–>时间复杂度,空间复杂度(从数学角度考虑)
数据结构:如何组织管理数据的结构,按照某种规则结构来组织管理我们的数据
数据结构分为:
逻辑结构:–>思想上的结构–>卧室,厨房,卫生间–>线性表(数组,链表),图,树,栈,队列
物理结构:–>真实结构–>钢筋混凝土+牛顿力学–>紧密结构(顺序结构),跳转结构(链式结构)
以线性表为例:
线性表逻辑结构表述图:
线性表的特点:
线性表是n个数据类型相同的数据元素的有限序列,通常记作:a,ai-1,ai,ai+1
1、相同的数据类型
线性表中可以有n个相同属性的元素,比如可以都是数字,可以都是字符,相同类型意味着每一个元素占用相同的内存空间。
2、序列(顺序性)
ai-1,ai,ai+1为例子,ai的前一位是ai-1,ai的后一位是ai+1,一般ai0为表头,除了表头和表尾元素外,任何一个元素有且仅有一个直接前驱和一个直接后继
3、有限
线性表中的数据元素定义为n,n是个有限值,当n=0的时候就是线性表为空,在非空的线性表中每个数据元素都有唯一确定的序号,下标
逻辑结构和物理结构的关系
线性表逻辑,对应真实的如果是紧密结构,典型:数组;
线性表逻辑结构,对应的真实结构如果是跳转结构,典型为链表
什么是紧密结构?
在存储数据的时候选择相邻的位置存储,
以int数组为例,int 4位,下图所示:
优点:
寻址快–>查找元素快
缺点:
删除和增加元素效率低
什么是跳转结构?
以链表为例
单向链表:
每一个元素的位置除了存放自己的数据还要存放寻找下一个元素的地址
双向链表:
每个元素除了存放自己的数据,还存放了上一个元素的地址和下一个元素的地址
循环链表:
就是首元素和尾元素互相指向,首尾相连
跳转结构:
优点:删除元素,插入元素效率高,
缺点:查询元素效率地。为什么?
应为我如果像查找一个元素我要从上一个寻找,如果多的话,十分麻烦,数组寻址找是直接寻找,效率十分之快
集合前言
数组,集合都是对多个数据进行存储操作,简称为容器
PS:这里的存储是内存层面的存储,而不是持久化存储
数组:只能存放同一种类型的数据
,长度无法更改,只能放同一种类型的数据
一旦指定了长度,那么长度就被确定,不可以更改,删除增加效率低,无法直接判断数组的实际元素的数量,需要我们自己去写,存储为有序,可重复。
如何解决数组的缺点?
用于解决数组缺点的新的存数的数据结构—>集合
集合
我们有很多集合,为什么要学习这么多集合,应为不容的集合底层的数据机构不一样
将集合分为两种类型
存储方式:
一个一个数据的存储
一对一对数据的存数
colletion接口
- 新增:add(E e)
- 修改:
- 删除:remove(Object o),clear()
- 查看:iterator(),size()
- 判断:contains(Object o),equals(Object o),isEmpty()
/* * 新增:add(E e) * 修改: * 删除:remove(Object o),clear() * 查看:iterator(),size() * 判断:contains(Object o),equals(Object o),isEmpty() * */ public static void main(String[] args) { //接口不能创建对象:利用实现类创建 Collection col = new ArrayList(); // 集合有一个特点,只能存放引用数据类型,不能是基本数据类型, // 基本数据类型自动装箱,对应包装类 col.add(18); col.add(12); col.add(15); System.out.println(col); List list = Arrays.asList(new Integer[]{2,1,3,4,5}); col.addAll(list); System.out.println(col); col.clear(); System.out.println(col); System.out.println("集合的数量:"+col.size()); System.out.println("集合是否为空:"+col.isEmpty()); boolean remove = col.remove(15); System.out.println(col); System.out.println("是否删除成功:"+remove); Collection col2 = new ArrayList(); col2.add(18); col2.add(12); col2.add(15); Collection col3 = new ArrayList(); col3.add(18); col3.add(12); col3.add(15); System.out.println(col2.equals(col3));
集合有一个特点,只能存放引用数据类型,不能是基本数据类型,那我们为什么加入基本类型没有报错?
解:基本数据类型自动装箱,对应包装类
遍历的两种方式
增强for循环
for (Object o : col) { System.out.println(o); }
迭代器
Iterator it = col.iterator(); while (it.hasNext()){ System.out.println(it.next()); }