上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码:

声明了一个char[]数组,变量名value,声明了一个int类型的变量hash(hash的作用我们后续会讲),话不多说,上代码:

我们点开构造函数看一下:

多年以前,我看到这段代码时我是懵逼的,没错,我现正在准备构造一个String的对象,那original这个对象又是从何而来?是什么时候构造的呢?

在Java中,当值被双引号引起来(如本示例中的"abc"),JVM会去先检查看一看常量池里有没有abc这个对象,如果没有,把abc初始化为对象放入常量池,如果有,直接返回常量池内容。下图是预先处理String str = new String("abc")的参数"abc"

接下来处理new关键字,在堆内存中开辟空间,由于hash这个字段是int类型的,成员变量初始化默认值为0。

处理构造函数逻辑,hash是值类型,直接赋值,数组为引用类型,直接指向地址。

继续上图

最后执行String str2 = new String("abc"),结果如下图:

利用IDE的debug功能看一下,char数组里已经有了'a','b','c'这些值。

下面我们来看一下String这个类下面这些常用的API是如何实现的:

很简单对吧,可怕的不是源码难读,而是不想,害怕去读源码的心。如果文章得到了你的认可,请为我的文章点赞,你的赞同是我继续下去的动力。

注:文中的图,只是画对象在JVM中大致的样子,以方便大家理解。如果大家想更深层次的研究JVM,推荐大家看深入理解java虚拟机一书。

如果喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也可以在评论区留言想了解的内容,有机会本专栏会做讲解,最后别忘了关注一下我。

上一篇:Java中的数组 - Java那些事儿

下一篇:Java基本数据类型和引用类型 - Java那些事儿

转载无限欢迎,但请注明「作者」和「原文地址」。转载请在文中保留此段,感谢您对作者版权的尊重。如需商业转载或刊登,请联系作者获得授权。

String是一个很普通的类 - Java那些事儿相关推荐

  1. 普通的java类型是指,String是一个很普通的类 - Java那些事儿

    上一篇我们讲了Java中的数组,其实是为本章的内容做准备的,String这个类是我们在写Java代码中用得最多的一个类,没有之一,今天我们就讲讲它,我们打开String这个类的源码: 声明了一个cha ...

  2. 一个很艰难的 Java 核心面试问题!

    一个很艰难的 Java 核心面试问题,这个 Java 问题也常被问: 什么是线程安全的单例,你怎么创建它. 好吧,在Java 5之前的版本, 使用双重检查锁定创建单例 Singleton 时,如果多个 ...

  3. 写一个楼房盘类java语言编写_Java开发每日复盘2018_0514

    今天主要跟大家分享3个部分: 一.「Java的核心机制」 二.「Java命名规范」 三.「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言 ...

  4. java treelist 排序_一个很好的Java排序列表

    我正在寻找Java的良好排序列表.到处搜寻可以给我一些有关使用TreeSet / TreeMap的提示.但是这些组件缺少一件事:随机访问集合中的元素.例如,我想访问排序集中的第n个元素,但是使用Tre ...

  5. java三角形判断器_花了两个小时做了那么一个很丑的Java写的三角形判断器.........

    闲着无事,花了两三个小时做了那么一个自己都看不下去的Java小程序,可用来判断三角形的类型,输入三边,可以求出各个角的正弦.余弦以及正切值! 说实话,丑得连自己都看不下去了! (不喜勿喷! ) 话不多 ...

  6. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  7. java如何创造一个整数的类_【技术干货】Java 面试宝典:Java 基础部分(1)

    原标题:[技术干货]Java 面试宝典:Java 基础部分(1) Java基础部分: 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的 ...

  8. java notify视频_一个很好的小例子来演示java中的wait()和notify()方法

    任何人都可以在 java中为我提供一个很好的小例子演示wait()和notify()功能.我尝试使用下面的代码,但它没有显示我的预期. public class WaitDemo { int i = ...

  9. jni调用java类_JNI之C++调用Java类 —— java.lang.String

    JNI之C++调用Java类 -- java.lang.String 为什么要用C++调用Java类?很难回答,写着文章只是觉得JNI很有意思.于是开始编写一段使用VC++在Windows系统里调用j ...

最新文章

  1. 选择PHP,选择自由与开源
  2. 热评一箩筐——《黑客攻防技术宝典》
  3. 自学MVC——添加一个控制器
  4. 计算机网络(六)-传输介质
  5. linux脚本获取usb设备,Linux基于USB端口执行脚本
  6. mysql 5.7 root password 过期
  7. JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件
  8. 被哥哥巨额索赔56亿?贾跃亭回应:40多亿为联合担保
  9. 继苹果亚马逊之后 微软加入1万亿美元市值俱乐部
  10. TensorFlow YOLO3
  11. android文件搜索广播,Android 实现无网络传输文件
  12. 怎样为Mac视频添加音频
  13. AVDictionary结构体相关源码介绍
  14. 计算机英语形成性考核册,开放英语1形成性考核册答案(中央广播电视大学外语部)doc...
  15. asp.net 邮件功能
  16. 如何把语音转换成文字呢?
  17. python中pip下载的代理设置
  18. 欧盟非个人数据流动监管新进展
  19. module java.base does not “opens java.lang“ to unnamed module @1c7696c6
  20. 站长说说之SEO中浅谈如何做好新闻类网站的优化

热门文章

  1. UA MATH567 高维统计II 随机向量11 kernel的构造 用内积替换反三角函数
  2. UA MATH567 高维统计II 随机向量2 各向同性的随机向量
  3. Oracle sqlplus 各种登录方式
  4. C语言a+++b的问题
  5. 3d max 安装和导入rvt模型失败
  6. 很多优秀的软件公司和开发者为什么愿意开源和共享?
  7. 突发:ORA-12541:TNS:无监听程序 的调查解决方法(监听日志已满导致)
  8. windows计划任务启动bat执行java文件
  9. sql express 会提供iis 服务
  10. 自己写一个树形导航菜单