我创建了一个向量集,以避免使用迭代器分配等来破坏GC(对于HashSet的值或键的每次遍历,您为set引用和set迭代器获取new/free)
无论如何,该Object.hashCode()方法应该是每个对象的唯一ID.(对于64位版本会失败吗?)
但无论如何它都是可覆盖的,因此不能保证每个对象实例的唯一性和唯一性.
如果我想创建一个"ObjectSet",我如何获得一个对象的每个实例的保证唯一ID?
我刚刚发现了这个:它回答了它.
假设我有一个没有实现Comparable接口的类
class Dummy {
}
Run Code Online (Sandbox Code Playgroud)
以及该类的一个实例的集合以及该类外部的一些函数,它们允许部分地比较这些实例(下面将使用一个映射):
Collection<Dummy> col = new ArrayList<>();
Map<Dummy, Integer> map = new HashMap<>();
for (int i = 0; i < 12; i++) {
Dummy d = new Dummy();
col.add(d);
map.put(d, i % 4);
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用TreeSet带有自定义比较器的类对此集合进行排序:
TreeSet<Dummy> sorted = new TreeSet<>(new Comparator<Dummy>() {
@Override
public int compare(Dummy o1, Dummy o2) {
return map.get(o1) - map.get(o2);
}
});
sorted.addAll(col);
Run Code Online (Sandbox Code Playgroud)
结果显然不令人满意(包含的元素少于初始集合).这是因为这样的比较器与equals0不相等的元素不一致,即有时返回.我的下一次尝试是compare将比较器的方法改为
@Override
public int compare(Dummy o1, Dummy …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个类似于ArrayList的java数据结构,当我只使用一个值参数进行添加或推送时,将自动为我返回一个索引.
例如:
ArrayList<String> elements = new ArrayList<String>();
String element = "foo";
String elementTwo = "bar";
int index1 = elements.add(element); //note this does not exist, i.e. returns bool in api
int index2 = elements.add(elementTwo);
System.out.println(elements.get(index1)); //would give "foo"
Run Code Online (Sandbox Code Playgroud)
我可以看到围绕ArrayList编写一个包装类来管理一个计数器,该计数器在每次添加操作时都会递增并调用:
ArrayList.add(int index, E element)
Run Code Online (Sandbox Code Playgroud)
你真的需要为ArrayList编写一个包装器吗?这似乎很简单,可以在某个地方开箱即用?
编辑:
我需要为此用例修复和唯一索引(键).提出了一张地图,我同意这一点.有没有人知道一个地图实现,它会在值插入上为您提供自动(唯一)生成的键?我只是想确定是否需要为此实现自己的包装器.
该toString方法的Object独特之处在于它似乎是Java中唯一可以查看内存地址的地方.怎么Object做?
我想知道,以便我可以在我自己的课程中模仿它的实现.我无法使用,super.toString()因为我正在扩展一个toString已经覆盖的类.
更新:我的问题的前提是要求内存地址,但答案表明这个前提是不正确的,所以我实际上问的是:如何Object.toString()返回它的作用,我怎样才能模仿它?
我目前正在为Java 1.7构建一个本机JVMTI代理.问题是我需要索引有关特定Java对象实例的一些数据.所以我的问题是我可以使用jobject类型的值作为对象的实例ID来检索我的索引数据吗?
我已经查找了有关jobject类型的语义的任何信息.它是Object的内存位置的指针吗?它是一个堆栈指针地址吗?它是JVM内部结构的地址吗?所以我无法弄清楚jobject的值是否是Java对象生命中唯一且不可变的.
谢谢你的帮助.
编辑
根据JNI在这里找到的规范,jobject似乎是Object实例的指针.
让我们从代码开始吧.
Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
Run Code Online (Sandbox Code Playgroud)
然后在其他地方再次相同,或者可能在同一段代码中再次执行,可能在不同的线程中.
Future<MyResult> obj = getFuture();
debugLog.println("Handling future: " + System.identityHashCode(obj);
Run Code Online (Sandbox Code Playgroud)
现在上面,如果obj是同一个对象,显然调试打印将是相同的.但如果它们不同,仍然存在哈希冲突的可能性,因此即使对于不同的对象,打印输出也可能相同.因此具有相同的输出(或更一般地,相同的字符串)并不保证相同的对象.
问题:Java中有没有办法为任意对象获取唯一的id 字符串?或者更正式地说,给出static String Id.str(Object o)方法,以便始终如此:
final Object obj1 = ...;
final String firstId = Id.str(obj1);
// arbitrary time passes, garbage collections happen etc.
// firstId and obj1 are same variables as above
(firstId.equals(Id.str.obj2)) == (obj1 == obj2)
Run Code Online (Sandbox Code Playgroud) public class Test {
public static void main(String args[]) {
int i = 10;
Integer a = new Integer(i);
System.out.println(a); //tostring method overriden
System.out.println(a.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
产量:
10
10
现在我的问题是为什么hashCode()在这种情况下覆盖方法.如果我想在上面的代码中找到包装类对象的对象引用.我该怎么做?
能否请您解释为什么在下面的代码String和StringBuffer区别对待,当价值被附加StringBuffer,但不是在字符串。
public class MyClass {
public static void main(String args[]) {
String str = new String("String Rohan ");
StringBuffer strBfr = new StringBuffer("String Buffer Rohan ");
strUpdate(str);
strBfrUpdate(strBfr);
System.out.println(str);
System.out.println(strBfr);
}
private static void strBfrUpdate(StringBuffer strBfr){
strBfr.append("Kushwaha");
}
private static void strUpdate(String str){
str += "Kushwaha";
}
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
串罗汉
字符串缓冲区Rohan Kushwaha
java ×8
collections ×1
comparator ×1
identity ×1
jvmti ×1
memory ×1
object ×1
string ×1
stringbuffer ×1
tostring ×1
treeset ×1