String 和 new String的区别

 我来答
娱乐小八卦啊a
高粉答主

2020-03-30 · 娱乐小八卦,天天都知道
娱乐小八卦啊a
采纳数:256 获赞数:117865

向TA提问 私信TA
展开全部

1、创建的字符串变量在内存中的区别。

两者看似都是创建了一个字符串对象,但在内存中确是各有各的想法。

String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。

String str2 = new String("abc") ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。

在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

2、特性不同:

String类 是final修饰的,不可以被继承。

String类的底层是基于char数组的。

3、性能效率不同:

String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。例如:

String str = “hello";

str = str + "world“;

所以当上文str指向了一个String对象(内容为“hello”),然后对str进行“+”操作,str原来指向的对象并没有变,而是str又指向了另外一个对象(“hello world”),原来的对象还在内存中。

由此也可以看出,频繁的对String对象进行修改,会造成很大的内存开销。此时应该用StringBuffer或StringBuilder来代替String。

而new String()更加不适合,因为每一次创建对象都会调用构造器在堆中产生新的对象,性能低下且内存更加浪费。

币特来
2018-04-07 · TA获得超过132个赞
知道小有建树答主
回答量:127
采纳率:0%
帮助的人:51万
展开全部
string不是在栈里面找“ab“。的指针在栈里面去堆里面找ab如果有的话就直接指向,如果没有的话就在堆里面创建。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
就烦条0o
推荐于2018-04-07 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
// ==与equals的区别:
// ==:
// 1、比较的是操作符两端的操作数是否是同一个对象
// 2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
// 3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为TRUE,如:
// int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆
// equals:
// 1、比较的是两个对象的内容是否一样
String s="abce"是一种非常特殊的形式,和new 有本质的区别.
*
* 它是java中唯一不需要new 就可以产生对象的途径.
*
* 以 String s="abce";形式赋值在java中叫直接量,它是在常量池中而不是象new 一样放在压缩堆中.
* 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String
* s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
public class Test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
也可以这么理解:
String str = "hello"; 先在内存中找是不是有"hello" 这个对象,
如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello".
String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,
都新建一个对象保存"hello"
String a = new String("ab");是在堆里面建立的对象 String,a和"ab"
aa="ab";是查找栈里有没有"ab",如果有就用aa引用它,如果没有就把“ab”存进栈
String r ="dsds"; ---------------------生成一个对象 "dsds"
String r =new String ("dsd"); ---------------生成两个对象,"dsd"和new String ("dsd")
因为new String("dsd")的参数"dsd"本身就是一个字符串对象,new String("dsd")又返回一个字符串对象。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式