<PRE class=java name=code><FONT size=>class StringTest { public static void main(String[] args){ String str = new String(abc);//此句代码产生后在内存中会产生几个对象? /* *分析首先Java会根据abc在String Pool(字符串池)中查找abc如果没有该 *字符串则在String Pool中创建一个对象然后在通过new关键字在Java内存堆栈中创建 *一个abc对象并且由s变量指向它 */ String str = abc;//此句代码产生后在内存中会产生几个对象? /* *分析在执行第二句代码时Java会依据上面的顺序首先在String Pool中查找abc如果 *找到有此项则变量str指向String Pool中的abc */ Systemoutprintln(str == str); //等号较的是内存地址 false Systemoutprintln(strequals(str));//比较的是值得内容 true String str = abc; Systemoutprintln(str == str); String str = new String(abc);//此句代码产生后在内存中会产生几个对象? /* *在执行第三句代码时Java首先也会在String Pool中查找abc对象然后在内存堆栈 *中创建一个新的对象abc并且str变量指向它 */ Systemoutprintln(str == str); //flalse Systemoutprintln(strequals(str)); //true /* public String intern()返回字符串对象的规范化表示形式 一个初始时为空的字符串池它由类 String 私有地维护 当调用 intern 方法时如果池已经包含一个等于此 String 对象的字符串 (该对象由 equals(Object) 方法确定)则返回池中的字符串 否则将此 String 对象添加到池中并且返回此 String 对象的引用 */ Systemoutprintln(str == strintern()); //false Systemoutprintln(str == strintern()); //true Systemoutprintln(********************); String hello = hello; String hel = hel; String lo = lo; //在+两边都是常量字符串则将两个字符串合并并且在String Pool中查找hello //并返回在String Pool中的内存地址正好也是hello变量的内存地址所以第一句代码会输出true Systemoutprintln(hello == hel + lo);//true Systemoutprintln(hello == hel + lo);//true //如果在+两边有一边是引用类型变量Java会将合并成一个字符串并且在堆栈中创建一个 //新的对象并且返回内存地址所以这句代码是输出false Systemoutprintln(hello == hel + lo); //false Systemoutprintln(hello == hel+lo); //false } }</FONT></PRE> |