关于 new String("xyz")创建几个对象的理解

经典问题:String s1 = "abc" 与 String s2 = new String("abc")的区别 这是以前刚学Java那会经常被问到的问题,并且也会经常出现在面试中。这个问题不仅仅只局限于Java,可以适用于其他大部分语言,正好最近有个小朋友在学编程,特此整理一下。 String s1 = "abc" ; String s2 = new String("abc"); 首先,我们先看看以上两句分别做了什么? String s1 = “abc” 做了什么 在栈中创建了一个名为 s1 的变量... 阅读详情
 

我们先看一个最简单的程序

  1. public class T {  
  2.   private String str = "###########JAVA2000#####################";  
  3.   
  4.   public void test() {  
  5.     String s = "@@@@@@@@@@JAVA2000@@@@@@@@@@@@@";  
  6.     String ss = "###########JAVA2000#####################"// 特意和str相同  
  7.   }  
  8. }  
public class T {
  private String str = "###########JAVA2000#####################";

  public void test() {
    String s = "@@@@@@@@@@JAVA2000@@@@@@@@@@@@@";
    String ss = "###########JAVA2000#####################"; // 特意和str相同
  }
}

我们来看一下这个类到底生成了什么,我们打开T.class

里面已经存在了我们用到的2个字符串,注意是2个,那个重复的并没有出现2次。

结论:

  1. 这种字符串是在编译期间就生成了,可以理解为类加载时,已经在内存里存在了,不再需要new
  2. 所以 new String("XYZ") 中的 "XYZ" 是在加载时存在的,系统以此为模板,重新分配内存空间,创建了一个新的对象
  3. 至于String str = new String("XYZ"); 里面的 str 只能算一个引用,一个变量而已,所以单单看这个动作,只创建了一个对象。因为这语句执行前,那个"XYZ"已经存在了。不能计算为这个语句引起的。

总之,这个面试题主要看题目的理解,有些概念很难澄清,虽然大家都知道,但说法不同


Open3D 使用CPD算法对点云配准【2025最新版】 Coherent Point Drift相干点漂移算法实现点云配准(python代码)博客长期更新,本文最近更新时间为:2025年2月2日。 阅读详情

相关推荐

HTML金色流星雨(完整代码)

HTML实现金色流星雨动态效果的完整代码。

AIGC 929

面试题】String str = new String(“xyz“) 一共创建几个对象

String str = new String("xyz") 一共创建几个对象

qq_62200539的博客 551

HCIE-Cloud Computing V3.0 课件 PPT

HCIE-Cloud Computing V3.0 课件 PPT

Java 中,什么条件下两个 String 会是同一个对象

这段时间工作上经常用遇到 String 对象比较的问题,这是一个比较基础的问题,但有时候对其原因还是有些迷惑,所以稍微总结一下。

玖涯博客 998

请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧

<br />这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的。 <br />本来因为见得太多已经吐槽无力,但这次实在忍不住了就又爆发了一把。写得太长干脆单独开了一帖。 <br /><br />顺带广告:对JVM感兴趣的同学们同志们请多多支持高级语言虚拟机圈子  <br /><br />以下是回复内容。文中的“楼主”是针对原问题帖而言。 <br /><br />=============================================================== <b

2487

String s=new String(“xyz“) 创建几个对象(详细解析)

String s=new String("sdd") 这个产生了2个对象,一个是new关键字创建new Sring();另一个是“sdd”对象,abc在一个字符串池中s这个对象指向这个串池 这个题的考点知识很多: 引用变量与对象的区别; 字符串文字"abc"是一个String对象; 文字池(pool of literal strings)和堆(heap)中的字符串对象。 一、

john2522的专栏 3万+

String s = new String("xyz");创建几个字符串对象

