我有一个非常大的Java对象,它在内存中表示带有顶点和边的图形.每个顶点都有一个ArrayList与其连接的其他顶点(并且还有一个HashMap数据结构用于其他目的).图形可以有几千个顶点,还有更多边.
当尝试使用Java的内置序列化(implements Serializable等等)来序列化图形时,我总是遇到一个StackOverflowError.设置图表的其他属性transient没有帮助,也没有将堆栈大小设置得更大(即-Xss1g或-Xss512m).
我不认为我需要创建一个自定义writeObject方法,因为ArrayList它HashMap已经拥有自己的实现,这些实现在序列化时调用.
我的问题是:有没有办法在没有得到的情况下序列化已经在内存中的大型Java对象StackOverflowError?
编辑:这是堆栈跟踪:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.reflect.Method.invoke(Method.java:575)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:950)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1482)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1535)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:329)
at java.util.ArrayList.writeObject(ArrayList.java:570)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:950)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1482)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1535)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at …Run Code Online (Sandbox Code Playgroud) 标题说的是什么.对于C++,(++a)++编译.但奇怪的是,++(a++)不是:
int main() {
int a = 0;
++a++; // does not compile
(++a)++; // does compile
++(a++); // does not compile
}
Run Code Online (Sandbox Code Playgroud)
但在Java中,并不是所有三个:
public class Test {
public static void main(String[] args) {
int a = 0;
++a++; // does not compile
(++a)++; // does not compile
++(a++); // does not compile
}
}
Run Code Online (Sandbox Code Playgroud)
有没有理由为什么C++编译它而不是Java?
我有一个在四核Intel i7上运行的多线程程序.当我执行时Runtime.getRuntime.availableProcessors(),我得到8,我知道在这个CPU上可以使用超线程.
但是,当我创建线程时,我的CPU级别为4个线程的100%(即非零),这意味着4个线程未被使用.有没有办法在Java中启用超线程?
在String.java中,此代码位于.equals()方法的开头:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
// ... check if instance of String, etc.
}
Run Code Online (Sandbox Code Playgroud)
这个检查纯粹是出于性能原因(即不包括它会检查this自身的字符)?
我有这个代码:
public class Test {
public static void main(String[] args) {
Void();
}
private static void Void() {
System.out.print("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
既然java.lang.Void是Java中的一个类,为什么它可以作为方法名?
在许多语言,比如Java和C/C++,比较始终形式的完成<=和>=.例如,这是一个工作示例程序:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
// Get inputs
int input1 = s.nextInt();
int input2 = s.nextInt();
// compare them
if (input1 >= input2) {
System.out.println("Input 1 is greater than or equal to input 2");
} else {
System.out.println("Input 1 is less than input 2");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会编译并正确运行.但是,如果我将一条比较线更改为:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner s = new Scanner(System.in); …Run Code Online (Sandbox Code Playgroud)