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);
}
}
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
堆:存放用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);
}
}
先说一下结果:
1) true
2) false
3) true true
4) false false false
5) false false true true
6) false kvill kvill true
7)
8) true true true
9) false
10)false
11)false
*/楼下的给出分析
String str1 = "abc";
String str2 = "abc";
当栈中没有"abc"时会分配一块存储String str1 = "abc";
当str1存在的时候,jvm自动寻找有没有"abc"这块域,找到了就直接把引用赋值给str2
所以是true2、new 出来的东西都是在堆里面的, 每次new都会分配新的堆空间,所以地址肯定不一样了
1. String str1="abc"; 与String str1_=new String("abc");两个语句看似相同,实则有很大差别,前一句是在生成一个对象str1之前,先去常量池中查找有没有"abc",如果有,则直接引用原来的.如果没有,则创建这个对象,并把这个对象放到常量池.而第二句则是直接new一个str1_对象,并放入堆中.所以new 两个相同值的String对象肯定是不等的.而String str1_=new String("abc").intern(), 则str1==str1_为true.
2. 64们机中,一个字符串至少占用64个字节,是不是很恐怖吧.
3. split出来多个字符串,实际上还是指向同一个地址哦.
4. 少用+,多用StringBuffer,StringBuilder
......