JavaSE02_Day03(上)-队列(单向、双向)、栈、Maven(定义、优点、配置、创建项目、下载jar包)
一、队列和栈
1.1 单向队列Queue
队列继承自Collection接口:public interface Queue<E> extends Collection<E> ,队列遵循“先进先出”原则(FIFO:First Input First Output)。队列用Queue表示,并且它也是一个容器,可以用来进行存储一组数据。

package cn.tedu.collection_three;
import java.util.LinkedList;
import java.util.Queue;
/**
* 队列是非常经典的数据结构之一,用Queue表示,
* 使用队列可以进行存储一组数据,队列的超类是
* Collection接口,并且也支持在存储元素的过程中
* 指定存储元素的类型,遵循的原则:FIFO
* @author cjn
*
*/
public class QueueDemo {
public static void main(String[] args) {
//1.创建队列对象
Queue<String> queue = new LinkedList<String>();
/*
* 2.向队列中添加元素内容(入队)
* boolean offer(E e)
*/
queue.offer("星期一");
queue.offer("星期二");
queue.offer("星期三");
queue.offer("星期四");
queue.offer("星期五");
System.out.println("队列对象为:" + queue);
/*
* 3.出队
* E poll()
*/
String str = queue.poll();
System.out.println("出队的元素为:" + str);
System.out.println("查看当前队列对象为:" + queue);
/*
* 4.查看队列中的首元素,但是元素不离队
* E peek()
*/
str = queue.peek();
System.out.println("查看队列中的首元素为:" + str);
System.out.println("查看当前队列对象为:" + queue);
/*
* 5.遍历队列中的元素内容,但是不会让元素离队
* 使用foreach新循环的方案进行遍历,
* 底层执行的时候,在编译期会转换为迭代器遍历
*/
for (String str1 : queue) {
System.out.print(str1 + " ");
}
System.out.println();
/*
* 6.查看队列中元素的个数
* int size()
*/
int num = queue.size();
System.out.println("队列中元素的个数为:" + num);
/*
* 7.让队列中的所有元素出队
* 之所以要加while判断,是因为在出队的过程中,size始终在变,不能直接使用
*/
while (queue.size() > 0) {
String str2 = queue.poll();
System.out.println(str2);
}
System.out.println("当前队列对象:" + queue);//[]
}
}
测试结果:
队列对象为:[星期一, 星期二, 星期三, 星期四, 星期五]
出队的元素为:星期一
查看当前队列对象为:[星期二, 星期三, 星期四, 星期五]
查看队列中的首元素为:星期二
查看当前队列对象为:[星期二, 星期三, 星期四, 星期五]
星期二 星期三 星期四 星期五
队列中元素的个数为:4
星期二
星期三
星期四
星期五
当前队列对象:[]
注意:
-
问题:为什么不用add而用offer?
-
答案:add方法在不违反队列的容量限制的情况下,往队列中添加一个元素,如果添加成功则返回true。如果因为容量限制添加失败了,则抛出IllegalStateException异常,在有容量限制的队列中,最好使用offer方法。另外,add方法相对于offer方法而言,有一个专门抛出的异常IllegalStateException,代表由于容量限制导致不能添加元素的异常,接口中可能看不出,等到具体实现就明白了。
1.2 双向队列Deque
双向队列用Deque表示,也是一个接口,继承自Queue:public interface Deque<E> extends Queue<E> ,双向队列是可以首尾两端进行进出的容器。无论是单向队列还是双向队列,常用的实现类LinkedList。

package cn.tedu.collection_three;
import java.util.Deque;
import java.util.LinkedList;
/**
* 双向队列案例演示
* Deque是可以首尾两个方向进行进出元素的数据结构
* @author cjn
*
*/
public class DequeDemo {
public static void main(String[] args) {
//1.创建双向队列对象
Deque<String> deque = new LinkedList<String>();
//2.向队列中添加元素内容:boolean offer(E e);
deque.offer("星期一");
deque.offer("星期二");
deque.offer("星期三");
deque.offer("星期四");
deque.offer("星期五");
System.out.println("双向队列对象:" + deque);
//3.从队首进行入队:boolean offerFirst(E e);
deque.offerFirst("星期日");
System.out.println("双向队列对象:" + deque);
//4.从队尾进行入队:boolean offerLast(E e);同offer一样
deque.offerLast("星期六");
System.out.println("双向队列对象:" + deque);
//5.从队首进行出队:E pollFirst();同poll一样
deque.pollFirst();
System.out.println("双向队列对象:" + deque);
//6.从队尾进行出队:E pollLast();
deque.pollLast();
System.out.println("双向队列对象:" + deque);
//7.查看队首元素(不离队):E peekLast();同peek一样
String str = deque.peekFirst();
System.out.println("查看队首元素:" + str);
System.out.println("双向队列对象:" + deque);
//8.查看队尾元素(不离队):E peekLast();
str = deque.peekLast();
System.out.println("查看队尾元素:" + str);
System.out.println("双向队列对象:" + deque);
}
}
测试结果:
双向队列对象:[星期一, 星期二, 星期三, 星期四, 星期五]
双向队列对象:[星期日, 星期一, 星期二, 星期三, 星期四, 星期五]
双向队列对象:[星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]
双向队列对象:[星期一, 星期二, 星期三, 星期四, 星期五, 星期六]
双向队列对象:[星期一, 星期二, 星期三, 星期四, 星期五]
查看队首元素:星期一
双向队列对象:[星期一, 星期二, 星期三, 星期四, 星期五]
查看队尾元素:星期五
双向队列对象:[星期一, 星期二, 星期三, 星期四, 星期五]
1.3 栈
栈并不是指第一阶段学习对象内存管理时的栈,当前所学习的栈也是数据结构其中之一,可以使用栈进行存储一组元素,使用栈进行对元素存取时需要遵守“先进后出(FILO)”的原则,通常使用栈可以进行实现"后退的功能"。(类似于子弹上膛,先上的最后发射)

