Java基础之String深入解析


以下是本文目录大纲

  1. 生成地方和地址指向,intern()方法
  2. String可否被继承?

1. 生成地方和地址指向,intern()方法


先看代码

     String s1 = new String("abc");String s2 = "abc";String s3 = new String("abc");System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s2 == s3);

问题:

  1. s1,s2,s3分别在哪?生成了几个对象?
  2. 结果是什么?

先看程序运行的结果

false
false
false

解析:

  • String s1 = new String("abc");
    "abc" 会在字符串常量池里面生成一个字符串abc
    new String("abc"); 会在堆里面生成 abc的对象
  • String s2 = "abc";
    由于"abc"在字符串常量池里,所以可以直接引用
  • String s3 = new String("abc");
    “abc” 先在常量池里找,找到了就不在常量池里生成了,但是
    new String("abc");会在堆里面再生成一个对象abc

画图如下:

结论:
1. 生成3个abc对象,一个在字符串常量池里,两个在堆里
2. 结果如上


扩展加强

先看代码

 String s1 = new String("abc");String s2 = "abc";String s3 = new String("abc");System.out.println(s1 == s1.intern());System.out.println(s2 == s2.intern());System.out.println(s1.intern() ==s2.intern());

备注:当使用intern()方法时,查询字符串常量池是否存在当前字符串,若不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。


问题:

  1. 结果是分别是什么?

解析:

  • s1.intern()返回常量池里中abc对象,s1是堆对象abc,所以false
  • 同理,s2,s2.intern()都指向字符串常量池中的对象abc,所以true
  • s1.intern()s2.intern()都指向字符串常量池中的对象abc,所以true

画图如下:


结论:

false
true
true


2. String可否被继承?


先看代码

     String s4 = "java";String s5 = "ja";String s6 = "va";System.out.println(s4 == "java");System.out.println(s4 == (s5 + s6));System.out.println(s4 == "ja" + s6);System.out.println((s5+s6)== "ja" + s6);

解析:

  • s4 == "java",都是常量池里的对象,返回true
  • (s5+s6)会在堆里面生成 “java”,所以s4 == (s5 + s6)返回false
  • 同理"ja" + s6也会在堆里面生成 “java”,所以(s5+s6)== "ja" + s6返回false
  • (s5+s6) == "ja" + s6 等号两边引用的对象虽然相同,但是生成的对象是不一样的,所以返回false

画图如下:

Java基础之String深入解析相关推荐

  1. Java基础之多态深入解析

    Java基础之多态深入解析 多态的基本概念 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性.简单的说:就是用基类的引用指向子类的对象. 多态的优点 消除类型之间的耦合关系 ...

  2. Java基础:String类

    相关阅读 Java基础:String类 Java字符串格式化 Java基础:正则表达式 1. 概述 字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组. 在实际开发中,字符串的操作 ...

  3. Java基础之String,StringBuilder,StringBuffer三者的区别

    Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...

  4. bytes数组转string指定编码_好程序员Java学习路线分享Java基础之string

    好程序员Java学习路线分享Java基础之string 好程序员Java培训 先来讲一下字符串 字串符分类: 不可变字符串:----String.字符串本身不能发生改变,与指向字符串的引用无关. St ...

  5. java基础-字符串String

    今天要介绍的知识点为String,也叫字符串.这是个应用的比较广泛并且充满神奇色彩的知识点.为什么说神奇呢?因为它涉及了好些个看起来高深莫测的概念.并且,这个知识点其实已经属于java中引用类型的知识 ...

  6. [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类

    引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...

  7. java基础(五) String性质深入解析

    引言   本文将讲解String的几个性质. 一.String的不可变性   对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了.然而,String对象一经创 ...

  8. string 中的offset_【Java基础】String常量的长度有限制吗?

    备注:JDK版本:1.8.0 最近同事问了我一个问题,String常量有长度限制吗? 为什么会问起这个问题呢,因为同事在开发中确实遇到了IDEA编译器编译过程中提示字符串常量过长的异常.异常的出现也就 ...

  9. java string == 比较,Java 基础 之 String 的比较

    String是我们使用最频繁的一个类,在我们的日常开发中String对象的比较也是最为常见的.当然也是面试和笔试经常会被问到的的一个知识点.今天我们就来总结一下String对象的比较以及常被考的几个函 ...

最新文章

  1. 考csp所需算法_CSP vs RxJS:您所不知道的。
  2. sentinel 时间窗口_Sentinel使用令牌桶实现预热【原理源码】
  3. linux文件层级、目录、文件基本操作介绍
  4. 文件下载乱码问题分析与解决
  5. CANN 5.0硬核技术抢先看
  6. excel自定义函数添加和使用方法
  7. 贪心算法详解(C++)
  8. 如何学好C语言程序设计?
  9. opta球员大数据预测胜负_大数据预测4个特征,10个典型行业
  10. Python压缩解压–gzip
  11. Installing VMware Tools, please wait解决办法
  12. flask-uploads
  13. matlab实现多目标测试集ZDT、DTLZ、MOP的最优理论前沿
  14. 各种光纤接口类型介绍
  15. Unity实现功能之局域网实时语音
  16. TI的单芯片毫米波雷达传感器配置命令是如何传递到DSP和ARM核的?(串口程序代码走读)
  17. 管理经济学-使用Python和Z3求解本量利分析
  18. 使用python为Excel插入附件
  19. Maven项目Dependencies常见报错及解决方案
  20. 黑皮西瓜文案:黑皮西瓜水果的促销文案,黑皮西瓜水果店的文案怎么写

热门文章

  1. 同步异步阻塞非阻塞杂记
  2. 远程桌面退出全屏/不能全屏/全屏切换的技巧
  3. ZendStudio10.6.1如何安装最新的集成svn小工具?
  4. 【Android开发】消息处理类(Handler)与消息类(Message)介绍
  5. WP7 开发(九) WP7控件开发(六)-DeepZoom技术
  6. ruby 连接mysql数据库
  7. CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)
  8. ZOJ - 4122 Triangle City(最短路+欧拉通路+思维)
  9. 2019ICPC(上海) - Light bulbs(离散化+差分)
  10. java 异或_脚本语言系列之Java | Java中的运算符