JavaSE_数据结构

一、 数据结构

  1. 什么是数据结构?
    数据结构是计算机对数据存储的一种安排.
    理解1:对数据 安排是可以有多种,所以数据结构是多样的
    理解2:特定数据结构组成的数据,它应该有一些规律。
    (有不同的特点)

  2. 数据存储方式
    (1): 变量(变量声明格式: 数据类型 变量名)
    变量作用:可以存储一个数据值;
    变量特点:只能存放一个值.
    注意:
    值和类型匹配问题:数据类型限定了变量可以存储的数据类型
    成员变量和局部变量问题:在使用局部变量之前,必须赋值
    (2)数组的声明格式: 数组中元素的类型[] 数组名
    例: int[] ages = new int[3]
    数组的作用:可以存储多个数据;
    数组操作:存值 ages[0] = 10,取值 ages[0]
    特点:长度固定,只能够是存储同种类型;
    (3)自定义容器类
    ① 可以存储任意多个元素;(可以自动扩容)
    ② 可以存储任意类型的数据;(object超类)

    		关于自定义容器类的	存取值:
    

方案一:把里面的数组设置为private,提供get,set方法;通过get就可以取得数组的值
方案二:在类里面提供一个方法,比如add,调用一次,就往里面添加一个值;(实用)
注:自定义容器实现
实现步骤:
① 定义一个自定义容器类 IntArray
② 创建一个存放数据的数组 比如 int[] data= new int[10];
③ 定义一个添加方法 add ,调用一次给当前容器对象添加一个元素
④ 创建自定义容器类对象,调用add方法,添加元素
自定义容器–自动扩展
创建指定长度容器
通过提供的构造方法完成,添加指定大小的容器;
JavaSE_数据结构_第1张图片
自动扩展长度
JavaSE_数据结构_第2张图片
JavaSE_数据结构_第3张图片
支持任意类型
支持任意类型的容器,比如支持字符串,整型,boolean型等
内部使用Object数组来存储 Object [] date;
自定义容器–查找
①查找指定索引处的元素;
JavaSE_数据结构_第4张图片
②查找指定元素第一次出现的索引
JavaSE_数据结构_第5张图片
目前已经可以添加数据,为了让这个自定义容器更好用,在添加几个额外的功能,比如 查找功能
查找功能:
①查找指定索引处的元素;

		 ②查找指定元素第一次出现的索引

自定义容器–删除(难点)
①删除指定索引处的元素
②删除指定的第一个元素

删除指定索引处的元素 (形参是索引,返回值 被删除的元素)
JavaSE_数据结构_第6张图片

② 删除指定的第一个元素;------------->

JavaSE_数据结构_第7张图片

二.数据结构-(链表)

链表引入
已经使用变量,数组,还有自定义容器类存放数据;

变量:存储一个值;
数组:存储多个值;
自定义容器类: 在类中封装一个数组;

对于变量直接赋值使用; 对于数组,通过下标使用; 对于自定义容器类的操作,我们通过添加add方法,进行使用.它的原理是内部使用数组来存储实现,但是用户并不关心内部怎么实现.

需求:--------------------------------->

如果在设计一个容器类(自定义一个容器类),对于容器类的操作,一般提供一个add方法,调用add方法的时候,需要传一个值,然后把值存放在容器里面,
但是现在【不用数组】, 那还可以用什么类型方式存储?

分析:-------------------------->
现在基于变量的方式来存储,比如一组零散的数据放到容器里面,对于容器类,能够准确的提供方法来添加,能够操作就可以了,我们也不关心怎么存放;
对于这些数据,可能是整型,字符串,假如现在把这些零散的数据都看成对象.

比如使用变量 :int i1 = 11;
int i2 = 4;
如果看成对象使用Integer的写法:
Integer i11 = 11;
Integer i12 = 4;

如果看成对象来看的话,在堆栈图中是怎样的?
栈里面i11,指向堆里面地址,所以操作这些地址就是相当于操作值了.
现在我把这些零散的对象连起来。

第一个对象地址,比如0x1234,容器类里面存放一个变量(Integer i11)

i11,拿到i11的地址,因为跟其他对象是关联的,那它是不是也就拿到的其他关联上对象的地址。

JavaSE_数据结构_第8张图片
示意图:--------------------------->

问题: 怎样把 4 和11连接起来?
分析:比如现在把Integer i11 变量指向它的引用,相等于把i11存放在容器类里面了,现在
让11对象里面存放4的地址,但是都是Integer 对象,怎么存放别对象的地址?

思路: 根据刚才分析,在容器当中存放一个变量,也就是定义一个变量,指向该对象;
在对象当中,又有变量指向其他对象.这就就连接起来;

现在自定义一个类Node(相当于口袋),类里面定义两个字段,
① 一个Object类型存放值,
② 一个Node类型字段,存放下一个Node对象地址.
把11封装成一个Node对象,把对象放到容器里面,但是现在不放在容器里面,而在内部定义Node类型变量first,把first指向11地址;如果在添加一个。比如22,通过一个方法,把22封装成Node对象,然后让11和22联系起来,那怎么让11和22联系起来?
class Node{
Object data;//用于添加数据…
Node node;//用于保存下一个对象的地址
}
可以在11对象中定义一个变量,让这个变量指向22这个对象,那就应该在Node类里面定义一个变量,这个变量存放什么值,就是存放Node对象,所以应该定义成Node类型。
如下图:

这种一个对象连着一个对象的结构 — 链表;
JavaSE_数据结构_第9张图片

三、基于类实现链表

定义容器类,定义一个口袋类(Node),在容器里面有个字段,在容器类里面还应该提供添加,查找,删除方法;比如类里面提供一个add方法;

完善链表结构add方法?

①把用户传入的数据打包成Node对象,但是需要把Node对象放到容器里面去,不能放到方法里面创建,所以放到自定义容器类里面创建,比如在容器里面创建一个Node对象first,让first变量指向创建的对象。

②把打包好的数据挂在first上面,注意在挂上去之前,先判断,如果是第一次,直接挂上去放到first上,如果第二次,第三次,挂在最后一个添加Node对象的上面;

怎么确定是第一次添加?First等于null的时候,是第一次;直接把Node的值赋值给first就添加好第一个元素;
JavaSE_数据结构_第10张图片

链表添加实现
每一次添加一个元素的时候,先封装成一个Node对象,添加之前进行判断,如果添加的是第一个元素(first == null),直接赋值,如果添加的是第二个元素,放到整个链表结构的最后,所以需要找到链表结构中最后一个对象。怎么找到最后一个对象?

如果Node对象的next字段为空,那么这个对象就是最后一个,怎样找到next对象为空。

JavaSE_数据结构_第11张图片
分析:---------->

临时定义一个变量Node f;
第一次,f=first :f和first同时都指向第一个对象,操作f相当于操作第一个对象;
判断 (f.next == null)如果为 false --》转移目标,让f指向下一个对象,怎么让f指向下一个对象; f.next 就是指的第二个对象地址;
第二次,f = f.next :f指向第二个对象,再一次操作f,相当于操作第二个对象,
判断 f.next == null false —》转移目标。。。
直到f.next == null ,true f指向对象的next为空,f.next = node;
JavaSE_数据结构_第12张图片
上面while循环完之后,temp始终指向的对象的next 为空.

链表覆写toString方法
现在对于自定义容器里面,添加了一个add方法,调用一次添加一次,现在我想验证是否已经添加进去容器里面,怎么验证?(覆写tostring)

JavaSE_数据结构_第13张图片

JavaSE_数据结构_第14张图片

你可能感兴趣的:(java基础,javaSE,链表,数据结构)