new String(123) 创建了几个对象?

String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以 new String("123") 创建了几个对象为例记录。

一、你能回答正确吗

String a = "123";

如上定义的为常量;

String b = a +"456";

如上 b 为变量,为啥? 难道常量拼接常量得到的是变量吗?

不是,常量拼接常量得到的依旧是常量。

但是此时将 a 作为引用,a 已经不再是常量了,是变量了,所以得到的 b 自然就是变量。

String b = "123" + "456"

此时 b 为常量。

如果给 a 加上修饰符 final ,那么 a 就是个常量,那么 b 就为常量了。


二、String定义常量和变量的区别

我们再来通过两种写法分析:

String a = "123";
String b = new String("123");

如上第1行,定义了一个常量 a ,第2行,通过关键字 new 的形式,创建了一个变量 b 。

我们结合之前学过的 JVm 再深入一些,第1行在常量池开辟了一块空间,存放字符串 123,通过 a 对象指向这个常量对象。第2行由于使用了 new 关键字,所以会在堆空间中开辟一块内存区域,在其中存放字符串 123,并把内存的地址赋予 b 变量。

所以, a==b 吗?显示是 false,一个是堆内存,一个是常量池。

如果将 a 修改成:

String a = new String("123");

那么,a==b 吗?

依旧是 false。

为什么?只要通过 new 形式,自然是创建两个对象,所以是 false,即便是他们的值是一致的。

三、String常量变量的总结

String 常量存放在常量池中,jvm处于优化考虑,会让内容一致的对象共享内存块,但变量是放在堆空间中的,new 定义的不同变量内存地址不同。

String 常量连接常量,还是常量,依旧用常量池管理,但常量连接变量就是变量了。

四、创建几个对象的练习

以下几种情况(均不考虑字符串在常量池中已存在的情况):

1、String a="123";

创建了1个对象

jvm在编译阶段会判断常量池中是否有 "123" 这个常量对象如果有,a直接指向这个常量的引用,如果没有会在常量池里创建这个常量对象。

2、String a=new String("123");

创建了2个对象

同情况1,jvm编译阶段判断常量池中 "123"存在与否,进而来判断是否创建常量对象,然后运行阶段通过new关键字在java heap创建String对象。

3、String a="123"+"456";

创建了1个对象

jvm编译阶段过编译器优化后会把字符串常量直接合并成"123456",所有创建对象时最多会在常量池中创建1个对象。

4、String a="123"+new String("456");

创建了4个对象

常量池对象"123" ,"456",new String("456")创建堆对象,还有一个堆对象"123456"。

最后练习参考文章:https://blog.csdn.net/baidu_27969827/article/details/79219708

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何优化网站页面提高网页的加载速度

网站要想加载快无非就是减少http请求次数&#xff0c;下面说一下具体做法&#xff1a; 1&#xff1a;字符集声明 如果<head>部分未定义字符集&#xff0c;将增加页面渲染次数&#xff0c;速度减慢。 2&#xff1a;Meta信息完善程度 建议网站meta信息填写完整 3&…

工作263:弹性布局 修改样式

<div class"container" style"display: flex;flex-direction: column"><!-- <el-radio-group v-model"mode">--><div ><!-- <el-radio-button class"login-btn" label"0">营销端</el…

MongoDB系列四(索引).

一、索引简介 再来老生常谈一番&#xff0c;什么是索引呢&#xff1f;数据库索引与书籍的索引类似。有了索引就不需要翻整本书&#xff0c;数据库可以直接在索引中查找&#xff0c;在索引中找到条目以后&#xff0c;就可以直接跳转到目标文档的位置&#xff0c;这能使查找速度提…

并发编程之多线程线程安全(上)

1、为什么有线程安全问题&#xff1f; 当多个线程共享同一个全局变量或静态变量&#xff0c;做写的操作时&#xff0c;可能会发生数据冲突问题&#xff0c;也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例&#xff1a;现在有100张火车票&#xff0c;有两个窗口…

[PAT乙级]数字分类 (20)

题目描述 给定一系列正整数&#xff0c;请按要求对数字进行分类&#xff0c;并输出以下5个数字&#xff1a;A1 能被5整除的数字中所有偶数的和&#xff1b;A2 将被5除后余1的数字按给出顺序进行交错求和&#xff0c;即计算n1-n2n3-n4...&#xff1b;A3 被5除后余2的数字的个…

怎样在php中使用PDF文档功能