两个对象,要理解这个,就要知道string类的工作原理。下面来慢慢分析一下: public class StringTest { public static void main(String[] args){ String s1=&quot;Hello&quot;; String s2=&quot;Hello&quot;; String s3=new String(&quot;Hel...

一个傻子程序媛的博客 1万+

Strings=newString(“xyz“)创建几个实例

面试题说起 String s = new String("xyz"); 创建几个实例? 这是一道很经典的面试题,在一本所谓的Java宝典上,我看到的“标准答案”是这样的: 两个,一个堆区的“xyz”,一个栈区指向“xyz”的s。 这个所谓的“标准答案”槽点太多,后面我们慢慢分析。 虽然答案很离谱,但是我觉得这个问题本身也不具有什么意义,因为问题没有既定义“创建”的具体含义,又没有指定“创建”的时间,是运行时吗?包不包括类加载的时候?有没有上下文代码语境?也没有定义实例是指什么实例,是指Java实例吗

doubututou的博客 1588

工作10年后,再看String s = new String("xyz") 创建几个对象

这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都...

JAVA葵花宝典 242

关于String s = new String("xyz"); 创建几个对象的问题

你知道在java中除了 8 种基本类型外,其他的都是类对象以及其引用。 所以"xyz "在java中它是一个String对象. 对于string对象来说他的对象值是不能修改的,也就是具有不变性。 看: 啊,s 所引用的 string 对象不是被修改了吗?之前所说的不变性,去那里了啊? 你别着急,让我告诉你说发生了什么事情: 在 jvm 的工作过程中,会创建一片的...

zqzwzd的博客 371

String s=new String("xyz");创建几个String Object?二者之前的区别是什么?

String s=new String("xyz");创建几个String Object?二者之前的区别是什么?       两个。第一个对象是字符串常量"xyz" 第二个对象new String("xyz")的时候产生的,在堆中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz" 另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。 转载自:htt

laowang2915的博客 2万+

String s = new String(“xyz“);创建了多少个String实例”?

String s = new String("xyz");创建了多少个String实例”?

_古井心 4539

String s = new String(“xyz”);创建几个字符串对象

这一行代码可能会创建一个或两个字符串对象,具体取决于"xyz"如果"xyz"已经存在于字符串常量池中,这行代码将只在堆中创建一个新的字符串对象。如果"xyz"不在字符串常量池中,这行代码将首先在常量池中创建一个"xyz"对象,然后再在堆中创建一个新的字符串对象

Flying_Fish_roe的博客 1021

判断一行字符串里面有多少个相同符号_new String("askcto")会不会在常量池中创建字符串实例...

写在前面对于String s1 = new String("askcto"),这行代码到底会不会在常量池中创建字符串实例,这个是一个值得考虑和动手去证明的一个问题。网上对于这个问题也是众说纷纭。首先说明一点,使用的JDK版本是1.7。那么就一起开启我们的探索之旅。顺便提一句,JDK1.7,常量池已经移动到堆内存中了,以前是在方法区里面(也即永久代,永久代是用来实现方法区的,JDK1.8,...

weixin_39765057的博客 333

Java - String s = new String(“xyz”); 创建几个字符串对象

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 两个对象,一个是静态区的“xyz”,一个是用new创建在堆上的对象。 ...

了解➔熟悉➔掌握➔精通 3万+

java面试题——new Stringxyz创建几个StringObject?是否可以继承String类?

String属于什么数据类型常量池:字符串存储的区域。程序结束后由系统释放 String s = new String("xyz")创建StringObject分为两种情况应用场景:

m0_56174436的博客 601

String s=new String("xyz") 到底创建几个对象

1.首先声明s不是对象,不是对象,不是对象,s是指针引用2.如果"xyz"在常量池中存在,只会在堆中创建一个new String("xyz") ;一个对象3.如果"xyz"在常量池中不存在,会现在常量池中创建一个“xyz”,然后在堆中创建一个new String("xyz");两个对象...

shiyilukou的博客 3416
上一篇: Java同步机制的应用
下一篇: Hashtable和HashMap的区别
Onlyarticle
博客等级 码龄20年 5粉丝 7原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值