堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;
栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
编译后用javap -verbose IntTestpublic class IntTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=3;
int b=3;
a=4;
System.out.print(a);
}
}
![关于JVM的堆栈的思考 - bohu83 - bohu83的博客 关于JVM的堆栈的思考 - bohu83 - bohu83的博客](http://img2.ph.126.net/G7fi6x8usP6FxdxPwTlNBA==/4818288651433333169.jpg)
面试题:String s = new String(“xyz”); 产生几个对象? 一个或两个。如果常量池中原来没有 ”xyz”, 就是两个。如果原来的常量池中存在“xyz”时,就是一个。
对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
2.1Java自动拆箱和装箱:在自动装箱时,把int变成Integer的时候,是有规则的,当你的int的值在-128-IntegerCache.high(127) 时,返回的不是一个新new出来的Integer对象,而是一个已经缓存在堆 中的Integer对象,(我们可以这样理解,系统已经把-128到127之 间的Integer缓存到一个Integer数组中去了,如果你要把一个int变成一个Integer对象,首先去缓存中找,找到的话直接返回引用给你就 行了,不必再新new一个),如果不在-128-IntegerCache.high(127) 时会返回一个新new出来的Integer对象。
建议:public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = "abc";
String str2 = new String("abc").intern();
System.out.println(str1==str2); //true, intern 特性String str3 = new String("abc");
System.out.println(str1==str3);//false,对象不同
String str4 ="ab"+"c";
System.out.println(str1==str4); //true,常量池存在
String str5 =str4+"";
System.out.println(str1==str5); //false,涉及到变量str4(不全是常量)的相加,所以会生成新的对象,其内部实现是先new一个StringBuilder,然后 append ,再tostring.int a =3;
int b =3;
System.out.println(a==b);//true
int c = 300;
int d = 300;
System.out.println(c==d);//true
Integer e = 321;
Integer f = 321;
System.out.println(e==f);//false 超出缓存,新生成对象了
}
1当比较包装类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==。
2.由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
说道优化这里,顺便说一下最好指定容器类大小。
3 对于ArrayList、HashMap等等,在扩容的时候都需要做ArrayCopy,对于系统压力很大,要尽量避免。
4.对于对象池,唯一合适的场景就是当池中的每个对象的创建开销很大时,缓存复用才有意义,例如每次new都会创建一个连接,或是依赖一次RPC。否则也没啥优化效果。
5.避免集中创建对象尤其是大对象