猿问

关于String str的问题?如下所示

String str = "hello" ; 与 String str = new String("hello"); 有什么区别?


隔江千里
浏览 190回答 2
2回答

拉莫斯之舞

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.String str = "abc ";和String str = new String( "abc ");和char[] c = { 'a ', 'b ', 'c '};String str=new String(c);都采用堆存储String str = "abc ";在栈中如果没有存放值为 "abc "的地址,等同于:String temp=new String( "abc ");String str=temp;关于String str = "abc "的内部工作。Java内部将此语句转化为以下几个步骤:(1)先定义一个名为str的对String类的对象引用变量:String str;(2)在栈中查找有没有存放值为 "abc "的地址,如果没有,则开辟一个存放字面值为 "abc "的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为 "abc "的地址,则查找对象o,并返回o的地址。(3)将str指向对象o的地址。使用String str = "abc ";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String( "abc ");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。char[] c = { 'a ', 'b ', 'c '};String str=new String(c);等同于:String str = new String( 'a '+ 'b '+ 'c ');

慕尼黑5688855

如果内存中没有“hello”字符串,二者没有区别,都是在内存中为“hello”字符串分配空间,str指向“hello”的内存地址。区别在于,如果内存中存在“hello”字符串,第一种方式不会创建新的对象;而第二种方式会在再为“hello”字符串分配空间,str指向新的“hello”的内存地址,这样内存中就有两个“hello”字符串了。
随时随地看视频慕课网APP
我要回答