热门标签 | 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}
}

图解:


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
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社区 版权所有