在Java中,在没有初始化的情况下声明类级实例变量会花费内存吗?
例如:int i;如果我没有初始化它,是否使用任何内存i = 5;?
细节:
我有一个巨大的超级类,许多不同的(没有足够的不同,有自己的超类)子类扩展.一些子类不使用超类声明的每个单元.我可以简单地将这些原语保留为未初始化,并仅在必要的子类中初始化它们以节省内存吗?
在C++中,为什么bool需要一个字节来存储true或false,其中只有一个位足够,例如0表示false,1表示true表示?(为什么Java也需要一个字节?)
其次,使用以下内容会更安全多少?
struct Bool {
bool trueOrFalse : 1;
};
Run Code Online (Sandbox Code Playgroud)
第三,即使它是安全的,上述现场技术真的会有所帮助吗?因为我听说我们在那里节省空间,但是编译器生成的代码访问它们比访问基元所生成的代码更大更慢.
我正在尝试确定对象上字段的类型.当它传递给我时,我不知道对象的类型,但我需要找到longs的字段.很容易区分盒装,Long但原始图像long似乎更难.
我可以确保传递给我的对象只有Longs,而不是原语,但我宁愿不.所以我拥有的是:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class)) {
// found one -- I don't get here for primitive longs
}
}
Run Code Online (Sandbox Code Playgroud)
一种似乎有用的hacky方式是:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class) || clazz.getName().equals("long")) {
// found one
}
}
Run Code Online (Sandbox Code Playgroud)
如果有的话,我真的想要一个更干净的方法.如果没有更好的方法,那么我认为要求我收到的对象只使用Long(不是long)将是一个更好的API.
有任何想法吗?
我有一个byte[4096]并且想知道检查所有值是否为零的最快方法是什么?
有没有比做更快的方法:
byte[] b = new byte[4096];
b[4095] = 1;
for(int i=0;i<b.length;i++)
if(b[i] != 0)
return false; // Not Empty
Run Code Online (Sandbox Code Playgroud) 在Kotlin语言中,默认情况下,我们必须在引入每个变量时对其进行初始化.为避免这种情况,lateinit可以使用关键字.lateinit在初始化之前引用变量会导致运行时异常.
lateinit但是,不能与原始类型一起使用.为什么会这样?
我需要在objective-c中使用一系列布尔值.我已经完成了它的设置,但编译器会在以下语句中发出警告:
[updated_users replaceObjectAtIndex:index withObject:YES];
Run Code Online (Sandbox Code Playgroud)
这是,我敢肯定,因为YES根本不是一个对象; 这是一个原始的.无论如何,我需要这样做,并非常感谢如何实现它的建议.
谢谢.
在我的一个Java项目中,由于Java处理(而非)原语的方式,我受到代码重复的困扰.具有相同的变化手工复制到四个不同的位置(之后int,long,float,double)再次,对于第三次的时候,再和再次我来到非常接近(?)来抢购.
在各种形式中,这个问题已经在StackOverflow上提出了:
共识似乎趋向于两种可能的替代方案:
好吧,第二个解决方案就是我现在正在做的事情,它对我的理智慢慢变得危险,就像众所周知的折磨技术一样.
自从提出这些问题并且Java 7出现以来已过去两年了.因此,我希望有一个更简单和/或更标准的解决方案.
Java 7是否有任何可能在这种情况下缓解压力的变化?我在简明的变更摘要中找不到任何内容,但也许在某处有一些不起眼的新功能?
虽然源代码生成是另一种选择,但我更喜欢使用标准JDK功能集支持的解决方案.当然,使用cpp或其他代码生成器可以工作,但它添加了更多的依赖项,并需要更改构建系统.
似乎JDK支持的唯一代码生成系统是通过注释机制.我设想一个可以像这样扩展源代码的处理器:
@Primitives({ "int", "long", "float", "double" })
@PrimitiveVariable
int max(@PrimitiveVariable int a, @PrimitiveVariable int b) {
return (a > b)?a:b;
}
Run Code Online (Sandbox Code Playgroud)
理想的输出文件将包含此方法的四个请求变体,最好使用相关的Javadoc注释等.是否有某处注释处理器来处理这种情况?如果没有,构建一个会怎样?
也许最近出现了一些其他技巧?
编辑:
一个重要的注意事项:除非我有理由,否则我不会使用原始类型.即使是现在,在某些应用程序中使用盒装类型也会产生非常真实的性能和内存影响.
编辑2:
使用max()作为示例允许使用compareTo()所有数字盒装类型中可用的方法.这有点棘手:
int sum(int a, int b) {
return a …Run Code Online (Sandbox Code Playgroud) 如果方法有局部变量i:
int i = 10;
Run Code Online (Sandbox Code Playgroud)
然后我分配一个新值:
i = 11;
Run Code Online (Sandbox Code Playgroud)
这会分配一个新的内存位置吗?或者只是替换原始值?
这是否意味着原语是不可变的?
当我尝试声明一个字典时:
private Dictionary<String, int> map;
Run Code Online (Sandbox Code Playgroud)
编译器给我以下错误:
令牌"int"上的语法错误,此令牌后预期的维度
但它可以正常使用Integer.我隐约知道Java对待int/ Integer不同(我来自.NET背景),但我希望有人可以给我一个完整的解释,为什么我不能在字典中使用原语<>
Java中的原始数据类型是int&shortthread-safe吗?我已执行以下代码,有时无法看到预期的结果500.
public class SampleThree extends Thread
{
static long wakeUpTime = System.currentTimeMillis() + (1000*20);
static int inT;
public static void main(String args[])
{
System.out.println("initial:" + inT);
for(int i=0; i<500; i++)
new SampleThree().start();
try {
Thread.sleep(wakeUpTime - System.currentTimeMillis() + (1000*30));
System.out.println("o/p:" + inT);
}
catch(Exception e){
e.printStackTrace();
}
}
public void run()
{
try {
long s = wakeUpTime - System.currentTimeMillis();
System.out.println("will sleep ms: " + s);
Thread.sleep(s);
inT++; // System.out.println(inT);
}
catch(Exception e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud) primitive ×10
java ×8
arrays ×2
boolean ×2
performance ×2
c ×1
c++ ×1
dictionary ×1
kotlin ×1
objective-c ×1
reflection ×1