Java

Java

工具

基础工具:

appletviewer	Run and debug applets without a web browser.
extcheck	    Utility to detect Jar conflicts.
jar	            Create and manage Java Archive (JAR) files.
java	        The launcher for Java applications. In this release, a single launcher is used both for development and deployment.
javac	        The compiler for the Java programming language.
javadoc	        API documentation generator.
javah	        C header and stub generator. Used to write native methods.
javap	        Class file disassembler
jdb	            The Java Debugger.
jdeps	        Java class dependency analyzer

监控工具:

jps	    Experimental: JVM Process Status Tool - Lists instrumented HotSpot Java virtual machines on a target system.	
jstat	Experimental: JVM Statistics Monitoring Tool - Attaches to an instrumented HotSpot Java virtual machine and collects and logs performance statistics as specified by the command line options.	
jstatd	Experimental: JVM jstat Daemon - Launches an RMI server application that monitors for the creation and termination of instrumented HotSpot Java virtual machines and provides a interface to allow remote monitoring tools to attach to Java virtual machines running on the local system.	

问题定位工具:

jinfo	    Experimental - Configuration Info for Java - Prints configuration information for a given process or core file or a remote debug server.	
jhat	    Experimental - Heap Dump Browser - Starts a web server on a heap dump file (for example, produced by jmap -dump), allowing the heap to be browsed.	
jmap	    Experimental - Memory Map for Java - Prints shared object memory maps or heap memory details of a given process or core file or a remote debug server.	
jsadebugd	Experimental - Serviceability Agent Debug Daemon for Java - Attaches to a process or core file and acts as a debug server.	
jstack	    Experimental - Stack Trace for Java - Prints a stack trace of threads for a given process or core file or remote debug server.	

管理工具:

jcmd	    JVM Diagnostic Commands tool - Sends diagnostic command requests to a running Java Virtual Machine.	
jconsole	A JMX-compliant graphical tool for monitoring a Java virtual machine. It can monitor both local and remote JVMs. It can also monitor and manage an application.

类初始化

生命周期:

  • 加载(Loading)
    • 通过类的完全限定名称获取定义该类的二进制字节流。
    • 将该字节流表示的静态存储结构转换为方法区的运行时存储结构。
    • 在内存中生成一个代表该类的 Class 对象,作为方法区中该类各种数据的访问入口。
  • 验证(Verification),确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
  • 准备(Preparation),为类变量(被 static 修饰)分配内存并设置初始值(非定义值),使用的是方法区的内存。
  • 解析(Resolution),将常量池的符号引用替换为直接引用的过程。
  • 初始化(Initialization)
    • 执行类构造器 () 方法
    • 父类的 () 方法先执行
    • 包括所有类变量的赋值动作和静态语句块中的语句
    • 顺序由语句在源文件中出现的顺序决定,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。
    • 初始化时机:
      • 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时
      • 使用 java.lang.reflect 包的方法对类进行反射调用的时候
      • 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化
      • 当虚拟机启动时,虚拟机会先初始化这个主类
  • 使用(Using)
  • 卸载(Unloading)

初始化顺序:

普通类:

  • 静态变量
  • 静态代码块
  • 普通变量
  • 普通代码块
  • 构造函数

带继承的子类:

  • 父类静态变量
  • 父类静态代码块
  • 子类静态变量
  • 子类静态代码块
  • 父类普通变量
  • 父类普通代码块
  • 父类构造函数
  • 子类普通变量
  • 子类普通代码块
  • 子类构造函数

带抽象的实现子类: 接口 - 抽象类 - 实现类

  • 接口静态变量
  • 抽象类静态变量
  • 抽象类静态代码块
  • 实现类静态变量
  • 实现类静态代码块
  • 抽象类普通变量
  • 抽象类普通代码块
  • 抽象类构造函数
  • 实现类普通变量
  • 实现类普通代码块
  • 实现类构造函数

接口:

  • 声明的变量都是静态变量并且是final的,所以子类无法修改,并且是固定值不会因为实例而变化
  • 接口中能有静态方法,不能有普通方法,普通方法需要用defalut添加默认实现
  • 接口中的变量必须实例化
  • 接口中没有静态代码块、普通变量、普通代码块、构造函数

类加载器:

两个类相等,需要类本身相等,并且使用同一个类加载器进行加载。

  • 启动类加载器(Bootstrap ClassLoader)
  • 扩展类加载器(Extension ClassLoader)
  • 应用程序类加载器(Application ClassLoader)

双亲委派模型:

  • 除了顶层的启动类加载器外,其它的类加载器都要有自己的父类加载器。
  • 一个类加载器首先将类加载请求转发到父类加载器,只有当父类加载器无法完成时才尝试自己加载。
  • 使得基础类得到统一

泛型

也称泛型类型,是一种类型参数化的类或接口,可以通过为泛型类型分配一个类型,将用分配的具体类型替换泛型类型

无法将原始类型用于泛型;只能使用引用类型。

泛型类:

public class GenericContainer<T> {
    private T obj;

    public GenericContainer(){
    }

    // Pass type in as parameter to constructor
    public GenericContainer(T t){
        obj = t;
    }

    /**
     * @return the obj
     */
    public T getObj() {
        return obj;
    }

    /**
     * @param obj the obj to set
     */
    public void setObj(T t) {
        obj = t;
    }
}

泛型方法:

public static <N extends Number> double add(N a, N b){
    double sum = 0;
    sum = a.doubleValue() + b.doubleValue();
    return sum;
}   

类定义中的尖括号之间是类型参数部分,T 是与此类中定义的泛型类型关联的参数

采用<T, S>形式,标识多种泛型类型

好处:

  • 更强的类型检查
  • 消除类型转换
  • 定制泛型算法

标准类型参数建议:

E:元素
K:键
N:数字
T:类型
V:值
S、U、V 等:多参数情况中的第 2、3、4 个类型

有界:

  • <T extends UpperBoundType>,上限类型
  • <T super LowerBoundType>,下限类型
  • 问号 (?) ,表示未知类型,可用于参数、字段、局部变量和返回类型

集合框架(JCF)

核心接口:

alt

主要实现:

alt

具体类

Set:元素唯一

  1. HashSet - 唯一,无序。(哈希表)
  2. TreeSet - 唯一,自然序。(红黑树)
  3. LinkedHashSet - 唯一,插入序。(哈希表+链表)

List:元素可相同,有序

  1. ArrayList - (数组)
  2. LinkedList - (双向链表)

Queue和Deque:队列,FIFO

  1. ArrayDeque - Deque(数组).
  2. LinkedList - Queue和Deque(链表).
  3. PriorityQueue - Queue(小顶堆).

Map:键值对

  1. HashMap - 无序(哈希表).
  2. TreeMap - 自然序(红黑树).
  3. LinkedHashMap - 插入序(哈希表+链表).

工具类

  1. Arrays:对数组(数据类型[])进行各种操作。例如,排序、查找、复制等
  2. Collections:对集合类(Collection的子类)进行操作。例如,排序等。

辅助类

Iterators:

  1. Iterator - 单向迭代器.
  2. ListIterator - 双向迭代器.

Ordering:

  1. Comparable - 自然序,内部重写compareTo.
  2. Comparator - 排序规则,作为策略外部传入.

参考: