`

(译)8幅图带你了解Java

 
阅读更多

        前言:偶然间发现一个学习java的网站:http://www.programcreek.com/java-tutorials/,虽然是英文的,但是静下心来看并不难懂,很是言简意赅,上面点击量最大的一篇文章:以8幅图阐述八个java基本概念,深刻体会到一幅图胜过千言万语

本篇文章重点关注以下问题:

  • String对象不可改变的特性
  • hashCode()与equals()方法协作约定
  • Java 异常类层次结构
  • 集合类层次结构关系
  • 锁——Java同步的基本思想
  • Java对象引用处理机制
  • Java 对象在堆中的内存结构
  • JVM 运行时数据区

1. String对象不可改变的特性

  下面以三幅图展示String的不可变特性:

1.1 声明一个String类型

String s = "abcd";

         变量str存储字符串对象的引用,下面的箭头应该被解释为“存储String对象'abcd'的引用”。

1.2 将一个字符串变量赋值给另一个String变量 

String s2 = s;

        s2存储与s1相同的引用值(可以理解为地址),因为它是相同的字符串对象。

1.3 字符串拼接concat

s = s.concat("ef");

        s现在存储新创建的字符串对象的引用。

2. hashCode()与equals()方法协作约定

        HashCode(哈希编码,散列码)旨在提高性能。 equals()和hashCode()必须满足:

  1. 如果两个对象相等,则它们必须具有相同的哈希码。
  2. 如果两个对象具有相同的哈希码,则它们可能相同也可能不相等。
  查找顺序:hashcode() -> equals(),都匹配则为同一个对象。

3. Java异常类层次结构

        红色是受检异常(程序必须检查、处理的异常),此异常必须必须在方法中处理或在方法后面throws,以期待上级处理。

4. 集合类层次结构 

        注意Collections和Collection之间的区别。


 

 5. Java同步

        Monitor可以视为包含特殊房间的建筑物。 特殊的房间一次只能由一个客户(线程)占用。 房间通常包含一些数据和代码。

   如果客户想要占用特别的房间,他必须先进入走廊排队(Hallway)等待。 调度程序将根据某些标准(例如FIFO)选择一个。 如果他由于某种原因被暂停,他将被送到等候室(wait room),并计划在之后重新进入特别的房间。 如上图所示,这栋楼有3间房间。

       简而言之,Monitor是监视线程访问特殊房间的设施。 它确保只有一个线程可以访问受保护的数据或代码。

 6. Java对象引用处理机制

       别名是指多个引用指向同一个内存地址(对象实际地址,可以理解为这就是对象),甚至这些引用的类型完全不一样。

        a和b指向了同一个物理地址。 在运行时,多态特性根据真实的对象类型决定调用父类还是子类的具体方法,而不是根据引用变量的类型.

7. Java堆和栈

          该图显示了运行时,方法和对象在内存中的存储位置。

   绝大多数情况下:对象(及其属性域)都保存在堆里面,而方法的参数,局部变量(引用,以及6种基本类型)保存在栈里面。当然,极特殊的情况下(极度优化[对象入栈],常量池[String],静态变量[方法区]等)也会打破这个潜规则。

8. JVM运行时数据区域

       上图显示了整个JVM运行时数据区域。

 8.1 每个线程的数据区(不共享)

       每个线程的数据区域包括程序计数器JVM堆栈本机方法堆栈。 当创建新线程时,它们都将随之创建,线程销毁,也随之消失。

  • 程序计数器:用于控制每个线程的执行,记录当前线程的执行到哪;
  • JVM堆栈:线程执行就是不断入栈、出栈的过程;如下图所示
  • 本地方法堆栈:用于支持本机方法,即非Java语言方法。

8.2 所有线程共享的数据区域

       所有线程共享堆和方法区:

  • 堆:堆是我们最常处理的区域。 它存储在JVM启动时创建的数组和对象。 垃圾收集在这方面工作。
  • 方法区:方法区域存储运行时常量池,字段和方法数据,以及方法和构造函数代码。
  • 运行时常量池: 每一个类或者接口,在其编译后生成的.class文件中,有一个部分叫做常量表(constant_pool_table),JVM将class文件加载以后,就解析常量表的内容到运行时常量池。 包括编译时方法中就明确可知的数字值,String值,以及必须在运行时解析的属性域引用(field reference)。

  如上图所示,JVM栈(Stack)由一个个的栈帧(Frame)组成,当一个方法被调用时会自动压入一个栈帧到Stack中, 每个栈帧(frame)由局部变量区(Locol Variable Array),操作数栈(Operated Stack),以及对常量(池)(Reference to Constant Pool)的引用组成.

  • 大小: 17.7 KB
  • 大小: 31.3 KB
  • 大小: 30.4 KB
  • 大小: 18.9 KB
  • 大小: 117.7 KB
  • 大小: 41.1 KB
  • 大小: 75 KB
  • 大小: 10.3 KB
  • 大小: 13.6 KB
  • 大小: 3 KB
  • 大小: 17.4 KB
  • 大小: 55.2 KB
  • 大小: 12.3 KB
分享到:
评论

相关推荐

    James Gosling,Bill Joy,Guy Steele 等 著;陈昊鹏 译 Java语言规范 (基于 Java SE 8).pdf

    3. **接口的默认方法**:Java 8允许在接口中定义带有实现的方法,称为默认方法,这使得接口可以提供默认行为,而无需强制实现类去覆盖。 4. **Stream API**:这是一个用于处理集合的新API,提供了丰富的操作,如...

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    尽管描述中提到内容为图片形式,但我们可以从其主题和标签中提炼出许多关于JVM的重要知识点。 1. **Java虚拟机(JVM)概述**:JVM是Java平台的核心组成部分,它负责执行字节码,为Java提供跨平台的运行环境。JVM的...

    java 调用 google 翻译工具类

    2. **添加依赖**:在你的Java项目中,你需要引入Google Cloud Translation API的客户端库。如果你使用Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>com.google.cloud</groupId> <artifactId>...

    Java语言程序设计(基础篇)资料

    本资料出自梁勇与戴开宇译的《Java语言程序设计》第十版,是一份深入浅出的Java入门教程。在"book10ebychapters"这个压缩包中,我们可以期待找到按章节划分的书本内容,这将帮助学习者逐步掌握Java编程的核心知识。 ...

    麻省理工大学java 课件MIT(已译成中文)

    8. **多线程**:了解并发编程,包括线程的创建、同步和通信,以及如何使用Java的并发库来提高程序的效率。 9. **网络编程**:Java的Socket编程,以及如何创建客户端和服务器端应用程序进行网络通信。 10. **JVM与...

    Java教学大纲总结

    掌握 JAVA 的 JDK 开发环境和系统配置,能够使用面向对象思想进行程序设计,掌握图形用户界面的设计方法,掌握 Applet 技术,掌握异常处理技术,了解线程机制、IO 流、网络通信技术等,并了解使用 JDBC、Java Bean、...

    Practical Java (侯捷 刘永丹译-超星版

    《Practical Java》是由侯捷和刘永丹翻译的超星版书籍,旨在...通过学习《Practical Java》,读者不仅能掌握Java编程语言的基本技能,还能了解到如何在实际项目中有效地应用这些技能,从而成为一名合格的Java开发者。

    java语言程序设计基础篇李娜译答案

    Java语言程序设计基础篇是学习Java编程的入门教材,由李娜翻译,主要涵盖了Java语言的基础概念、语法和编程实践。这份压缩包包含了书中的所有章节课后习题及编程题偶数题的答案,对于初学者来说是一份非常有价值的...

    java网络编程朱江涛译

    在Java网络编程领域,我们首先要了解的是基础概念,包括TCP/IP协议栈、套接字(Socket)编程、服务器端与客户端通信等。TCP/IP协议栈是互联网通信的基础,它定义了数据在网络中的传输方式。Java的Socket类和...

    Java语言程序设计(基础篇+进阶篇)第六版 答案(不含编程题)

    8. **多线程**:了解线程的基本概念,如何创建和管理线程,以及同步与互斥。 9. **接口与抽象类**:理解接口的作用,如何定义接口和实现接口,以及抽象类的区别与应用。 10. **枚举与注解**:介绍Java中的枚举类型...

    Java + MongoDB 实现 hello world 例子(译)

    记住,了解MongoDB的数据模型(如文档、集合、数据库)以及Java驱动程序提供的不同方法,是成为Java + MongoDB开发者的关键。此外,熟悉NoSQL的概念,如水平扩展、分片和复制集,也是至关重要的。不断实践和探索,你...

    侯捷译 thinking-in-java 2+J2SE实验手册

    《Thinking in Java》是Bruce ...无论你是初学者还是有经验的开发者,都能从中受益匪浅,进一步提升你的Java编程能力。通过阅读书籍和实践操作,你将能掌握Java的核心技术和最佳实践,为未来的软件开发奠定坚实基础。

    Java 反 编 译 软 件

    Java反编译软件是开发人员在特定情况下使用的工具,它能够将已经编译好的Java字节码(.class文件)转换回源代码形式,以便于查看或理解代码逻辑。这在进行逆向工程、调试、学习他人代码或者修复旧代码时非常有用。...

    [Java程序设计实用教程(第5版)][叶核亚][电子教案(PPT版本)].zip

    7. **函数式编程**:了解Java 8引入的Lambda表达式和Stream API,如何进行函数式编程,提高代码的简洁性和效率。 8. **泛型**:学习泛型的概念,了解其在类、接口和集合中的应用,以及通配符的使用。 9. **网络...

    jd-gui Java 反译器

    **Java 反编译器——jd-gui** Java反编译器是开发人员在处理已编译的.class或.jar文件时的重要工具,主要用于查看和理解Java字节码的原始源代码。JD-GUI是一个功能强大且用户友好的Java反编译器,它允许开发者将已...

    java反编译工具用于.class文件编译成.java文件

    首先,了解Java编译过程是理解反编译的前提。Java源代码(.java文件)经过Java编译器(javac)编译后,会生成Java字节码(.class文件),这是一种中间语言,能在Java虚拟机(JVM)上运行。字节码不包含原始的源代码...

    Java版词典源码

    Java版词典源码是一个基于Java编程语言实现的简单应用,它允许用户通过命令行界面查询英语单词的汉语释义。这个项目是一个测试版本,专为英汉词典的查询功能设计,尤其适合那些对Java编程和词典应用开发感兴趣的学习...

    Manning.Java.Persistence.with.Hibernate[Hibernate实战第二版].pdf

    《Java Persistence with Hibernate》是Java开发领域中一本极具...通过阅读这本书,你可以掌握如何利用Hibernate来构建高效、可维护的Java应用程序,同时也能了解到JPA的相关知识,使你在Java持久化领域变得更加专业。

    Java code Java code

    接下来,我们需要了解Java的主要组成部分:JVM(Java虚拟机)、JRE(Java运行环境)和SDK(Java开发工具包)。JVM负责解释和执行Java字节码,保证了Java的跨平台特性。JRE是Java程序运行所必需的环境,包括JVM和Java...

Global site tag (gtag.js) - Google Analytics