写给Hunte: 好久不在网上见你,真有点说不出来的感觉,没有hunte的phpuser.com什么也不是. 转了你站上的两篇文章, 特翻了一篇了以示致歉. ---------------------------------------------------- 原作者:Perugini Luca (www.phpbuilder.com) 译者:znsoft (http://www.phpease.co…

并发编程快速入门

1、线程与进程的区别 进程是所有线程的集合&#xff0c;每一个线程是进程中的一条执行路径。 比方&#xff1a;通过查看 windows 任务管理器中的列表&#xff0c;我们可以把运行在内存中的 exe 文件理解成进程&#xff0c;进程是受操作系统管理的基本运行单元。 2、为什么要…

工作275:表单验证层级添加

<template><!--绑定了一个 控制是否为全屏fullscreen close-on-click-modal 是否通过点击model进行关闭 visible是否显示弹出框 close关闭按钮 --><el-dialog :title"fullTitle" width"80%" :fullscreen"false" :close-on-click-…

Python 黑帽子第二章运行截图

转载于:https://www.cnblogs.com/blankicefire/p/8796158.html

公司网页添加旺旺,状态不正确

这两天在给公司做的网站添加旺旺&#xff0c;在阿里巴巴官网生成代码之后复制到网页。想试试旺旺的状态是否正确&#xff0c;登录旺旺之后一直都是不在线状态&#xff0c;如下图&#xff1a; &#xff0c; 到官网问客服之后得到的答复如下&#xff1a; 如果您登录了阿里旺旺…

并发编程之多线程线程安全(下)

1、什么是 Volatile&#xff1f; volatile 是一个类型修饰符&#xff0c;具有可见性&#xff0c;也就是说一旦某个线程修改了该被 volatile 修饰的变量&#xff0c;它会保证修改的值会立即被更新到主存&#xff0c;当有其他线程需要读取时&#xff0c;可以立即获取修改之后的值…

工作265:v-model实现原理 自定义组件使用v-model

v-model只是一个语法糖&#xff0c;等于:valueinput&#xff0c;真正的实现靠的还是&#xff1a; &#xfeff;v-bind:绑定响应式数据&#xff0c;触发 input 事件并传递数据 (核心和重点) 1其实和下面一样的 <input :value“something” input“something $event.target…

关于CI框架引入CSS与JS文件

</pre>最近用了一下CI框架&#xff0c;使用到了bootstrap&#xff0c;引入CSS文件的时候一直不生效&#xff0c;琢磨这找到了原因。<p></p><p>首先&#xff0c;在根目录找到.htaccess文件&#xff0c;修改为如下内容</p><p></p><…

视图转为表

create table t as select * from view转载于:https://www.cnblogs.com/jycjy/p/8796841.html

idea中隐藏.iml文件

在创建父子工程或者聚合工程时产生的大量 .iml 文件&#xff0c;有时会对我们的操作产生干扰&#xff0c;所以&#xff0c;一般情况下&#xff0c;我们都将其隐藏掉&#xff0c;步骤如下&#xff1a; File——>settings——>Editor——>File Types——>Ignore fil…

YII2 服务器验证码不显示

<span style"font-size:18px;">最近做的一个项目上线了&#xff0c;我用YII2新搭建的后台&#xff0c;在本地以及内测地址都正常&#xff0c;上线之后验证码却没有显示&#xff0c;上网搜了一下&#xff0c;有网友说修改一下源文件就可以。</span> 查找源…

微信小程序视频弹幕效果

这次&#xff0c;和大家一起探讨下小程序视频弹幕一、按照老规矩&#xff0c;先附上gif效果图&#xff1a;二、接下来看下官方文档API对vide说明PS&#xff1a;相关属性解析&#xff1a;danmu-list:弹幕列表 enable-danmu:是否显示弹幕 danmu-btn:弹幕按钮 controls:是否显示视…

基于Docker搭建GitLab代码管理

关于Git、SVN的优缺点就不再重复了&#xff0c;本篇主要以实际搭建为主。 1、下载镜像文件 在命令行窗口执行如下指令&#xff0c;预计下载完成4分钟。 docker pull beginor/gitlab-ce:11.0.1-ce.0注意&#xff1a; 一定要配置镜像加速&#xff0c;不然会非常非常的慢&#x…

虚拟域名不能访问

早上遇到个问题&#xff0c;打开本地虚拟域名&#xff0c;访问报错。开始的时候报错是&#xff0c;地址不存在。后面发现是因为丢了.htaccess文件&#xff08;用的是TP框架&#xff09;&#xff0c;加上这个文件&#xff0c;内容如下 <IfModule mod_rewrite.c>Options Fo…