你来看看这几行代码到底创建了几个字符串?

news2025/7/18 18:08:35

💗推荐阅读文章💗

  • 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》
  • 🌺MySQL系列🌺👉2️⃣《MySQL系列教程》
  • 🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》
  • 🌻SSM框架系列🌻👉4️⃣《SSM框架系列教程》

🎉本博客知识点收录于🎉👉🚀《JavaSE系列教程》🚀—>✈️07【Java核心API-01】✈️

文章目录

    • 6.3 常量池
      • 6.3.1 String字符串的比较
      • 6.3.2 字符串的创建
        • 1)例1:
        • 2)例1:
        • 3)例2:
        • 4)例3:
      • 6.3.3 字符串的比较练习
      • 6.3.4 intern方法

6.3 常量池

常量池也是JVM中的一块内存区域,在JDK1.6及以前,这时的方法区也被成为永久代;常量池是存储在方法区的,在JDK1.7之后,常量池被划分到了堆内存。

6.3.1 String字符串的比较

创建字符串的方式有很多种,不同的方式创建的字符串在内存中的表现形式是不一样的;因此我们在使用字符串做==比较时需要格外注意;因为==比较的是两个对象的内存地址值;

package com.dfbz.demo01;
/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo06 {
    public static void main(String[] args) {
        // 存储在常量池
        String s1 = "abc";
        // new的东西都存储在堆内存
        String s2 = new String("abc");
        // new的东西都存储在堆内存
        String s3 = new String("abc");
        System.out.println(s1);     // abc
        System.out.println(s2);     // abc
        System.out.println(s3);     // abc
        System.out.println(s1 == s2);     // false
        System.out.println(s2 == s3);     // false
    }
}

内存图解:

6.3.2 字符串的创建

我们之前就介绍过,String是一个不可变的字符序列,即字符串一旦创建就是不可变的;但我们在操作字符串时,字符串好像是可以拼接改变的,这究竟是怎么回事呢?
下列代码产生了几个字符串?

1)例1:

String s1="1";
s1="2";

答:2个,“1”、“2”;

2)例1:

String s1 = "10" + "1";

答:3个,“10”、“1”、“101”;并且3个都存储在常量池

3)例2:

String s1 = new String("abc");

答:2个,一个"abc"存储在常量池,另一个"abc"存储在堆内存;s1保存着堆内存中"abc"的引用;

4)例3:

String s1 = "10";
s1 += "1";			// s1=s1+"1";
  • 答:3个,“10”、"1"存储在常量池,"101"存储在堆内存,s1保存着堆内存中"101"的引用;

tips:任何与变量相加的字符串都会产生一个新字符串,存储在堆内存;


总结:字符串一旦创建了就不能改变,如果改变了那也是创建了一个新的字符串将其返回,再也不是原来那个字符串了;

6.3.3 字符串的比较练习

在字符串拼接时,只要是和变量相加,其结果都会产生一个新的字符串;
观察如下代码:

int i = 1;
String s1 = "10" + i;
String s2 = "10" + i;
System.out.println(s1 == s2);           // false


将变量换成常量:

String s1 = "10" + 1;		
String s2 = "10" + 1;
System.out.println(s1 == s2);           // true

  • 练习题:
package com.dfbz.demo01;
/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo08 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = "ab" + "c";
        String s4 = "ab" + new String("c");
        String s5 = new String("abc");
        String s6 = "a";
        String s7 = "bc";
        String s8 = s6 + s7;
        System.out.println(s1 == s2);       // true(都存储在常量池)
        System.out.println(s1 == s3);       // true(常量相加,生成的值也是在常量池,保留常量池中的引用)
        System.out.println(s1 == s4);       // false(只要是和变量相加,都会new出一份新的)
        System.out.println(s1 == s8);       // false(只要是和变量相加,都会new出一份新的)
        System.out.println(s4 == s5);       // false
    }
}

6.3.4 intern方法

  • public String intern():当调用intern方法时,如果常量池已经包含与equals()方法确定相当的字符串时(比较的是字符串内容而不是地址值),则返回来自常量池的字符串,否则将此字符串添加到常量池中并返回;

示例代码:

package com.dfbz.demo01;
/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo09 {
    public static void main(String[] args) {
        String s1 = "1" + new String("1");
        // 查看常量池是否有"11"这个字符串,如果没有,则将"11"存入常量池,并返回常量池的地址
        String s2 = s1.intern();
        String s3 = "11";
        System.out.println(s2 == s3);			// true
    }
}

图解:

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

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

相关文章

Java中对象的finalization机制

本篇文章我们详细介绍Java中对象的finalization机制,以及怎么使用finalize()方法,将即将被回收的对象,拉回来。1、finalization机制Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义…

Spring的Async注解线程池扩展方案

