「双端java」双端面研磨机
今天给各位分享双端java的知识,其中也会对双端面研磨机进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、用JAVA语言,编写一个链表类(双向链表),实现插入,删除,查找操作。新手,要俗易懂些,最好自己调适通过。急
- 2、java中push()和pull()是哪个类的方法,有什么作用?
- 3、Java:双端队列插入节点,关于队列为空时插入节点的疑问
- 4、java集合LinkedList()中offFirst()方法跟addFirst()方法有区别?
- 5、ArrayDeque
- 6、Minecraft国际版] 我的世界PC端服务器端总览介绍(3)
用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和双端面研磨机的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。