什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
严格的相等运算符将告诉您两个对象类型是否相等.但是,有没有办法判断两个对象是否相等,就像 Java中的哈希码值一样?
Stack Overflow问题JavaScript中是否有任何类型的hashCode函数?类似于这个问题,但需要更多的学术答案.上面的场景说明了为什么需要有一个,我想知道是否有任何等效的解决方案.
我在Silverlight应用程序中有一个比较2个字符串的条件,由于某种原因,当我使用==它时返回false而.Equals()返回true.
这是代码:
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content.Equals("Energy Attack"))
{
// Execute code
}
if (((ListBoxItem)lstBaseMenu.SelectedItem).Content == "Energy Attack")
{
// Execute code
}
Run Code Online (Sandbox Code Playgroud)
任何理由为什么会这样?
我一直在使用JPA(实现Hibernate)一段时间,每次我需要创建实体时,我发现自己正在努力解决AccessType,immutable属性,equals/hashCode等问题.
因此,我决定尝试找出每个问题的一般最佳实践,并将其写下来供个人使用.
但是我不介意任何人对此发表评论或告诉我哪里错了.
实现Serializable
原因:规范说你必须这样做,但是有些JPA提供商并没有强制执行.Hibernate作为JPA提供程序并不强制执行此操作,但如果未实现Serializable,它可能会因为ClassCastException而陷入困境.
创建一个包含实体所有必填字段的构造函数
原因:构造函数应始终将创建的实例保持在合理的状态.
除了这个构造函数:有一个包私有默认构造函数
原因:默认构造函数需要让Hibernate初始化实体; 允许private,但是在没有字节码检测的情况下,运行时代理生成和高效数据检索需要包私有(或公共)可见性.
一般情况下使用字段访问,需要时使用属性访问
原因:这可能是最有争议的问题,因为对于其中一个(属性访问与字段访问)没有明确和令人信服的论据; 然而,由于更清晰的代码,更好的封装以及不需要为不可变字段创建setter,因此字段访问似乎是最受欢迎的
省略不可变字段的setter(访问类型字段不需要)
@Entity
@Table(name = "ROOM")
public class Room implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "room_id")
private Integer id;
@Column(name = "number")
private String number; //immutable
@Column(name = "capacity")
private Integer capacity;
@ManyToOne(fetch = FetchType.LAZY, optional = …Run Code Online (Sandbox Code Playgroud) 我最近被介绍到一个大型代码库,并注意到所有的字符串比较都使用String.Equals()而不是==
你觉得这是什么原因?
可能重复:
不同的字符串比较方法有什么区别
以下哪两个更有效?(或者可能还有第三种选择更好吗?)
string val = "AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))
Run Code Online (Sandbox Code Playgroud)
要么
if (val.ToLowerCase() == "astringvalue")
Run Code Online (Sandbox Code Playgroud)
?
为什么不Set提供一个操作来获得一个等于另一个元素的元素?
Set<Foo> set = ...;
...
Foo foo = new Foo(1, 2, 3);
Foo bar = set.get(foo); // get the Foo element from the Set that equals foo
Run Code Online (Sandbox Code Playgroud)
我可以问一下是否Set包含一个等于的元素bar,为什么我不能得到那个元素?:(
为了澄清,该equals方法被覆盖,但它只检查其中一个字段,而不是所有字段.因此,两个Foo被认为相等的对象实际上可以具有不同的值,这就是我不能使用的原因foo.
我们如何决定hashCode()集合方法的最佳实现(假设equals方法已被正确覆盖)?
使用SQL时,=在WHERE子句中使用而不是LIKE?
没有任何特殊的操作员,LIKE并且=是一样的,对吧?
equals ×10
java ×5
hashcode ×4
c# ×3
string ×2
.net ×1
collections ×1
comparison ×1
hash ×1
hibernate ×1
javascript ×1
jpa ×1
object ×1
overriding ×1
performance ×1
set ×1
sql ×1
sql-like ×1