相关疑难解决方法(0)

什么是java对象头文件

你能给我一些关于对象标题中存储内容的信息吗?我知道,它可能依赖于JVM,但至少可能对HotSpot有用吗?我正在寻找第一行的具体描述.

我已经阅读了一些我无法用我发现的信息验证的信息.也许你有一个指向OpenJDK维基的链接?

java jvm java-memory-model object-layout jol

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

什么是Java中的"内部地址"?

在Javadoc for Object.hashCode()中声明

尽管合理实用,但是由class定义的hashCode方法Object确实为不同的对象返回了不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术.)

这是一个常见的miconception,这与内存地址有关,但它并没有因为它可以在没有通知的情况下改变,而hashCode()不会,也不能改变对象.

@Neet提供了一个很好的答案的链接/sf/answers/39579151/但我正在寻找更多细节.


这是一个例子来说明我的担忧

Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);

for (int t = 0; t < 10; t++) {
    System.gc();
    Object[] objects = new Object[10];
    for (int i = 0; i < objects.length; i++)
        objects[i] = new Object();

    for (int i = 0; i < objects.length; i++) {
        if (i > 0) System.out.print(", ");
        int location = unsafe.getInt(objects, Unsafe.ARRAY_OBJECT_BASE_OFFSET + Unsafe.ARRAY_OBJECT_INDEX_SCALE * i);
        System.out.printf("%08x: hc= …
Run Code Online (Sandbox Code Playgroud)

java memory unsafe hashcode low-level

23
推荐指数
2
解决办法
2355
查看次数

Java中打印char和int数组之间的区别

当我运行以下代码时,我得到了数组的地址:

int arr[] = {2,5,3};
System.out.println(arr); // [I@3fe993
Run Code Online (Sandbox Code Playgroud)

但是当我声明一个字符数组并以相同的方式打印它时,它给了我数组的实际内容.为什么?

char ch[] = {'a','b','c'};
System.out.println(ch); // abc
Run Code Online (Sandbox Code Playgroud)

java arrays

12
推荐指数
1
解决办法
802
查看次数

为什么默认的Object.toString()返回hashCode的十六进制表示?

我很好奇为什么要Object.toString()回报这个:

return getClass().getName() + "@" + Integer.toHexString(hashCode());
Run Code Online (Sandbox Code Playgroud)

与此相反:

return getClass().getName() + "@" + hashCode();
Run Code Online (Sandbox Code Playgroud)

将哈希码显示为十六进制而不是十进制有什么好处?

java hash tostring hashcode

10
推荐指数
2
解决办法
7522
查看次数

哈希码编号是否代表内存地址?

我了解到hashcode是一个唯一标识引用号,它是一个十六进制数.
我的疑问是,参考编号是否代表对象的内存地址?

例如:

Employeee e1=new Employee();
System.out.println(e1.hashcode());
Run Code Online (Sandbox Code Playgroud)

这段代码会返回我对象的内存地址吗?

java

7
推荐指数
1
解决办法
8038
查看次数

hashCode()是如何用Java实现的

hashCode()是如何实现的?

我的假设是它使用对象内存位置作为运行哈希函数的初始数(种子).然而,这种情况并非如此.

我也看过Hash:它在内部如何运作?但它没有回答我的问题.

是的我可以下载SDK,但在我这样做并查看代码之前,也许其他人已经了解它.

谢谢 :)

编辑: 我知道它应该被覆盖等等,所以请尽量保持主题:)

java hash

6
推荐指数
2
解决办法
3846
查看次数

hashcode的默认实现为以相同方式构造的对象返回不同的值

我在这里写一个示例代码:

public class Test {

    private int i;
    private int j;

    public Test() {
        // TODO Auto-generated constructor stub
    }

    public Test(int i, int j)
    {
        this.i=i;
        this.j=j;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在创建两个对象:

Test t1= new Test(4,5);
Test t2 = new Test(4,5);
Run Code Online (Sandbox Code Playgroud)

但是当我打印t1.hashcode()和t2.hashcode()时,它们会给出不同的值.但是根据java的一般联系,他们应该返回相同的值.事实上,当我使用String或Integer做同样的事情时,他们返回相同的hashcode().任何人都可以解释为什么哈希码对于t1和t2对象是不同的?

java

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

哈希映射键不是随机的

似乎Java的HashMap实现总是将键放在相同的bin中(至少我用Integer键看到了).即散列是确定性的,并且在所有运行中它产生相同的值.
我听说有些语言将插入随机化,以便出于安全原因,密钥将存储在哪个存储桶中是不可预测的.
为什么Java的密钥总是一样的?

java security collections hash hashmap

3
推荐指数
2
解决办法
591
查看次数