那么 static 方法呢, 其内存分配如何另外 我地程序里写多下面这些语句时,有时候 会出现stack over flow错误 "在类field中 调用其他类地非static方法",如:private final long SLEEPTIME = INMSContext.getInstance().getnCheckServiceAlivePeriod();谢谢
static 方法跟static 变量一样 类装载时分配private final long 是在其相应的内存占(stack)中创建的这里stack over flow可能是由于你调用其他方法造成的
对于Hashmap,它里面都一个个的Entry对象,有四个属性 final Object key; Object value; final int hash; Entry next; Hashmap初始化的时候,容量是16个Entry,当put的Entry到达上限的3/4的时候,自动扩容到原来的两倍 就是元素超过9个的时候,Hashmap得容量就到了32。
类的装载看下面: /* TestS.java * Created on 2004/12/08 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */public class TestS { TestUnit c = new TestUnit("TestUnit1"); static { TestUnit a = new TestUnit("TestUnit2"); } static TestUnit b = new TestUnit("TestUnit3"); TestS() { TestUnit d = new TestUnit("TestUnit4"); d = c; } public static void main(String[] args) { TestUnit e = new TestUnit("TestUnit5"); TestS t = new TestS(); } }class TestUnit { private String name; public TestUnit(String name) { System.out.println("init: " + name); } } ------------------------------ 输出 init: TestUnit2 init: TestUnit3 init: TestUnit5 init: TestUnit1 init: TestUnit4
看看Thinking in java第三版的 Collections of Objects一章就知道了。
对于Hashmap,它里面都一个个的Entry对象,有四个属性 final Object key; Object value; final int hash; Entry next; Hashmap初始化的时候,容量是16个Entry,当put的Entry到达上限的3/4的时候,自动扩容到原来的两倍 就是元素超过9个的时候,Hashmap得容量就到了32。 ----------------------------------------------------------------------------------------- final int hash;--> hashCode默认上限是0.75,也就是load factor参数,这个参数是可以设置的。 load factor越大,消耗的空间越小,但是从hashMap里检索数据的速度会变慢 反之亦然 所以要在空间和时间上做权衡
我地程序里写多下面这些语句时,有时候 会出现stack over flow错误
"在类field中 调用其他类地非static方法",如:private final long SLEEPTIME = INMSContext.getInstance().getnCheckServiceAlivePeriod();谢谢
final Object key;
Object value;
final int hash;
Entry next;
Hashmap初始化的时候,容量是16个Entry,当put的Entry到达上限的3/4的时候,自动扩容到原来的两倍
就是元素超过9个的时候,Hashmap得容量就到了32。
另外,方法在被调用时也重新分配空间(存放copy的方法体)吗?还是什么别的?
/* TestS.java
* Created on 2004/12/08
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/public class TestS {
TestUnit c = new TestUnit("TestUnit1"); static {
TestUnit a = new TestUnit("TestUnit2");
} static TestUnit b = new TestUnit("TestUnit3"); TestS() {
TestUnit d = new TestUnit("TestUnit4");
d = c;
} public static void main(String[] args) {
TestUnit e = new TestUnit("TestUnit5");
TestS t = new TestS(); }
}class TestUnit {
private String name; public TestUnit(String name) {
System.out.println("init: " + name);
}
}
------------------------------
输出
init: TestUnit2
init: TestUnit3
init: TestUnit5
init: TestUnit1
init: TestUnit4
当class被实例化的时候,初始化非静态的成员变量,然后是构造函数。大概是这个意思,不是很详细。
final Object key;
Object value;
final int hash;
Entry next;
Hashmap初始化的时候,容量是16个Entry,当put的Entry到达上限的3/4的时候,自动扩容到原来的两倍
就是元素超过9个的时候,Hashmap得容量就到了32。
-----------------------------------------------------------------------------------------
final int hash;--> hashCode默认上限是0.75,也就是load factor参数,这个参数是可以设置的。
load factor越大,消耗的空间越小,但是从hashMap里检索数据的速度会变慢
反之亦然
所以要在空间和时间上做权衡
看您上面的结果,应该是先静态代码段吧,再是类变量
-------------------------------------------------------
哦,谢谢提醒,静态代码段和静态成员变量,谁在前面,谁就先执行