假设我们的最大内存为256M,为什么这段代码有效:
public static void main(String... args) {
for (int i = 0; i < 2; i++)
{
byte[] a1 = new byte[150000000];
}
byte[] a2 = new byte[150000000];
}
Run Code Online (Sandbox Code Playgroud)
但是这个扔了一个OOME?
public static void main(String... args) {
//for (int i = 0; i < 2; i++)
{
byte[] a1 = new byte[150000000];
}
byte[] a2 = new byte[150000000];
}
Run Code Online (Sandbox Code Playgroud) 我最近做了Java课程(1周速成课程),我们介绍了一些二进制数学.
这个一元〜运算符(代字号,我认为它被称为?)向我们解释了:
它将位模式反转,每"0"变为"1",每"1"变为"0".例如,一个字节有8位.如果您有以下字节:00000000,则反转值将更改为11111111.
以上解释清晰简洁,对我来说完全有道理.直到,也就是说,我试图实现它.
鉴于这种:
byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
Run Code Online (Sandbox Code Playgroud)
输出是:
-4
-6
Run Code Online (Sandbox Code Playgroud)
我对这是怎么回事感到很困惑.
如果二进制中的+3是11,那么这个的反转将是00,这显然不是-3.
但由于一个字节中有8位,那么+3的二进制表示不应写为00000011吗?
哪个会反转成11111100.转换回十进制值这将是252.如果你将+3写为011,那么它确实转换为100,即+4,但那么你怎么知道它是负数?
如果你尝试0011,转换为1100,如果你使用第一位作为符号,那么它确实变为-4.
啊 - 所以在这一点上,我以为我到了某个地方.
但后来我得到了y = 5的第二个值.
我们怎么写这个?使用相同的逻辑,+ 5转换为二进制0101,其反转为1010.
而现在,我非常困惑.这看起来代表有符号值-2,或无符号值+10十进制?这些都不是-6我打印出来的.
再次,如果我将长度增加到一个字节的8位数,+ 5是00000101,其反转变为11111010.而且我真的找不到将其转换为-6的方法.
有没有人明白这一点,因为我不知道这里发生了什么,我打印的数字越多,我就越困惑.
谷歌似乎没有提出任何关于这一点 - 也许它不喜欢看小运营商的迹象.. :-(
我们假设我们有以下代码:
List<Future<?>> runningTasks;
ExecutorService executor;
...
void executeTask(Runnable task){
runningTasks.add(executor.submit(task));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
runningTasks持有task对象的引用?