在玩这个谜题(这是一个Java关键字琐事游戏)时,我遇到了native
关键字.
Java中的native关键字用于什么?
在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如何使用Object API的hashCode()方法生成哈希值?
首先,我想告诉您这个问题与Java中的本机实现无关.我从该线程中获得了许多有用的信息.
我想知道原生实现的代码是否可用?我有JDK的源代码,但我无法找到本机代码System.currentTimeMillis
或Runtime.getRuntime().availableProcessors()
或其他本地方法.
的clone
上方法Object
,它创建的对象的精确副本,被声明为:
protected native Object clone() throws CloneNotSupportedException;
Run Code Online (Sandbox Code Playgroud)
为什么native
?
我需要转换随机生成的salt值并将其存储在数据库中.要将它存储在数据库中,我将其转换为字符串.然后,为了检索原始值,我将其转换回字节.但两个值都不匹配.我试过"UTF-8","UTF-16",BASE64Encoder.
SecureRandom ranGen = new SecureRandom();
byte[] aesKey = new byte[16]; // 16 bytes = 128 bits
ranGen.nextBytes(aesKey);
System.out.println(aesKey);
String a=new String(aesKey,"UTF-16");
byte[] b=new byte[16];
b=a.getBytes("UTF-16");
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)
上述代码的输出(执行2次):
[B@11563ff
[B@1581593
Run Code Online (Sandbox Code Playgroud)
和
[B@170888e
[B@11563ff
Run Code Online (Sandbox Code Playgroud)