「双端java」双端面研磨机

博主:adminadmin 2023-01-22 07:48:10 258

今天给各位分享双端java的知识,其中也会对双端面研磨机进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

用JAVA语言,编写一个链表类(双向链表),实现插入,删除,查找操作。新手,要俗易懂些,最好自己调适通过。急

定义接口:

//Deque.java

package dsa; //根据自己的程序位置不同

public interface Deque {

public int getSize();//返回队列中元素数目

public boolean isEmpty();//判断队列是否为空

public Object first() throws ExceptionQueueEmpty;//取首元素(但不删除)

public Object last() throws ExceptionQueueEmpty;//取末元素(但不删除)

public void insertFirst(Object obj);//将新元素作为首元素插入

public void insertLast(Object obj);//将新元素作为末元素插入

public Object removeFirst() throws ExceptionQueueEmpty;//删除首元素

public Object removeLast() throws ExceptionQueueEmpty;//删除末元素

public void Traversal();//遍历

}

双向链表实现:

//Deque_DLNode.java

/*

* 基于双向链表实现双端队列结构

*/

package dsa;

public class Deque_DLNode implements Deque {

protected DLNode header;//指向头节点(哨兵)

protected DLNode trailer;//指向尾节点(哨兵)

protected int size;//队列中元素的数目

//构造函数

public Deque_DLNode() {

header = new DLNode();

trailer = new DLNode();

header.setNext(trailer);

trailer.setPrev(header);

size = 0;

}

//返回队列中元素数目

public int getSize()

{ return size; }

//判断队列是否为空

public boolean isEmpty()

{ return (0 == size) ? true : false; }

//取首元素(但不删除)

public Object first() throws ExceptionQueueEmpty {

if (isEmpty())

throw new ExceptionQueueEmpty("意外:双端队列为空");

return header.getNext().getElem();

}

//取末元素(但不删除)

public Object last() throws ExceptionQueueEmpty {

if (isEmpty())

throw new ExceptionQueueEmpty("意外:双端队列为空");

return trailer.getPrev().getElem();

}

//在队列前端插入新节点

public void insertFirst(Object obj) {

DLNode second = header.getNext();

DLNode first = new DLNode(obj, header, second);

second.setPrev(first);

header.setNext(first);

size++;

}

//在队列后端插入新节点

public void insertLast(Object obj) {

DLNode second = trailer.getPrev();

DLNode first = new DLNode(obj, second, trailer);

second.setNext(first);

trailer.setPrev(first);

size++;

}

//删除首节点

public Object removeFirst() throws ExceptionQueueEmpty {

if (isEmpty())

throw new ExceptionQueueEmpty("意外:双端队列为空");

DLNode first = header.getNext();

DLNode second = first.getNext();

Object obj = first.getElem();

header.setNext(second);

second.setPrev(header);

size--;

return(obj);

}

//删除末节点

public Object removeLast() throws ExceptionQueueEmpty {

if (isEmpty())

throw new ExceptionQueueEmpty("意外:双端队列为空");

DLNode first = trailer.getPrev();

DLNode second = first.getPrev();

Object obj = first.getElem();

trailer.setPrev(second);

second.setNext(trailer);

size--;

return(obj);

}

//遍历

public void Traversal() {

DLNode p = header.getNext();

while (p != trailer) {

System.out.print(p.getElem()+" ");

p = p.getNext();

}

System.out.println();

}

}

java中push()和pull()是哪个类的方法,有什么作用?

Deque接口双端队列,可以当做栈和队列来使用。 用他的实现类linkedlist 。

添加元素、删除元素:当做栈使用:push添加 pop删除

当做队列使用:offer添加 poll删除

Java:双端队列插入节点,关于队列为空时插入节点的疑问

队列为空的情况下 在首部添加新节点的时候,其实firstNode和lastNode相同都是newNode

,但是无论队列是否为空 方法的最后都会设置firstNode=newNode, 所以为空的时候会设置lastNode=newNode; 在尾部添加新节点的道理也是这样;

java集合LinkedList()中offFirst()方法跟addFirst()方法有区别?

我看了一下java的开发文档。

没有找到offFirst(E e)方法,只找到了offerFirst()方法。

offerFirst(E e)方法和addFirst(E e)方法实现的功能都是在列表的开头插入指定的元素。但是,有个小小的不同。

