当前位置: 首页 > 面试题库 >

定义String对象直接使用“=”赋值和new 创建对象赋值有什么区别?

秦才英
2023-05-05

定义String对象直接使用“=”赋值和new 创建对象赋值有什么区别?

在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念。

字符串常量池

String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符创常量池中。

使用String直接赋值

String strA = “abc”;可能创建一个或者不创建对象,如果”abc”在字符串池中不存在,会在java字符串池中创建一个String对象(”abc”),然后str指向这个内存地址,无论以后用这种方式创建多少个值为”abc”的字符串对象,始终只有一个内存地址被分配。==判断的是对象的内存地址,而equals判断的是对象内容。通过以下代码测试:

String strA = "abc";
String StrB = new String("abc");

这两行代码中分别创建了几个对象?

【答案】第一行代码创建了1个对象,第二行代码创建了2个对象;

  • 两种方式都能创建字符串对象,但方式一要比方式二更优。

  • 因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。

常量池中已经有字符串常量”abc”

  • 通过方式一创建对象,程序运行时会在常量池中查找”abc”字符串,将找到的”abc”字符串的地址赋给a。

  • 通过方式二创建对象,无论常量池中有没有”abc”字符串,程序都会在堆内存中开辟一片新空间存放新对象。

常量池中没有字符串常量”abc”

  • 通过方式一创建对象,程序运行时会将”abc”字符串放进常量池,再将其地址赋给a。

  • 通过方式二创建对象,程序会在堆内存中开辟一片新空间存放新对象,同时会将”abc”字符串放入常量池,相当于创建了两个对象。

 类似资料:
  • 问题内容: 我想通过事件参数发生按钮单击事件时分配一些值: 我已将值分配给 。 现在我看到angular.copy()。所以我用angular.copy编写了代码。 两者都在做同样的事情,所以有什么区别?请告诉我和之间的区别。 问题答案: 可以理解,这里 执行了参数的深层复制(参见“克隆”)-本质上是创建一个新对象-而使用赋值运算符只分配 引用 的。 因此,在后一种情况下,如果您要更改某些内容,您

  • 现在从接口获取回一个对象result,它的属性和data是一样的,我要怎么把reasult值赋值给data以达到响应式? 这种可以吗?还是要先解构,再赋值给data,或者是用...这种,或者Object.assign()这种?

  • 我满足了一些深度复制原始对象文字的需求,除了一些键。我知道扩展运算符不会深度复制整个嵌套对象,但这不是这个问题的要点,所以让我们通过这个问题。 所以,回到原来的问题,我看不出使用delete关键字和将undefined分配给我要删除的目标属性之间有什么区别。 似乎方式没有那么冗长,但这样完全可以吗?

  • 001/电视购买/约翰·史密斯/真 002/冰箱购买/让·史密斯/假

  • 问题内容: 在面试中,面试官问我 以下语句之间的共同点和区别是什么: 内存分配有什么区别吗? 问题答案: 首先将在字符串常量池中查找字符串“ Test”。如果找到,将引用所找到的对象。如果未找到,则会创建一个新的String对象,并将其添加到池中,并使s引用新创建的对象。 首先将创建一个新的字符串对象,并使其引用它。此外, 如果 字符串“ Test” 尚不存在, 则 在字符串常量池中进行输入。 因

  • 本文向大家介绍JavaScript数组对象赋值用法实例,包括了JavaScript数组对象赋值用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数组对象赋值用法。分享给大家供大家参考。具体如下: 这里JavaScript数组对象的使用会使你的JS程序变得简洁而有效率,但是好像不少新手都不喜欢用数组,因为觉得它们抽象,不好理解,其实只要你认真领悟,它就像捅破窗户纸一