Java常量池

概念

什么是常量

用final修饰的成员变量表示常量,值一旦给定就无法改变!

final修饰的变量有三种:静态变量实例变量局部变量,分别表示三种类型的常量。

Class文件中的常量池

在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。

阅读更多

12种Java中常用的语法糖

什么是语法糖

语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。

解语法糖

前面提到过,语法糖的存在主要是方便开发人员使用。但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。说到编译,大家肯定都知道,Java语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。如果你去看com.sun.tools.javac.main.JavaCompiler的源码,你会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖的实现的。Java 中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。

糖块一: switch 支持 String 与枚举

从Java 7 开始,switch 开始支持 String。其实Java中的switch自身原本就支持基本类型。比如int、char等。对于int类型,直接进行数值的比较。对于char类型则是比较其 ascii 码。

阅读更多

Java虚拟机类加载机制

概述

虚拟机把描述类的数据从 Class 文件加载到内存,井对数据进行校验、转换解析初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。

类加载的时机

类从被加载到虚拟机内存中开始,到卸栽出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载七个阶段。其中验证、准备和解析三个部分统称为连接。

加载

加载是类加载过程中的一个阶段,这个阶段虚拟机要完成3件事。

阅读更多

Java自动内存管理机制

Java内存区域与内存溢出异常

概述

对于Java程序员来说,有虚拟机的自动内存管理机制,不再需要像C++那样为每个new操作去写配对的delete/free代码。但正因如此,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是如何使用内存的,那排查错误将会变得异常困难。

运行时数据区域

Java虚拟机在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。


阅读更多

Java多线程

简介

程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。

进程:执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。

线程:通常在一个进程中可以包含若干个进程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。

多线程:多条执行路径,主线程和子线程并行交替执行。很多多线程是模拟出来的,真正的多线程是指有多个CPU,即多核,如服务器。如果是模拟出来的多线程,即在一个CPU的情况下,在同一个时间点,CPU只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。

阅读更多

Java 注解与反射

注解 Annotation

作用

  • 对程序作出解释(类似于注释)
  • 可以被其他程序读取(如:编译器等)

使用方式

  • 注解以 “@注释名” 形式存在,如 “@Override”,有些可以添加一些参数值,如 “@SuppressWarnings(value=”unchecked”)”
阅读更多

静态代码块,构造代码块,构造函数及其执行顺序和逻辑

静态代码块:

  1. 随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
  2. 静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
  3. 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
  4. 一个类中可以有多个静态代码块(顺序由上至下)。

构造代码块

  1. 构造代码块的作用是给对象进行初始化。
阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×