目录- [Spring的Async注解线程池扩展方案]- [目录]- [1. 扩展目的]- [2. 扩展实现]- [2.1 扩展Async注解的执行拦截器AnnotationAsyncExecutionInterceptor]- [2.2 扩展Async注解的Spring代理顾问AsyncAnnotationAdvisor]- [2.3 扩展Async注解的 Spring Bean 后置处理器AsyncAn…

Linux安装及管理应用和账号和权限管理 讲解

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

不系统学习NodeJs之进程线程

不系统学习NodeJs之进程线程 从工作期间断断续续接触Node,从去年的3月份、10月份、又到今年的3月份,终于又决定要再仔细看看Node的相关。 不系统学习的各种时期笔记&参考记录于此。 参考: Node.js 中文网 一篇文章构建你的 NodeJS 知识…

BIC高颜值在线绘图新增颜色集合本地存储功能

用户可以把自己选择的颜色集合存储在自己浏览器本地(鼠标滑过颜色名字可以显示具体代表哪些颜色和色号),供同一个工具的多套数据使用或者在不同工具之间共享颜色集合的使用,统一多张图一致的配色。最新访问地址:https://www.bic.ac.cn/BIC/ &…

JavaWeb—CSS

目录 1、CSS 技术 1.1、CSS 技术介绍 1.2、CSS 语法规则: 1.3、CSS 和 HTML 的结合方式 1.3.1、第一种: 1.&#xf…

Iterator 迭代器

迭代器 为了兼顾 各个子类的特性 实现无差别可以 访问数据 举个例子 遍历数组和遍历链表 两者代码的写法不一样 为了实现 使用相同的代码 对不同的数据容器进行遍历 就出现了 迭代器 for语句的执行和 interator的实现息息相关 目的 访问各个类型 集合 的数据&#xff…

Spring源码解析-Spring 循环依赖

Spring源码解析简图: Spring 如何解决循环依赖,⽹上的资料很多,但是感觉写得好的极少,特别是源码解读⽅⾯,我就⾃⼰单独出⼀ 篇,这篇⽂章绝对肝! 文章目录: 一. 基础知识 1.1 什么…

记录--elementui源码学习之仿写一个el-button

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇文章记录仿写一个el-button组件细节,从而有助于大家更好理解饿了么ui对应组件具体工作细节。本文是elementui源码学习仿写系列的又一篇文章,后续空闲了会不断更新并仿写其他…

Unity iOS 无服务器做一个排行榜 GameCenter

排行榜需求解决方案一(嗯目前只有一)UnityEngine.SocialPlatformsiOS GameCenterAppStoreConnect配置Unity 调用(如果使用GameCenter系统的面板,看到这里就可以了)坑(需要获取数据做自定义面板的看这里)iOS代码Unity 代码吐槽需求 需求:接入…

某某游戏加密坐标分析

这个游戏里面坐标有很多种存放方式。 例如明文存放的DOUBLE,加密的各种类型。 我们不知道哪一个对于我们是有用的,哪一些只是辅助UI或则掉到LUA虚拟机坑里的数据。 那就根据作用大小来决定,一一尝试吧。 最好去找修改之后有效果的地址,当然只是本地&…

记一次影视cms黑盒CSRF-RCE

俗话说得好,思路才是最重要,本文章主要提供思路,各位师傅在挖掘漏洞的时候说不定也能碰到类似的点1.思路:当我们在找可以构建csrf的时候,多找找可以提交上传图片的,部分是可以自由构建url如图:漏…

Python数据分析案例20——我国家庭资产影响因素分析

本次案例较为简单,符合人文社科、经济学管理学等专业本科生适用。 本文的数据来源于中国家庭金融调查(China Household Finance Survey,CHFS)是西南财经大学中国家庭金融调查与研究中心(下称中心)在全国范围…

后端快速上手Vue+axios

文章目录前言vue基础1.el:挂载点2.data:数据对象vue常见指令vue生命周期axiosvueaxios前言 面向后端人员,旨在快速熟悉Vue框架,更详细的以后再总结 (1)Vue的特性: JavaScript框架简化Dom操作响应式数据驱动 &#…

JWT详细介绍使用

一、JWT介绍 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务…

【经验分享】电路板上电就挂?新手工程师该怎么检查PCB?

小伙伴们有没有经历过辛辛苦苦,加班加点设计的PCB,终于搞定下单制板。接下来焦急并且忐忑地等待PCB板到货,焊接,验证,一上电,结果直接挂了... 连忙赶紧排查,找问题。最终发现,是打过…

学习笔记:基于SpringBoot的牛客网社区项目实现(二)之Spring MVC入门

1.1 函数的返回值为空,因为可以使用response对象向浏览器返回数据。声明了request对象和response对象,dispatcherservlet自动将这两个对象传入 RequestMapping("/http")public void http(HttpServletRequest request, HttpServletResponse re…

ReentranLock(可重入锁)

一、ReentranLock ReentranLock属于JUC并发工具包下的类,相当于 synchronized具备如下特点 ● 可中断 ● 可以设置超时时间 ● 可以设置为公平锁(防止线程出现饥饿的情况) ● 支持多个条件变量 与 synchronized一样,都支持可重…

浅析 SplitChunksPlugin 及代码分割的意义

本文作者为 360 奇舞团前端开发工程师起因有同事分享webpack的代码分割,其中提到了SplitChunksPlugin,对于文档上的描述大家有着不一样的理解,所以打算探究一下。Q:什么是 SplitChunksPlugin?SplitChunksPlugin 是用来…

Python所有方向的入门和进阶路线,20年老师傅告诉你方法

干了20多年程序员,对于Python研究一直没停过,这几天把我自己对Python的认知和经验,再结合很多招聘网站上的技术要求,整理出了Python所有方向的学习路线图,基本上各个方向应该学什么,都在上面了,…