String对象的探究(new String到底创建了多少对象?)

news2024/12/23 10:15:34

String对象的探究

  • 1. 前言(String)
  • 2. new String()到底创建了多少对象(java8举例)?
    • 2.1. new String("abc"):2/1
    • 2.2. String str = “a” + "b" + “c”:1
    • 2.3. String abc ="a"+ new String("bc"):5
    • 2.4. String str = new String(“a”) + new String(“b”):6

1. 前言(String)

  • 内部结构
    1. jdk8及以前,使用的是char[]
    2. jdk8以后,使用的是byte[]+字符编码标识
  • 不可变性
    1. 通过字面量的方式给一个字符串赋值,是直接声明在字符串常量池
    2. 字符串常量池中是不会存储相同内容的字符串的
  • 内存分配
    1. jdk6及以前:字符串常量池存放在永久代
    2. jdk6之后:调整到了Java堆
  • intern()方法
    1. jdk6及以前:如果字符串常量池中有,则不会放入,而是返回已有的字符串常量池中对象的地址;如果没有,会把此对象复制一份(创建一份新的),放入字符串常量池中,并返回字符串常量池中对象的地址
    2. jdk6之后:如果字符串常量池中有,则不会放入,而是返回已有的字符串常量池中对象的地址;如果没有,会把此对象的引用地址复制一份,放入字符串常量池中,并返回字符串常量池中的引用地址

2. new String()到底创建了多少对象(java8举例)?

2.1. new String(“abc”):2/1

  • 如果在常量池中“abc”不存在,则分别在常量池中和堆中创建“abc”字符串常量以及字符串实例对象
  • 如果在常量池中“abc”不存在,则只在字符串实例对象
  • 无论如何都会创建字符串实例对象

2.2. String str = “a” + “b” + “c”:1

  • 这个“a + b + c”在底层会在编译阶段编译为“abc”JAVA在编译器编译时,常量与常量的拼接会得到编译优化为“abc”并放入常量池中

2.3. String abc =“a”+ new String(“bc”):5

在这里插入图片描述

  • 这里假设字符串常量池中无数据
  • 只要不是单纯的直接使用字符串字面量相加就会在运行时产生一个StringBuilder对象用于字符串连接,且不会进行此处的字符串编译优化
  • 根据如上图所示,会产生:StringBuilder字符串常量astring(”bc“)bc字符串常量StringBuilder.toString() 方法:new一个String(“abc”)对象,一共五个对象

2.4. String str = new String(“a”) + new String(“b”):6

在这里插入图片描述* 这里假设字符串常量池中无数据

  • 根据如上图所示,会产生:StringBuilderstring(”a“)字符串常量astring(”b“)b字符串常量StringBuilder.toString() 方法:new一个String(“ab”)对象,一共六个对象

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

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

相关文章

【MySQL源码】Seconds_Behind_Master是如何计算的

作为MySQL DBA,相信大家对参数 Seconds_Behind_Master 并不陌生,该字段的值可以通过 show slave status\G的输出,表示主从延迟的时间,单位为秒。监控主从延迟一般取这个值就足够了。0 表示无延迟,理想状态该值不要超…

JavaWeb之JavaScript-Vue --黑马笔记

什么是JavaScript? JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互。 JavaScript 和 Java 是完全不同的语言,不论是概念还是设计。但是基础语法类似。 …

【动态规划】879. 盈利计划

