/** "hello"和new String("hello");的区别? 当java直接使用形如"hello"的字符串直接量(包括可以再编译时 就能计算出来的字符串值)JVM将会使用常量常量池来管理字符串; 当使用new String("hello"); JVM先会使用常量池来管理“hello” 直接量,在调用String类的构造器来创建一个新的String对象,新 创建String对象会保存在堆内存中。 补习:什么是常量池? 常量池在java用于保存在编译期已确定的,已编译的class文件中的 一份数据。 常量池中除了包含代码中所定义的各种基本类型(如int、long等等) 和对象型(如String及数组)的常量值外,还包含一些以文本形式出 现的符号引用。 自己理解:一块专门存放常量的内存区域。 这个博客解释的有点深度:http://yiliner.iteye.com/blog/207723 百科:http://baike.baidu.com/view/8680346.htm?fr=aladdin 堆内存:堆允许程序在运行时动态地申请某个大小的内存空间 百科:http://baike.baidu.com/view/1962829.htm?fr=aladdin */ public class StringTest { public static void main(String[] args) { String str1 = "美好未来"; String str2 = "美好"; String str3 = "未来"; //str4直接引用常量池中的“美好未来” String str4 = "美好"+"未来"; //str5直接引用常量池中的“美好未来” String str5 = "美"+"好"+"未"+"来"; //在编译时期不能确定下来,不能引用 //常量池中的内存字符串 String str6 = str2+str3; // str7中引用堆内存中新建的String对象 String str7 = new String("美好未来"); // true System.out.println(str1 == str4); // true System.out.println(str1 == str5); // false System.out.println(str1 == str6); // false System.out.println(str1 == str7); // 返回字符串对象的规范化表示形式。 // System.out.println(str1.intern()); } }
"hello"和new String("hello")的区别?
时间: 2024-11-13 23:04:41