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时,创建了一个对象。

*************************************优雅的分割线 **********************************

分享一波:程序员赚外快-必看的巅峰干货

如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程

请关注微信公众号:HB荷包
在这里插入图片描述
一个能让你学习技术和赚钱方法的公众号,持续更新

posted @ 2020-12-18 16:00  游在空中的鱼  阅读(505)  评论(0编辑  收藏  举报