但是,在阅读java源代码时,我注意到在integer
和long
类中,size
常量是@native
,而不是Float、Byte、Double、Short和character。
注意,SIZE常量表示用于表示实际值的位数。
public static final int SIZE = 8;//Byte
public static final int SIZE = 16;//Character
public static final int SIZE = 16;//Short
public static final int SIZE = 32;//Float
@Native public static final int SIZE = 32;//Integer
@Native public static final int SIZE = 64;//Long
public static final int SIZE = 64;//Double
编辑:我刚刚注意到,这也适用于相同类的max_value
和min_value
。
static const jint SIZE = 8L;//java/lang/Byte.h
static const jint SIZE = 16L;//java/lang/Character.h
static const jint SIZE = 16L;//java/lang/Short.h
static const jint SIZE = 32L;//java/lang/Float.h
static const jint SIZE = 32L;//java/lang/Integer.h
static const jint SIZE = 64L;//java/lang/Double.h
static const jint SIZE = 64L;//java/lang/Long.h
TLDR:跳到结论
为什么整数和长的大小常数只有@native?
我在邮件列表上搜索了一下。我发现了一些有趣的东西。
/* No native methods here, but the constants are needed in the supporting JNI code */
@GenerateNativeHeader
public final class Long extends Number implements Comparable<Long> {...
因此创建了一个新的注释java.lang.annotation.native
,并在Integer和long中使用。注释被设置为TargetType字段
。
注释应该直接应用于需要导出的常量字段,而不是作为一个整体应用于类。
这些东西的全部目的是:
我在JDK上做了一个基本的实验。我克隆了open-jdk森林并成功构建了它。正如所料,为integer
和long
生成的头文件(感谢@native
)和为float
和double
生成的头文件(感谢它们的本机方法),而不是为byte
、short
...
ls -l build/macosx-x86_64-normal-server-release/support/headers/java.base/java_lang_*
...
java_lang_Double.h
java_lang_Float.h
java_lang_Integer.h
java_lang_Long.h
java_lang_Object.h
java_lang_Package.h
...
然后,我尝试从integer
字段中删除@native
,并尝试重新构建JDK
,但出现错误:
jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c:35:10: fatal error: 'java_lang_Integer.h' file not found
#include "java_lang_Integer.h"
^
1 error generated.
逻辑上,因为头尚未生成。
find . \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Integer.h" {} \; -print
#include "java_lang_Integer.h"
./jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c
#include "java_lang_Integer.h"
./jdk/src/java.base/unix/native/libnio/ch/IOUtil.c
#include "java_lang_Integer.h"
./jdk/src/java.base/windows/native/libnet/TwoStacksPlainSocketImpl.c
#include "java_lang_Integer.h"
./jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c
#include <java_lang_Integer.h>
./jdk/src/java.desktop/windows/native/libawt/windows/awt_Frame.cpp
喜欢长
find . \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Long.h" {} \; -print
#include "java_lang_Long.h"
./jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c
喜欢float
find . \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Float.h" {} \; -print
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/Float.c
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/ObjectInputStream.c
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/ObjectOutputStream.c
喜欢双倍
find . \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Double.h" {} \; -print
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/Double.c
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/ObjectInputStream.c
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/ObjectOutputStream.c
find . \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Short.h" {} \; -print
我有点惊讶地看到为什么在我的机器上,数组的最大大小是整数.MAX_VALUE/7 我知道数组是由整数索引的,所以数组大小不能大于整数.MAX_VALUE。我还阅读了一些堆栈溢出讨论,我发现它在JVM上有所不同,并且JVM使用了一些(5-8咬)。 在这种情况下,最大值也应为。 和 之间的任何值都会给我错误: 这是我可以分配给机器上数组的最大值。具体原因是什么? 更新:我正在运行eclipse中的代码
问题内容: 如何将(大字节序)可变大小的二进制字节数组转换为(无符号)整数/长整数?例如,代表4404 现在,我正在使用 它虽然很小,但有点可读,但可能效率不高。有没有更好(更明显)的方法? 问题答案: 传统上,Python对于“大尾数C布局中的数字”用处不大,而对于C来说则用不了太多。(如果要处理2字节,4字节或8字节的数字,那么答案就是) 但是足够多的人厌倦了没有一种明显的方法可以做到这一点,
问题内容: 但是,如果用前导零检查Integer,则会发现问题是在jdk7发行之前进行的,因此其研究工作量较小。但是在jdk7中,对整数进行了一些更改和添加。以下是有关jdk7的最新答案。 我有一个代码: 编译时出现错误:整数太大:09 为什么这样做呢? 同样,如果我将代码更改为: 现在输出是10 为什么给输出10而不是12? 问题答案: 开头的数字被认为是八 - 9不是一个八进制数字(但(传统)
我有一个h2数据库文件,文件大小已经增长到5GB。我删除了一些数据以缩小文件的大小。但即使从数据库中删除了一半记录,文件大小仍然保持不变。 我已经尝试了以下所有选项来减少数据库大小,但没有一个对我有用。 我的连接字符串如下所示: 注: 我们正在结清我们已经开始的交易 文件中没有5GB的数据 有人能给我建议一些解决方法或修复方法来减少我的数据库大小吗
问题内容: 和pandas和之间的区别是什么? 大小是否仅排除nil? 问题答案: 含值,:
问题内容: 在Java中,hashcode()方法返回整数而不是long。有什么具体原因吗? 问题答案: 那么,一个良好的理由是,基于数据结构(,)使用一个数组来存储箱,并且阵列被限制为索引。 如果必须将其映射到数组索引,那么您将一无所获。