相关疑难解决方法(0)

如何在Java中为每个对象获取唯一ID?

我创建了一个向量集,以避免使用迭代器分配等来破坏GC(对于HashSet的值或键的每次遍历,您为set引用和set迭代器获取new/free)

无论如何,该Object.hashCode()方法应该是每个对象的唯一ID.(对于64位版本会失败吗?)

但无论如何它都是可覆盖的,因此不能保证每个对象实例的唯一性和唯一性.

如果我想创建一个"ObjectSet",我如何获得一个对象的每个实例的保证唯一ID?

我刚刚发现了这个:它回答了它.

如何获取覆盖hashCode()的对象的唯一ID?

java

14
推荐指数
3
解决办法
6万
查看次数

当没有区别字段时,比较器适用于TreeSet

假设我有一个没有实现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)

java comparator treeset

10
推荐指数
1
解决办法
296
查看次数

ArrayList,返回索引,添加值

我正在寻找一个类似于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编写一个包装器吗?这似乎很简单,可以在某个地方开箱即用?

编辑:

我需要为此用例修复和唯一索引(键).提出了一张地图,我同意这一点.有没有人知道一个地图实现,它会在值插入上为您提供自动(唯一)生成的键?我只是想确定是否需要为此实现自己的包装器.

java collections data-structures

9
推荐指数
1
解决办法
6542
查看次数

Object.toString()如何获取"内存地址"以及如何模仿它

toString方法的Object独特之处在于它似乎是Java中唯一可以查看内存地址的地方.怎么Object做?

我想知道,以便我可以在我自己的课程中模仿它的实现.我无法使用,super.toString()因为我正在扩展一个toString已经覆盖的类.

更新:我的问题的前提是要求内存地址,但答案表明这个前提是不正确的,所以我实际上问的是:如何Object.toString()返回它的作用,我怎样才能模仿它?

java memory tostring

9
推荐指数
3
解决办法
2092
查看次数

如何唯一地区分Java的对象实例

我目前正在为Java 1.7构建一个本机JVMTI代理.问题是我需要索引有关特定Java对象实例的一些数据.所以我的问题是我可以使用jobject类型的值作为对象的实例ID来检索我的索引数据吗?

我已经查找了有关jobject类型的语义的任何信息.它是Object的内存位置的指针吗?它是一个堆栈指针地址吗?它是JVM内部结构的地址吗?所以我无法弄清楚jobject的值是否是Java对象生命中唯一且不可变的.

谢谢你的帮助.

编辑

根据JNI在这里找到的规范,jobject似乎是Object实例的指针.

java jvmti

6
推荐指数
1
解决办法
3356
查看次数

在Java中打印唯一对象标识以进行调试

让我们从代码开始吧.

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)

java identity object uniqueidentifier

6
推荐指数
1
解决办法
1万
查看次数

包装类java中的奇怪行为

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()在这种情况下覆盖方法.如果我想在上面的代码中找到包装类对象的对象引用.我该怎么做?

java

4
推荐指数
1
解决办法
107
查看次数

String vs StringBuffer返回值

能否请您解释为什么在下面的代码StringStringBuffer区别对待,当价值被附加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 string stringbuffer

4
推荐指数
1
解决办法
851
查看次数