热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

💗推荐阅读文章&

💗推荐阅读文章💗

  • 🌸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); // abcSystem.out.println(s2); // abcSystem.out.println(s3); // abcSystem.out.println(s1 == s2); // falseSystem.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}
}

图解:


推荐阅读
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
author-avatar
real存在尹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有