一. 练习
对于面试常出现的问题进行介绍。
这里有两个数据结构,对两者进行一个介绍。
队列像管子,从左端开始进入,随着后面的进入,先进入的被挤到右端,直到先从右端挤出。
为了符合项目中的需求,现在准备做这两个机构,完成我们的实际需求。
有人说,采用前一节讲述的removeFisrt,不是这样来操作的,需求是指让你做个具备特定功能的容器出来,而不是自己书写一下这样的操作。
我们应该描述这样一个容器,给使用者提供一个容器对象来完成这两种结构中的一种。
二.
现在描述一下队列,先编写一个类来描述一下。队列容器有一个特点,能完成先进先出的的操作,调用玩添加方法,调用取的方法时,怎么存进去就怎么取出来。
当我们自己做容器比较困难的话,可以依赖于现有的容器。
截图中有两点需要注意:这个类的功能不是继承来的,而是通过类中定义一个特定类型的对象,接着将特定类型对象的方法提取出来作为自己创建对象的方法。
注意:这种在内部创造特定类型对象,而不是继承特定对象的方法,可以使得自己创建的对象,具备特定的功能,而没有其它功能,看着比较简洁。
添加和取出的方法,有first和last的标注,两者不同就是队列,相同(addLast和removeLast)就是堆栈。
最后要判断容器中有没有元素。存和取挺容易知道,但是这个判断也是必须的么?
本例中,创建的类将LinkList的方法全部封装起来的了,封装完后,就看不到LinkList了,看到的只能是我们自己创建的类。
其实这么写不太合适,应该提供一个工具类。
应该提供一个工具类,叫做队列这么一个类,把定义的内容都拿到这个类里面,因为这样是单独的一个对象。同时,DuiLie()前面还要带上public,这要暴露出去方便使用。
有了定义好的工具类,之前的例子可以换一种写法。
后期1.6版本又提供了一些新的方法,在LinkList链表结构当中。如下图所示。
这些方法和现有方法的功能是相同的,但是有些区别,升级是有原因的。
区别需要知道,开发的时候明确用哪个方法。
getFirst方法有个特点,如果链表里面什么也没有,调用该方法的话,是没有东西的。它会抛出异常,这个异常叫做没有这个元素异常。
对于它的替代方法peak来讲,没有元素的话,返回null。空意味着我可以做判断,
LinkList相对ArrayList要少用一些,因为我们更多是以查询动作为主。
package collectionsDemo; /*使用LinkedList来模拟一个堆栈或者队列数据结构 * * 堆栈:先进后出 * * 队列:先进先出 * * 我们应该描述一个容器,给使用提供一个容器对象完成这两种结构的一种。 */ import java.util.Iterator; import java.util.LinkedList; public class LinkedTest { public static void main(String[] args) { DuiLie d1 = new DuiLie(); d1.myAdd("abc1"); d1.myAdd("abc2"); d1.myAdd("abc3"); d1.myAdd("abc4"); while (!d1.isNull()) { System.out.println(d1.myGet()); } } }
package collectionsDemo; import java.util.LinkedList; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } /** * 队列的添加元素功能 */ public void myAdd(Object obj) { link.addLast(obj); } //获取 public Object myGet() { return link.removeFirst(); // return link.removeLast(); } //是否为空 public boolean isNull() { return link.isEmpty(); } }