请注意二者的返回值类型。addFirst(E e)的返回值是void,为空。而offerFirst(E e)的返回值是boolean,也就是说插入成功返回true,否则返回false。

那什么时候插入会失败呢?

具体原因如下:

在不违反容量限制的情况下,将指定的元素插入此双端队列的开头。当使用有容量限制的双端队列时,此方法通常优于 addFirst(E) 方法,后者可能无法插入元素,而只是抛出一个异常。(以上抄自java开发文档)

也就是说,当你用addFirst()向一个有容量有限制并且已经满了的队列里面插入元素的时候,会系统抛出异常。而用offerFirst()的时侯,你会获得返回值false,这时你可以自己做一些处理。而不用面对抛出一个异常的无奈。

ArrayDeque

写cs61b题目时惊叹为什么会有这种东西,于是搜索了一番,发现这容器还是很有意思的,于是搬运了一下。

参考: ArrayDeque - (jianshu.com)

Java ArrayDeque - Java教程 - 菜鸟教程 (cainiaojc.com)

在ArrayDeque类实现这两个接口:Java Queue和Java Deque

使用了数组来存储数据,同时用两个int值 head 和 tail 来表示头部和尾部。不过需要注意的是 tail 并不是尾部元素的索引,而是尾部元素的 下一位 ,即下一个将要被加入的元素的索引。

ArrayDeque 有三个构造函数来初始化,除了无参的构造函数使用了默认容量,其它两个构造函数会通过 allocateElements 函数来计算初始容量

数组的大小很特殊,大小必为2的n次方(2^n)。下面我们看看 allocateElements 方法

(1)对于一个小于2^30的值,经过五次右移和位或操作后,可以得到一个 2^k - 1 的值。最后再将这个值 +1 ,得到 2^k 。通过这个方法,可以将一个任意的初始值转化为2^n的值.

(2)不过有一点不足在于,如果本身传进来的值就是 2^n 的值,那么经过转化会变成 2^(n+1) ,所以我们在不用刻意去传入 2^n 的值。

(3)如果传入的值大于等于 2^30 ,那么经过转化会变成负值,即 0,此时会把初始值设置为 2^30 ,即最大的容量只有 2^30

在ArrayDeque中,数组是作为环形来使用的,正常情况下在末尾添加元素后,tail=tail+1是要判断是否越界,如果越界,会变为从索引0开始。参考如下图片,当H添加到索引7后,tail值会+1,此时tail=8,但是越界了,所以应该将tail设置为0。

我们看看 tail = (tail + 1) (elements.length - 1) 的正确性:

所以当 tail+1 = length - 1 ,此时数组并没有越界, (tail + 1) (elements.length - 1) 后得到的还是 tail+1 。如果 tail + 1 = length ,此时数组越界了, (tail + 1) (elements.length - 1) 后得到0。

所以通过 (tail + 1) (elements.length - 1) 可以跳过条件判断在环形数组中获取正确的索引值,然后再判断新的 tail 是否等于 head ,如果结果为 true ,那么数组已经满了,需要扩容,即 doubleCapacity() 。

原理和addLast相同

无论是从头部还是从尾部添加元素,都会判断 tail==head ,如果两个索引相遇,说明数组空间已满,需要扩容操作.

ArrayDeque支持从头尾两端移除元素

在上文中,我们讲了怎么去实现一个ArrayDeque,但Java标准库中已经为我们准备好了,我们只需按规则使用就行

add() - 将指定的元素插入ArrayDeque双端队列的 末尾

addFirst() -在ArrayDeque双端队列的 开头 ,插入指定的元素

addLast() - 在ArrayDeque双端队列的 末尾 插入指定的内容(等效于 add() )

注意:如果ArrayDeque双端队列已满,则所有这些方法 add() , addFirst() 和 addLast() 都会引发IllegalStateException

offer() - 将指定的元素插入ArrayDeque双端队列的 末尾

offerFirst() - 在ArrayDeque双端队列的 开始处 插入指定的元素

offerLast() - 将指定的元素插入ArrayDeque双端队列的 末尾

注意: offer(),offerFirst()并offerLast()返回true是否成功插入元素;否则,返回。如果ArrayDeque双端队列已满,则这些方法返回false。

getFirst() - 返回ArrayDeque双端队列的 第一个元素

getLast() - 返回ArrayDeque双端队列的 最后一个元素

