(译)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)的引用组成.

猜你喜欢

转载自super-wangj.iteye.com/blog/2383936