测测你对java内存的理解
懒得搭理你 2010-12-05 10:48:42 java的内存大致划分:
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
试试下面的题目,并且给出分析
1.
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);
2.
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2);
3.
String s0="kvill";
String s1="kvill";
String s2="kv" + "ill";
System.out.println( s0==s1 );
System.out.println( s0==s2 );
4.
String s0="kvill";
String s1=new String("kvill");
String s2="kv" + new String("ill");
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
5.
String s0= "kvill";
String s1=new String("kvill");
String s2=new String("kvill");
System.out.println( s0==s1 );
System.out.println( "**********" );
s1.intern();
s2=s2.intern(); //把常量池中"kvill"的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
6.
String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
7.
final StringBuffer a = new StringBuffer("111");
final StringBuffer b = new StringBuffer("222");
a=b;//此句编译不通过
final StringBuffer a = new StringBuffer("111");
a.append("222");// 编译通过
8.
String a = "a1";
String b = "a" + 1;
System.out.println((a == b));
String a = "atrue";
String b = "a" + "true";
System.out.println((a == b));
String a = "a3.4";
String b = "a" + 3.4;
System.out.println((a == b));
9.
String str1 = "ab";
String str2 = "b";
String str = "a" + str2;
System.out.println((str1 == str));
10.
String a = "ab";
final String bb = getBB();
String b = "a" + bb;
System.out.println((a == b));
Public static String getBB() { return "b"; }
11.
public class Test4 {
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
}
}