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);
  }
  }

解决方案 »

  1.   

    字符串“==”、“产生了多个对象”等问题永远是 CSDN Java 版永远不灭的月经话题!
      

  2.   

    说错了,现在成“日经帖”了,昨天还有一个http://topic.csdn.net/u/20101204/16/5be7b416-d4d5-4d0e-8382-89597880271c.html
      

  3.   

    /*
    先说一下结果:
    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
    */楼下的给出分析
      

  4.   

    1、存储在栈中,
    String str1 = "abc";
    String str2 = "abc";
    当栈中没有"abc"时会分配一块存储String str1 = "abc";
    当str1存在的时候,jvm自动寻找有没有"abc"这块域,找到了就直接把引用赋值给str2
    所以是true2、new 出来的东西都是在堆里面的, 每次new都会分配新的堆空间,所以地址肯定不一样了
      

  5.   

    个人对字符串的一点建议:
    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
    ......
      

  6.   

    不好意思,"直接new一个str1_对象,并放入堆中"这说的不太专业, 应该说是在堆中分配一块内存. 反正就是那个意思,兄弟们就将着理解吧.