我已经了解到,java 对象头包含诸如哈希码、gc年、、偏置锁等信息。然后,一个谜题出现在我的脑海中,并明确地表达了我的问题。我举一个例子。
以下是代码:
public class Demo{
@Override
public int hashCode(){
System.out.println("the hashCode method was called");
return super.hashCode();
}
public static void main(String[] args){
考虑下面的测试用例,在equals中使用hashCode方法作为一种方便的快捷方式是不是一种糟糕的做法?
public class Test
{
public static void main(String[] args){
Test t1 = new Test(1, 2.0, 3, new Integer(4));
Test t2 = new Test(1, 2.0, 3, new Integer(4));
System.out.println(t1.hashCode() + "\r\n"+t2.hashCod
我读过JVM实例中的哈希代码返回相同的值。但是在另一个JVM实例中,可能不会返回相同的值。我尝试了以下程序:
public class demo {
public static void main(String[] args) {
String s = new String("Hello");
System.out.println(s.hashCode());
}
}
这个程序返回的值与在我的机器上重新运行它的次数相同。而且,我试着在其他机器上运行相同的程序,无论在哪里我都能得到相同的值。这只是巧合吗?
我有一个场景,基于一个字符串值,我将决定接下来要遵循
我可以使用hashCode()的实现来实现我的equals()吗?或者这是一种糟糕的做法?
例如,
public int hashCode()
{
// some computation based on the internal states
}
public equals(Object o)
{
return o instanceof ThisClass ? hashCode() == o.hashCode() : false;
}
可能重复:
我发现在hashCode()的根类Object方法中没有实现:
public native int hashCode();
如果我有一个Object a和一个Object b,我如何才能不使用System.out.println()就知道a.hashCode()和b.hashCode()值?只是通过hashCode实现。
我已经尝试过new两个ArrayList对象,而令我非常惊讶的是,hashCode()值是相同的:它们都是1。
根据我对ArrayList的理解,默认容量是10,当它超过10时,它将创建一个具有新容量的新对象,依此类推。
所以出于好奇,我输入了以下程序来检查ArrayList对象的hashcode():
public class TestCoreJava {
public static void main(String [] args){
ArrayList al = new ArrayList();
for(int i=0;i<15;i++){
al.add("Temp"+i);
Sy
在编写了下面的代码之后,我想知道为什么克隆()不为每个额外的实例返回相同的哈希码。我做错了什么吗?
public class Accessor implements Cloneable {
public static void main(String[] args) {
Accessor one = new Accessor();
Accessor two = one.clone();
System.out.println("one hahcod " + one.hashCode()
+"\ntwo hashcode
我理解hashCode的概念以及为什么需要它。但是,对于如何计算泛型对象的hashCode,我感到困惑。这是我的问题。如果我有一个字符串,我可能会使用以下函数来计算hashCode,
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
但如果我有以下目标,
class Node<K, V> {
private K key;
private V value;
private Node<K, V> next
我发现自己想要重写对象的hashcode和==,我想知道是否有最佳实践来实现依赖于多个属性的hashcode,而且似乎有一些特定于Dart的考虑。
最简单的答案是将所有属性的散列合并在一起,这可能还不算太糟。还有一个在上运行的Dart示例
// Override hashCode using strategy from Effective Java, Chapter 11.
int get hashCode {
int result = 17;
result = 37 * result + firstName.hashCode;
result = 37 * result
我希望使用set删除重复对象,UserEntity如下所示:
public class UserEntity {
String name;
int age;
@Override
public String toString() {
return "UserEntity [name=" + name + ", age=" + age + "]";
}
public UserEntity(String name, int age) {
super();
t
我有一个大约450个字段的POJO,我正在尝试使用hascode比较这个POJO的实例。我已经用eclipse生成了被覆盖的hashCode()方法。在相当多的情况下,生成的哈希码跨越整数边界。因此,执行比较变得越来越困难。解决方法是什么?
hashCode()方法如下:
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((stringOne == null) ? 0 : stringOne.hashCode());
result =
class Employee {
String name;
Employee(String name) {
this.name = name;
}
// hashCode method is not overridden
}
public class HashCodeConfusion {
public static void main(String[] args) {
Employee emp = new Employee("ABC");
Employee emp1 = new Employee("ABC");
我在一个final类中有一个肯定要初始化的字段。当我序列化和反序列化相应的对象图时,我会得到一个NPE,因为这个字段在hashCode()方法中使用,但显然还没有被读取。我创建了一个最小的测试用例,其中也包含了serialize()/deserialize()方法(如果这些方法是错误的话),但我似乎无法理解(底层)问题是什么或如何解决它。
public class TestSerializerTest {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestSerialize
在我看来,对象的hashCode()可能与C++中的对象地址相同,因此我期望对象的hashCode在插入数据之前和之后保持不变。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Created by charlie on 2015/12/11.
*/
public class Hello {
public static void main(String[] args) {
List<Integer> a = new ArrayList&
每次在serialization之前和对象的deserialization之后都得到相同的readResolve(),而没有在Java中使用readResolve()方法。这是我的班
public class SerializedSingletonClass implements Serializable{
private static final long serialVersionUID = 18989987986l;
private SerializedSingletonClass(){};
我有Map<Date, String。我有两个日期对象a, b是相等的。我将一个字符串值放到与键a相关联的映射中。然后,我尝试获取与键a和b相关联的映射值,但只有a返回我放置的值。可以用b键得到我的值吗?我知道当键是简单的字符串时,这是可能的。为什么这不适用于其他类型的对象?
public class Main {
public static void main(String[] args) {
Map<Date, String> map = new HashMap<Date, String>();
Date a = new Date(2013
在java中,我正在尝试一些关于对象相等的代码。就像我在某个地方读到的
hashCode()是通过应用哈希函数生成的一个数字。散列函数对于每个对象可以不同,但也可以是相同的。在对象级别,它返回对象的内存地址。
现在,我有了示例程序,我连续运行了10次。每次运行该程序时,我都会得到与哈希代码相同的值。
如果hashCode()函数返回对象的内存位置,为什么java(JVM)在连续运行时将对象存储在相同的内存地址上?
你能给我一些见解和你对这个问题的看法吗?
我正在运行的测试此行为的程序如下所示:
public class EqualityIndex {
private int in
我有一个名为Subscriber的域类,它的定义如下:
public class Subscriber {
private long id;
private String email;
private String subscriberName;
private Topic subscribingTopic;
//other attributes and getters setters.
}
public class Topic{
private long id;
private String topicName; //unique
}
我的问题是
我对使用异步方法的spring bean中的不同行为感到非常困惑。我有一个带有@Async方法的Demo Bean,它只打印this.hashCode()。和一个由Demo注入的主类。Demo bean的作用域是单例的。但实际上,在主类中,demo.hashcode()并不等于Demo类的方法test()中的this.hashCode()。为什么?它们不是同一个实例吗?
@Component
public class Demo {
@Async
public void test(){
System.out.println(this.hashCode());
我试图使用HashSet,同时使用我自己的类"Inner“作为键类型,如下所示:
import java.util.HashSet;
class Inner {
int i;
String s;
public Inner(int i, String s) {
this.i = i;
this.s = s;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public bo