String直接赋值和使用new的区别
String str1 = "ABC";
String str2 = new String("ABC");
String str1 = “ABC”;可能创建一个或者不创建对象,如果”ABC”这个字符串在java String池里不存在,会在java String池里创建一个创建一个String对象(“ABC”),然后str1指向这个内存地址,无论以后用这种方式创建多少个值为”ABC”的字符串对象,始终只有一个内存地址被分配,之后的都是String的拷贝,Java中称为“字符串驻留”,所有的字符串常量都会在编译之后自动地驻留。
String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”。
在JVM里,考虑到垃圾回收(Garbage Collection)的方便,将heap(堆)划分为三部分:young generation(新生代)、tenured generation (old generation)(旧生代)、permanent generation(永生代)。
字符串为了解决字符串重复问题,生命周期长,存于pergmen中。
JVM中,相应的类被加载运行后,常量池对应的映射到JVM运行时的常量池中。
考虑下面的问题:
String str1 = new String("ABC"); String str2 = new String("ABC");
str1 == str2的值是true还是false呢?false
String str3 = "ABC"; String str4 = "ABC"; String str5 = "AB" + "C"; str3 == str4 //true str3 == str5 // true
String a = "ABC"; String b = "AB"; String c = b + "C"; System.out.println( a == c );//false
a、b在编译时就已经被确定了,而c是引用变量,不会在编译时就被确定。
应用的情况:建议在平时的使用中,尽量使用String = “abcd”;这种方式来创建字符串,而不是String = new String(“abcd”);这种形式,因为使用new构造器创建字符串对象一定会开辟一个新的heap空间,而双引号则是采用了String interning(字符串驻留)进行了优化,效率比构造器高。
- Java中String直接赋值和使用new的区别
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- java中String通过new和直接赋值的区别
- Java中String直接赋值和使用new的区别
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- JAVA中String直接赋值与new出来的对象赋值的区别
- String、StringBuffer与StringBuilder之间区别 以及String 直接赋值和new后赋值区别
- Java中用字符串常量赋值和使用new构造String对象的区别
- Java中创建String、Integer、Charater直接赋值与new一个对象的区别
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- java中String 的==和equals;String直接赋值和使用new String()
- [改善Java代码]推荐使用String直接量赋值
- 用 new 关键字对一个String 变量赋值直接赋值有什么不同
- C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的区别
- 第01篇 为什么推荐使用String直接赋值
- Js 使用new关键字调用函数和直接调用函数的区别
- String为什么推荐使用直接赋值的方式?