虽然我非常了解HashCode是什么以及哈希表的作用,但我不得不承认我不知道如何使用它(超越常用词典).我想实现自己的哈希表,所以首先我想知道关于哈希的基本知识:
getHashCode()/ 获取哈希码hashCode().这个数字是如何确定的.(只是出于好奇)HashCode某个对象,我该如何访问它?也就是说,我该如何调用该内存桶?HashCode吗?现在,我有一个非常大的(大约10 ^ 9)Int列表.我将访问其中一些(从无到有),我需要尽可能以最快的方式完成.哈希表是最好的方法吗?
PS:我不想讨论它,我只是想知道HashTable是否被认为是最有效的.如果存在其他好的方法,也许你可以指点我.
谢谢,
我需要一个基于密钥的Someclass值.键可以是字符串,布尔值或其他对象,这就是我使用Object作为键的原因.但是当对象是一个字符串时,我有一个问题.我有两个对象的字符串,它是等于,但它应该返回不同的值,因为它是一个不同的对象.
我的代码:
Object k = new String("action");
Object l = new String("action");
Hashtable<Object,SomeClass> map = new Hashtable<Object, SomeClass>();
map.put(k,anObject1);
map.put(l,anObject2);
map.remove(k); // it is removing both with k and l.
Run Code Online (Sandbox Code Playgroud)
当我检查两个对象的hashCode()时,它返回相同的值,这最终不是我想要的.
这有什么解决方案吗?我是否需要创建一个覆盖对象的Equals()的新类?但是,仍然是hashCode.:(问题是我需要一个hashCode,为不同的Object返回不同的值.
编辑:我这样做是因为我需要根据字符串的内容执行不同的操作,但操作将因map与键返回的值而不同.
更新:好的,这就是为什么我需要这个奇怪的事情.
我有一个玩家实例和3个陆地实例.所以我希望玩家能够耕种land1,land2,land3.如果玩家想要耕种土地,那个土地会形成一个正在运行的线程,告诉玩家移动到位置X,完成工作action,并wait()通过对象action,当另一个线程按照notify对象线程时action,土地然后自行修改.然后玩家根据对象制作动画action.我正在ArrayList<Position> destination和'ArrayList action`拥有它.也许你可以在这里阅读我的其他问题.
所以我想让动作取消.我通过传递action对象来实现它.我有一个按钮,显示每个动作,每个按钮将取消该动作.我也经过action这里.因此,当我点击按钮时,土地将获得notify.问题是我无法通过ArrayList<Position>删除目的地Action,因为它不知道索引在哪里.我是Java的新手,但是我一直在使用C++,所以我考虑使用Hashtables,因为它的O(1)与C++ O(log n)不同,并且因为我当前代码没有太多变化,所以很方便.
这可以理解吗?
我的User对象如下所示:
User.java:
public class User {
public String firstName;
public String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public int hashCode() {
return (this.firstName.hashCode() + this.lastName.hashCode());
}
@Override
public boolean equals(Object obj) {
if(obj instanceof User) {
User temp = (User) obj;
if(this.firstName.equals(temp.firstName) && this.lastName.equals(temp.lastName)) {
return true;
}
}
return false;
} …Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的查找,总是以某种方式失败.进一步调查,我发现了一些我无法解释的事情:似乎虽然我的字符串是相同的,但它们并没有得到相同的哈希码.
fr.unice.i3s.modalis.jSeduite.technical.restaurant.CourseFinder Hex: 66722E756E6963652E6933732E6D6F64616C69732E6A536564756974652E746563686E6963616C2E72657374617572616E742E436F7572736546696E646572 Hash code: 1515256474
fr.unice.i3s.modalis.jseduite.technical.restaurant.CourseFinder Hex: 66722E756E6963652E6933732E6D6F64616C69732E6A736564756974652E746563686E6963616C2E72657374617572616E742E436F7572736546696E646572 Hash Code: 2099127532
Run Code Online (Sandbox Code Playgroud)
使用Java 6重复实验,我遇到了类似的问题.请注意,无论哪种方式,事情都不是常数:
fr.unice.i3s.modalis.jSeduite.technical.restaurant.CourseFinder Hex: 66722E756E6963652E6933732E6D6F64616C69732E6A536564756974652E746563686E6963616C2E72657374617572616E742E436F7572736546696E646572 Hash code: 1515256474
fr.unice.i3s.modalis.jseduite.technical.restaurant.CourseFinder Hex: 66722E756E6963652E6933732E6D6F64616C69732E6A736564756974652E746563686E6963616C2E72657374617572616E742E436F7572736546696E646572 Hash Code: - 1772912571
Run Code Online (Sandbox Code Playgroud)
我的代码依赖于这个匹配,我不想运行.equals(),因为它可能太慢了.
根据我的理解,对于相同的字符串,哈希码应该是相同的.这是JVM中的错误吗?是否涉及一些神奇的Scala干扰?
环境:
我是一个java家伙..学习c ++.我正在尝试使用c ++中的map std::map.不知何故,我还需要覆盖其哈希码和equals方法.我可以在c ++ 11中使用unordered_map但是如何在旧版本中执行此操作.我知道std::map,第三个参数是operator<但不是哈希码(如in unordered_map).我也知道std::map(有序地图)实际上是一个TreeMap(红黑树).但我怎么做,我想做,使用这个数据结构或旧的c ++版本中的其他一些.
我有一个带掩码的错误代码的枚举,带有字符串表示和二进制int表示:
type ErrorCodes =
| NoError = 0
| InvalidInputError = 1
| AuthenticationFailedError = 2
| InvalidArgumentError = 4
| ItemNotFoundError = 8
| UnknownError = 16
Run Code Online (Sandbox Code Playgroud)
当我浏览程序时,我使用按位OR运算符(|||)收集所有错误.所以现在我有一些看起来像01100的东西.如何打印到控制台:"InvalidArgumentError"和"ItemNotFoundError?"
我只想使用:
for i = 0 to 32 do
if ((err.GetHashCode() % 2) = 1) then
Console.WriteLine("ErrorCode: {0}",err.GetHashCode())
Run Code Online (Sandbox Code Playgroud)
但现在我仍然坚持如何打印实际的字符串
我正在尝试创建一个函数,该函数使用类型为BasicAsteroid的(x,y,velocity x,velocity y)值生成随机小行星,这是创建随机小行星的构造函数和函数:
private double x, y;
private double vx, vy;
public BasicAsteroid(double x, double y, double vx, double vy) {
this.x = x;
this.x = y;
this.vx = vx;
this.vy = vy;
}
public static BasicAsteroid makeRandomAsteroid() {
Random rand = new Random();
BasicAsteroid x = new BasicAsteroid((rand.nextInt()%FRAME_WIDTH), (rand.nextInt()%FRAME_HEIGHT), (rand.nextInt()%MAX_SPEED), (rand.nextInt()%MAX_SPEED));
System.out.println(x);
return x;
}
Run Code Online (Sandbox Code Playgroud)
然而,这是我创建小行星时的输出:
game1.BasicAsteroid@6773120a
game1.BasicAsteroid@4261b6b3
game1.BasicAsteroid@2673b915
game1.BasicAsteroid@113eb90b
game1.BasicAsteroid@1abcc522
如何输出值而不是类@saskcode?
谢谢.
我有一个Triple类,它是一个可以包含3个整数(x,y,z)的类.我想覆盖equals/hashcode方法,以便它们可以在一个集合中使用.所以带(1,2,3)的obj应该等于(3,2,1)或(3,1,2),所以应该等于它的任何排列.我知道如何使用(x,y)对Pair类执行此操作 - 我对此的对类的代码是:
class Pair {
int x;
int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Pair) {
Pair p = (Pair) obj;
if (this.x == p.x && p.y == this.y || this.x == p.y && this.y == p.x) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return Integer.hashCode(x) * Integer.hashCode(y);
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果我想将它扩展为Triple类,我知道我可以编辑equals方法并添加更多条件来检查,但这似乎很长.如果不在Java中使用外部库,我有什么方法可以做到这一点?
我正在努力深入理解Java,我正在尝试比较相同的对象.
我创建了两个具有相同值的字符串对象,但分配给了不同的变量.事实证明它们具有相同的哈希码.
之后,我创建了表示person的简单类,并使用传递给构造函数的相同参数创建了此类的两个实例.原来他们有不同的哈希码.
现在我很困惑它是如何工作的.你能解释一下吗?
我的代码:
public static class Person {
public String name;
public String lastName;
public Person(String name, String lastName) {
this.name = name;
this.lastName = lastName;
}
}
public static void main(String[] args) {
String s1 = new String("foo");
String s2 = new String("foo");
System.out.println("String1 hashcode: " + s1.hashCode());
System.out.println("String2 hashcode: " + s2.hashCode());
System.out.println("Is String1 equal to String2?: " + s1.equals(s2));
Person p1 = new Person("John", "Doe");
Person p2 = new Person("John", "Doe");
System.out.println("Person1 hashcode: " + …Run Code Online (Sandbox Code Playgroud) 对于Hash数据结构,例如HashSet,HashMap等,我们需要实现哈希码。但是,这不是很方便。我们可以改用Hashable或Hasher吗?
这是Swift中的示例:https : //developer.apple.com/documentation/swift/hashable