String s = new String("123")究竟创建了几个对象

前言

今天上班划水的过程中有人询问到这个问题,网上对于这个问题也有争议,有说创建了一个对象,有说两个,有说三个。

首先说三个的肯定是扯淡了,今天来讨论一下这条语句到底创建了几个对象。

在进入正题之前,先回顾一下几个基础知识。

常量池

常量池是为了避免对对象的重复创建和销毁而影响系统性能,从而实现对象共享。在编译期就能确定的字符串,会被存放到常量池中,如String s = "123";。此后如果使用到123这个字符串,就会直接从常量池中获取,而不用每次都再new一个123出来。关于常量池更详细的知识点,请阅读这篇文章 Java常量池

对象比较

==和equals的区别想必就不需要我着重介绍了,equals比较的是值,==比较引用类型时,比较的是地址。

进入正题

稍微介绍了一下上面两个基础知识点,下面进入正题,String s = new String("123")究竟创建了几个对象?这里先说结论,第一次创建了两个,第二次创建了一个。

我们来分析这条语句。首先s是一个引用变量,用来接收new的String,因此s不是一个对象。new String是典型的创建一个对象,放到堆中。而"123"也是个对象,123在编译期就可以确定,因此是放到常量池。上面这句代码可以拆成下面两条。

String temp = "123";
String s = new String(temp);

这样就很容易理解了,String temp = "123"毫无疑问是创建了一个对象,new String(temp)又创建了一个对象,因此是两个。

那么创建一个对象的结论是从何而来的?

首先来通过代码证明一下常量池是否存在。

String s1 = "123";
String s2 = "123";
System.out.println(s1 == s2);

s1和s2都是字符串对象,通过==比较的是二者地址,运行结果为true,说明二者地址相同,是同一个对象。

在 String s1 = "123";这条语句中,创建了一个对象"123",放入常量池中,下面的String s2 = "123";从常量池中取出了123并赋值给s2,因此s2这条语句没有创建对象。

那么我们看下面的代码。

String temp = "123";
String s1 = new String(temp);

String temp2 = "123";
String s2 = new String(temp2);

在这个代码中,上面的代码创建了两个对象,分别是"123"和new String("123"),接着, 123被存入常量池中。下面的代码取出123并new String("123"),只创建了一个对象。

结语

在 String s = new String("123") 这条语句中

当常量池中不存在123时,创建了两个对象。

当常量池中存在123时,创建了一个对象。

发布了30 篇原创文章 · 获赞 35 · 访问量 2769

猜你喜欢

转载自blog.csdn.net/qq_36403693/article/details/103803560
今日推荐