注:如果ArrayDeque双端队列为空,getFirst()和getLast()抛出NoSuchElementException。

peek() - 返回ArrayDeque双端队列的 第一个 元素

peekFirst() - 返回ArrayDeque双端队列的 第一个 元素(等效于 peek() )

peekLast() - 返回ArrayDeque双端队列的 最后一个 元素

注:如果ArrayDeque双端队列为空,peek(),peekFirst()和getLast()抛出 NoSuchElementException

remove() - 返回并从ArrayDeque双端队列的 第一个 元素中删除一个元素

remove(element) - 返回并从ArrayDeque双端队列的 头部 删除指定的元素

removeFirst() - 返回并从ArrayDeque双端队列中删除 第一个 元素(等效于remove())

removeLast() - 返回并从ArrayDeque双端队列中删除 最后一个元素

注意:如果数组双端队列为空,则remove(),removeFirst()和removeLast()方法将引发异常。 另外,如果找不到元素,则remove(element)会引发异常。

poll() - 返回并删除ArrayDeque双端队列的 第一个 元素

pollFirst() - 返回并删除ArrayDeque双端队列的 第一个 元素(等效于poll())

pollLast() - 返回并删除ArrayDeque双端队列的 最后一个 元素

注意:如果ArrayDeque双端队列为空,则如果找不到该元素,则poll(),pollFirst()和pollLast()返回null。

删除所有元素

iterator() - 返回可用于遍历ArrayDeque双端队列的 迭代器

descendingIterator() -返回一个迭代器,该迭代器可用于以 相反顺序 遍历ArrayDeque双端队列

注:为了使用这些方法,我们必须导入java.util.Iterator包。

使用迭代器的方法如下

element() -从ArrayDeque双端队列的头部返回一个元素。

contains(element) -在ArrayDeque双端队列中搜索指定的元素。如果找到该元素,则返回true,否则返回false。

size() -返回ArrayDeque双端队列的长度。

toArray() -将ArrayDeque双端队列转换为数组并返回。

clone() -创建ArrayDeque双端队列的副本并返回它。

push() - 在堆栈顶部添加一个元素

peek() - 从堆栈顶部返回一个元素

pop() - 返回并从堆栈顶部删除元素

Minecraft国际版] 我的世界PC端服务器端总览介绍(3)

不知道还有多少服务端,只能说那些开花者太能干了

LavaBukkit是适用于1.12.2的Forge模组和Spigot模组的minecraft服务器实现,剩下的一堆优化。

原始阶段不建议使用。

与上文一模一样……除了是稳定版本。

群组服,比BongeeCord更好一点。随时保持更新。

Minecraft服务器历史上的一座里程碑。

优点:支持手机/Java双端共同游戏!!!在手机上享受Java服务端插件带来的乐趣。

缺点:并没有稳定版本。

最老的群组服。保持更新。

群组服,顾名思义就是链接多个服务器于一体,实现大型服务器。例如Hypixel,Mineplex,CubeCraft等国际知名服务器均使用群组服来运行整体(不一定用的Boungeecord)。子服使用任何服务端都可以,但需要端与端相互兼容,要不然穿梭的时候报错进不去。

二次元的服务端,据悉知好像是国人开花。版本为1.12.2,5个月没更新。

仅支持Craftbukkit/spigot/paperspigot插件

优点:多线程!服务器性能最大化!

缺点:没找到。

类似于GlowStone的开源服务端,支持1.12.2-1.14。

优点:多线程

缺点:不支持bukkit,sponge的api,开花状态

Cuberite是与Minecraft兼容的免费和开源(FOSS)游戏服务器。Cuberite在设计时充分考虑了性能,可配置性和可扩展性,并且还旨在准确地重现大多数原始功能。Cuberite用C ++编写,并且有一个广泛的插件系统,允许用户使用Lua编写自己的插件。实际上,许多内置命令都是由Core插件实现的,Core插件拥有自己的GitHub存储库和开发者社区。有关插件系统,如何使用以及如何开发的更多信息,请参见Plugins.(官网介绍,谷歌翻译制成)此服务端貌似可以在Android上运行。

全篇终,已故服务端不再介绍,没点用处。

Twitter:@HatsuyumeKagura

Google:Kagurahatsuyume@gmail.com

Web Site:

关于双端java和双端面研磨机的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。