作者推荐 【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径 本文涉及知识点 动态规划汇总 LeetCode879. 盈利计划 集团里有 n 名员工,他们可以完成各种各样的工作创造利润。 第 i 种工作会产生 profit[i] 的利润,它要求 group[…

用flinkcdc debezium来捕获数据库的删除内容

我在用flinkcdc把数据从sqlserver写到doris 正常情况下sqlserver有删除数据,doris是能捕获到并很快同步删除的。 但是我现在情况是doris做为数仓,数据写到ods,ods的数据还会通过flink计算后写入dwd层,所以此时ods的数据是删除了…

java SSM自助快递服务平台myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM自助快递服务平台是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

【设计模式】字节三面:请举例阐释访问者模式

今天我们要一起探讨的主题是一种设计模式——访问者模式(Visitor Pattern)。我将从最基础的概念、应用场景,再到实例代码的展示,全方位的为大家剖析访问者模式。而且,我保证,你即使是编程新手,也能理解并开始应用这个设…

Unity3D控制人物移动的多种方法

系列文章目录 unity知识点 文章目录 系列文章目录前言一、人物移动之键盘移动1-1、代码如下1-2、效果 二、人物移动之跟随鼠标点击移动2-1、代码如下2-2、效果 三、人物移动之刚体移动3-1、代码如下3-2、效果 四、人物移动之第一人称控制器移动4-1、代码如下4-2、效果 五、And…

P9232 [蓝桥杯 2023 省 A] 更小的数

[蓝桥杯 2023 省 A] 更小的数 终于本弱一次通关了一道研究生组别的题了[普及/提高−] 一道较为简单的双指针题,但一定有更好的解法. 题目描述 小蓝有一个长度均为 n n n 且仅由数字字符 0 ∼ 9 0 \sim 9 0∼9 组成的字符串,下标从 0 0 0 到 n − 1 n-1 n−1&a…

three.js从入门到精通系列教程052 - 制作立方体添加重影特效

<html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程052 - 制作立方体添加重影特效</title><script src"ThreeJS/three.js"></script><script src"ThreeJS/jquery.js"><…

精品基于Uniapp+springboot智慧校园管理系统App课程选课成绩

《[含文档PPT源码等]精品基于Uniappspringboot智慧校园管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

动态规划—— 求最长不下降序列LIS【集训笔记】

题目描述 设有由n(1≤n≤200)个整数组成的数列&#xff0c;记为:b(1)、b(2)、……、b(n)&#xff0c;若存在i1<i2<i3<…<ie 且有b(i1)<b(i2)<…<b(ie)则称为长度为e的不下降序列。程序要求&#xff0c;当原数列出之后&#xff0c;求出最长的不下降序列。 …

第16章_网络编程拓展练习(TCP编程,UDP编程)

文章目录 第16章_网络编程拓展练习TCP编程1、学生与老师交互2、查询单词3、拓展&#xff1a;查询单词4、图片上传5、拓展&#xff1a;图片上传6、多个客户端上传文件7、群聊 UDP编程8、群发消息 第16章_网络编程拓展练习 TCP编程 1、学生与老师交互 案例&#xff1a;客户端模…

vue的模板语法-指令-事件绑定-条件渲染

VSCode代码片段生成 我们在前面练习Vue的过程中&#xff0c;有些代码片段是需要经常写的&#xff0c;我们再VSCode中我们可以生成一个代码片段&#xff0c;方便我们快速生成。 VSCode中的代码片段有固定的格式&#xff0c;所以我们一般会借助于一个在线工具来完成。 具体的步…

前端模板字符串的使用

目录 1.说明 2.示例 3.总结 1.说明 模板字符串是用反引号&#xff08;&#xff09;分隔的字面量&#xff0c;允许多行字符串&#xff0c;带有嵌入表达式的字符串插值和一种带标签的模板的特殊结构。 是增强版的字符串&#xff0c;在进行字符串拼接时&#xff0c;可以拼接固…

基本的 Socket 模型

什么是Socket Socket 的中文名叫作插口&#xff0c;咋一看还挺迷惑的。事实上&#xff0c;双方要进行网络通信前&#xff0c;各自得创建一个 Socket&#xff0c;这相当于客户端和服务器都开了一个“口子”&#xff0c;双方读取和发送数据的时候&#xff0c;都通过这个“口子”…

机器学习 | 深入理解并掌握核心概念

在如今数字化时代的浪潮下&#xff0c;机器学习已经成为人工智能领域的璀璨明星。它像一面魔镜&#xff0c;赋予计算机系统学习和改进的能力&#xff0c;让机器能够从海量数据中提取规律、预测未来&#xff0c;甚至做出智能决策。本 专栏 将带您踏上机器学习的奇妙之旅&#xf…

什么是 Web3.0

什么是Web3.0 对于 Web3.0 的解释网上有很多&#xff0c;目前来说 Web3.0 是一个趋势&#xff0c;尚未有明确的定义。我们今天讨论下几个核心的点&#xff0c;就能很好的理解 Web3.0 要解决哪些问题 谁创造数据&#xff0c;这里的数据可以是一篇博客&#xff0c;一段视频&…

如何在容器内部进行抓包

//先获取POD 的容器ID号 //去pod容器所在节点进行解析id为pid号 //通过pid号进入这个容器的网络命名空间 docker inspect --format {{.State.Pid}} 05f38d2a61e29b5a9d24fc7a3906991ab92ecd58ff7e0eb4e339a4cc6b2c4fc4 //访问容器内部&#xff0c;Node01节点

微信小程序之WXSS模板样式、页面配置(.json)和网络数据请求

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Flutter 自定义AppBar实现滚动渐变

1、使用ListView实现上下滚动。 2、使用Stack&#xff1a;允许将其子部件放在彼此的顶部&#xff0c;第一个子部件将放置在底部。所以AppBar&#xff0c;写在ListView下面。 3、MediaQuery.removePadding&#xff1a;当使用ListView的时候发现&#xff0c;顶部有块默认的Padd…