一:实例化字符串对象的两种方式的区别

这个知识点是面试中的一个经久不衰的问题,。也是一个比较麻烦的问题,对于许多同学来说也是难点,本次课我们会详细的分析。上次课说了创建字符串对象的两种方式:直接赋值(字面量创建对象)和使用构造方法创建。

这两种方式创建的字符串的在内存的分配.上是存在不同的,所以导致我们使用“==”进行字符串比较的时候存在差异。

DEMO:字面量创建字符串对象

在分析之前你要知道一-点, 如果比较两个对象使用“==”则比较的对象的内存地址。

以上输出的结果是true,也就是说s1和s2的指向是同一块内存空间。为什么两个“abcd”会在同一块内存空间呢?

在使用直接赋值的方式创建字符串的时候字符串对象是保存在-块叫做String常量池的空间中。在实例化字符串之前会先到String 常量池中查看要创建的字符串是否已经存在。

●Str ing s1=" abcd";//第- -行,会到常量池检测是否存在,目前不存在,则在String常量池中创建该对象并且返回引用赋值给s1。

●String s2="abcd"; //第二行,会到常量池中检测“abcd”是否存在,第一行创建了,所以存在,于是不再创建该字符串了,直接返回已经存在的“abcd"的引用给s2。

所以最后s1和s2都指向常量池中的“abcd”字符串对象。所以s1==s2输出的结果就是true。

DEMO:使用new关键字创建字符串对象

输出的结果是false,说明了s1和s2指向的不是同一个对象的内存地址,这是因为使用new关键字实例化字符串对象的特征决定的。

当使用new关键字实例化对象的时候:

●String s1=new String("abcd");//第一行, 先到常量池中查找是否有“abcd”,此时没有,则在常量池中创建-一个“abcd" 对象,之后再到堆内存中创建“abcd" 对象,返回的引用是堆内存中的“abcd”对象的内存地址,这个过程中一共创建了两个对象

●String s2=new String("abcd");//第二行,先到常量池中查找是否有“abcd”,此时有了,则不再到常量池中创建,只是在堆内存中创建-一个“abcd”对象。这个过程创建了一个对象。

所以最后的结果s1和s2指向的堆内存中的两个独立的字符串对象。所以s1==s2的值.false。以上的两个demo阐述了使用两种方式实例化的字符串的区别。思考问题: String 常量池在哪儿呢?

总结:

1、字面量创建对象:先到String常量池中查找是否存在,如果存在则直接返回引用,如果不存在则创建之后返回引用。

2、使用构造方法实例化对象:先到常量池中查找是否存在,如果存在则在堆内存中创建一个返回引用即可,如果不存在则在常量池中创建一个对象,之后再到堆内存创建一个内容相同的对象再返回引用。

以下是我整理的Java学习资料免费提供

这里的话我也将我之前在学习过程中用到的一些学习资料整理成了文档,以及我自身之前的一个面试文案和知识点补充,有需要的朋友可以加我的QQ学习交流群   697888503   ,这里也希望大家最终都能够学有所成,学习编程不是一天两天的功夫,勤能补拙才是硬道理,祝大家最终都能成为一名合适开发攻城狮。

java实例化字符串两种方式区别相关推荐

  1. Java连接Oracle两种方式thin与oci区别

    Java连接Oracle两种方式thin与oci区别 前几天同事跑过来跟我说, 机房中的一台tomcat服务器跟oracle数据库机连接很慢,查看控制台中的hibernate日志, 基本上是一条sql ...

  2. Java技术分享:升级所安装Java版本的两种方式

    在进行Java开发的时候我们可能会需要升级所安装的Java版本,那么你知道应该如何安装吗?小千今天就来给大家介绍两种方式. 一.卸载掉原本安装的Java,下载最新安装包安装即可. 这个步骤就不介绍了, ...

  3. Linux之Ubuntu20.04安装Java JDK8的两种方式

    Linux之Ubuntu20.04远程安装Java JDK8的两种方式 安装openjdk8 更新软件包列表: sudo apt-get update 安装openjdk-8-jdk: sudo ap ...

  4. Java 分页,两种方式的分页,即取即用的代码,不客气

    两种方式,一种是currentPage + pageSize, 一种是limit + offset (limit + offset 这个逻辑太恶心,边缘测试很麻烦) 第一种(currentPage + ...

  5. python模块的导入的两种方式区别详解

    Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...

  6. Java练习:两种方式求1+1/2!+1/3!+1/4!+...前20项的和、用for,while,do-while分别实现1+1/2!+1/3!+1/4!+...前20项的和

    Java两种方式求 1+1/2!+1/3!+1/4!+... 前20项的和: 感叹号 !是阶乘的意思,如 2! .3! .4! 分别是:1*2 . 1*2*3 .1*2*3*4  第一种算法,如下代码 ...

  7. Java异常处理的两种方式

    异常处理方式一:在当前方法中直接用try-catch处理 异常处理方式二:在当前方法中不处理,throws 异常抛给调用者处理 一. try-catch的方式就是捕获异常. try:该代码块中编写可能 ...

  8. DNS有哪两种域名解析方式?简述这两种方式区别和特点。

    DNS的两种域名解析方式:分布域名解析:集中式域名解析 区别及特点: 1.分布域名解析 是指分在客户端上维护一个静态的文本文件,其中包含主机名和IP地址的映射.随着网络规模的扩大,分布式分辨率的有效性 ...

  9. jsp中头的导入两种方式区别

    1.<jsp:include page="top.jsp">先将top.jsp中的java脚本和jsp指令执行完毕以后再讲top.jsp页面加入面中 2.<%@ ...

最新文章

  1. java 反射 速度_Java反射获取实例的速度对比分析
  2. 模块化以及requirejs和seajs
  3. Django 3.2.5博客开发教程:实现网站首页
  4. 八、后台与数据库(IVX 快速开发教程)
  5. Android 第一篇
  6. 剑指Offer - 面试题32 - I. 从上到下打印二叉树(按层BFS遍历,queue)
  7. flexible.js淘宝移动端rem自适应用法
  8. Flask实现分页功能
  9. Ubuntu20.04安装WPS
  10. AutoJs学习-几个QQ群脚本(群引流\提取成员\加群友\加群)
  11. php探针不显示ip,php探针代码_PHP探针获取客户端信息
  12. 基于MATLAB的柱状图画法及特殊柱状图画法总结
  13. 传感器实验——火焰传感器
  14. 聊聊精密测量仪器的气源维护知识
  15. html 调用safari,如何从托管在Web浏览器控件中的HTML中打开Safari中的链接?
  16. 图像质量评估指标(3) 特征相似度FSIM
  17. 详解【java实现】编写一个程序,从键盘读入一段英文(多行),找出其中所有的英文单词,统计每个单词出现的次数,并按照单词出现次数由大到小排序后输出。
  18. IOS 个人证书的申请
  19. springboot整合 neo4j (OGM+JPA方式操作图数据库)
  20. Facebook联合创始人Chris Hughes呼吁该公司进行分拆

热门文章

  1. linux查看用户bashrc,Linux中.bashrc用户环境文件详解
  2. 关于数据分析那些事,看这一篇就够了
  3. python爬取ZOL桌面壁纸图片
  4. 如何搭建一个电商社区?
  5. Github中一些有趣的emoji表情大全
  6. mt4如何修改服务器,mt4怎样修改服务器地址
  7. springboot 网页授权微信登录
  8. 如何成为一名合格的软件架构师-成长指南
  9. 设计模式——外观(门面)模式 ,即包装
  10. C#上位机 3.常用控件和上位机界面设计