我已经用Netbeans开发了一段时间的Java,并且有些事情我只是依赖于工作而没有真正质疑如何.其中包括自动生成的hashCode()和equals()方法.
equals方法很容易遵循,但我发现hashCode方法有些神秘.我不明白为什么它选择乘数并应用它所做的操作.
import java.util.Arrays;
import java.util.Objects;
public class Foo {
int id;
String bar;
byte[] things;
@Override
public int hashCode() {
int hash = 7;
hash = 89 * hash + this.id;
hash = 89 * hash + Objects.hashCode(this.bar);
hash = 89 * hash + Arrays.hashCode(this.things);
return hash;
}
}
Run Code Online (Sandbox Code Playgroud)
搜索文档,这个网站和谷歌搜索"netbeans生成哈希码"之类的内容,似乎没有任何相关内容.有谁在这里熟悉这一代策略是什么以及为什么Netbeans使用它?
编辑:
感谢您的答案到目前为止!特别是由于对链接的SO问题的这个答案,我理解现在更充分地使用素数来设计hashCode方法的逻辑.然而,到目前为止我没有真正解决的问题的另一个方面是Netbeans如何以及为什么选择它为其生成的方法所做的素数.的hash字段,另一个乘法器(89在我的例子)似乎取决于类的各种因素是不同的.
例如,如果我String在类中添加第二个,则hashCode()变为
public int hashCode() {
int hash = 7;
hash = 13 * hash + this.id;
hash = 13 …Run Code Online (Sandbox Code Playgroud) 我有这两个CREATE TABLE陈述:
CREATE TABLE GUEST (
id int(15) not null auto_increment PRIMARY KEY,
GuestName char(25) not null
);
CREATE TABLE PAYMENT (
id int(15) not null auto_increment
Foreign Key(id) references GUEST(id),
BillNr int(15) not null
);
Run Code Online (Sandbox Code Playgroud)
第二个陈述中的问题是什么?它没有创建一个新表.
在Java工作了很多年之后,我第一次在RMI中弄湿了,我正在按照本教程来了解基础知识.下面的服务器代码给出了以下异常,说端口1099已经在使用,但是查看netstat -ano的输出(在Windows上),没有进程正在使用1099.我可以用任何其他未使用的端口替换1099并且它按预期工作,我的客户端程序能够成功连接.
我搜索了一会儿,这是我能找到有同样问题的人最接近的东西,但他似乎找到了netstat的违规过程,我不能.
我正在Netbeans中开发,无论是通过Netbeans运行还是自己执行JAR,我都会遇到同样的异常.我没有像他似乎正在做的那样从命令提示符启动注册表,但这似乎没有必要,因为如果我只是改变端口号,一切都会好的.
我在这里错过了什么?
服务器代码:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class RMIServer {
public static void main(String[] args) throws InterruptedException {
try {
LocateRegistry.createRegistry(1099);
Naming.rebind("//localhost:1099/MyRemote", new MyRemote());
System.out.println("Server ready.");
} catch (Exception ex) {
System.out.println("Server error:");
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
Server error:
java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:328)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:236)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:411)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:207)
at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:122)
at sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:108)
at java.rmi.registry.LocateRegistry.createRegistry(LocateRegistry.java:203)
at …Run Code Online (Sandbox Code Playgroud)