package cn.tedu.collection_three;
import java.util.Deque;
import java.util.LinkedList;
/**
* 数据结构之一:栈案例演示
* Deque除了可以实现双向队列以外,
* 也可以用它实现栈,栈相关的演示
* 需要调用不同的API方法
* @author cjn
*
*/
public class StackDemo {
public static void main(String[] args) {
//1.创建栈对象
Deque<String> deque = new LinkedList<String>();
/*
* 2.向栈中添加元素内容(入栈)
* void push(E e)
*/
deque.push("星期一");
deque.push("星期二");
deque.push("星期三");
deque.push("星期四");
deque.push("星期五");
System.out.println("查看栈对象:" + deque);
/*
* 3.出栈
* E pop()
*/
String str = deque.pop();
System.out.println("出栈对象为:" + str);
System.out.println("查看栈对象:" + deque);
}
}
测试结果:
查看栈对象:[星期五, 星期四, 星期三, 星期二, 星期一]
出栈对象为:星期五
查看栈对象:[星期四, 星期三, 星期二, 星期一]
二、Maven
2.1 定义:
Maven中文意思是"内行"、"专家"的含义,是Apache公司提供的使用Java语言进行开发的项目产品。使用Maven可以进行对项目的构建、报告、文档等步骤操作。
2.2 优点:
-
是行业内的规范,几乎所有的公司在进行开发项目时都会使用Maven;
-
可以使用Maven帮助程序员下载项目中需要使用到的jar包依赖;
-
在第四阶段使用:创建聚合项目(创建父级项目进行管理多个子级模块项目)
2.3 使用Maven
-
下载Maven
从苍老师的网站中下载阿里云镜像的压缩包,然后解压到本地,解压以后是一个settings.xml文件,需要将这个文件放到当前存储Java代码的工作空间中。并不是非得放到这个工作空间中,放到其他的文件夹目录也可以,只要是大家可以找到的位置均可。
2.4 Maven的配置
(1)Eclipse工具做关联配置
window--->Perferences

Maven--->User Settings--->将下载好的阿里云或华为的maven:settings.xml文件复制到该工作空间下,选择该文件进行关联--->Update Settings

配置完成后,软件自动进行maven配置下载和更新,接下来需要检查maven是否安装成功。
Window--->Show View---Others...

输入maven,查看是否能加载相关组件,可以加载说明安装成功。

(2)IDEA工具做关联配置
保证前三点的操作之后再进行操作


以后工作中使用Maven下载及其配置参考:
1、 windows:https://www.jianshu.com/p/ad49d3d04800
2.5 创建第一个Maven项目
左侧空白处单击右键或File-->New--->Project.../Other...,输入Maven进行查询,选择Maven Project



最终项目结构

注意:如果项目的目录结构不正确,或者项目中的jar包下载不完整,可以更新当前项目,步骤如下:


解释:如果使用Eclipse工具下载jar包,添加jar包节点后会自动下载,下载不全时可以如上面操作进行更新下载。如果使用的是IDEA工具,当添加jar包节点后需要手动点击确认下载,否则不会下载,确认项在工作的右侧目录中有一个Maven的菜单,单击一下,然后弹出的菜单项上面会有一个刷新的按钮。
2.6 通过Maven工具下载jar包
假设目前项目业务中需要使用Junit单元测试jar包
1.打开浏览器,输入https://mvnrepository.com/网址

2.在当前网页的搜索框区域输入需要进行下载的jar包
(1)输入要查找的jar包

(2)点击一个搜索结果进去

(3)点击一个版本进去

3.把jar包坐标添加到项目的pom.xml文件中并保存,需要手写添加一个dependencies节点
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
4.查看项目中在Maven Dependencies目录下是否有下载好的jar包,如果有证明下载成功。
添加代码:

注意:有关于项目下载jar包的使用会在后续课程中持续讲解

浙公网安备 33010602011771号