02_操作符

操作符

Java 中的操作符有很多,大概可以分成以下几种:

  • 关系操作符:>、<、>=、<=、==、!=
  • 逻辑操作符:!、&、|、&&、||
  • 条件操作符:?:
  • 算术操作符:-、++、–、+、-、*、/、%
  • 位操作符:~、&、|、^、<<、>>、>>>
  • 赋值操作符:=、+=、-=、*=、/=、&=、|=、^=、<<=、>>=、>>>=

 01_基本类型

基本类型

一、类型大小

在 Java 中,通过 new 生成的对象数据是存储在“堆”中,而基本类型则是直接把“值”保存在栈中。

Java 中每种基本类型所占用的存储空间大小都是确定的,不会随着机器硬件架构变化而变化。

  • 存储空间大小不变性,为Java的可移植性提供了很大的帮助

 03_解析class文件

解析class文件

Java 虚拟机规范中所指的 class 文件,并非特指位于磁盘中的 .class 文件,而是泛指任何格式符合规范的 class 数据。它实际上可以通过网络下载,从数据库加载,甚至是在运行中直接生成等方式来获取 class 文件。

  • 构成 class 文件的基本数据单位是字节,可以把整个 class 文件当成一个字节流来处理
  • 数据由连续多个字节构成,这些数据在 class 文件中以大端(big-endian)方式存储

为了描述 class 文件格式,Java 虚拟机规范定义了 u1、u2 和 u4 三种数据类型来表示1、2和4字节无符号整数。

 02_查找class文件

查找class文件

加载允许一个类,必须把它相关的依赖类也加载进来,比如父类、成员类等。

Java虚拟机规范并没有规定去哪里寻找类,所以不同虚拟机可以采用不同的方法。

一、类加载路径

Oracle的Java虚拟机是根据类路径(classpath)来搜索类,按照搜索顺序可分为3类:

  1. 启动类路径(bootstrasp classpath):默认目录是 jre\lib,即Java标准库(大部分在rt.jar里)所在位置
  2. 扩展类路径(extension classpath):默认目录是 jre\lib\ext,即Java扩展机制的类所在位置
  3. 用户类路径(user classpath):默认当前目录,即自己实现的类、以及第三方类库所在位置

 01_命令行工具

命令行工具

Java虚拟机启动时,需要指定类启动应用程序。

但是Java虚拟机规范中并没有明确规定,怎么指定类启动应用程序,也就是主类(包含main方法的类)。

Oracle的虚拟机实现是通过 java 命令来启动的,主类名由命令函参数指定。

1
2
3
4
java [-options] class [args]
java [-options] -jar jarfile [args]
javaw [-options] class [args]
javaw [-options] -jar jarfile [args]

 Stack

Stack

一、定义

1
2
public class Stack<E> extends Vector<E> {
}

Stack 继承自 Vector 类,因此拥有 Vector 的所有特性。

二、原理

Stack 除了增加几个栈特用的方法以外,其他的和 Vector 都一样,而增加的这几个方法,内部实际上也是调用的 Vector 的方法。

 Vector

Vector

一、定义

1
2
3
4
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
}

定义上和 ArrayList 一样,继承同一个父类和实现相同的接口。

二、实现原理

 PriorityQueue

PriorityQueue

一、定义

1
2
3
4
5
6
7
8
9
10
11
12
13
public class PriorityQueue<E> extends AbstractQueue<E>
implements java.io.Serializable {

public PriorityQueue(int initialCapacity,
Comparator<? super E> comparator) {
// Note: This restriction of at least one is not actually needed,
// but continues for 1.5 compatibility
if (initialCapacity < 1)
throw new IllegalArgumentException();
this.queue = new Object[initialCapacity];
this.comparator = comparator;
}
}

从名称就可以看出来,这是个优先队列,也就是按照从小到大(或从大到小)排序的队列。

 Hashtable

Hashtable

一、定义

1
2
3
4
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable {
}

Hashtable 继承了旧的父类 Dictionary,和新的接口 Map

二、实现

 LinkedList

LinkedList

一、定义

1
2
3
4
5
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
}

LinkedListArrayList 的定义有一些区别,LinkedList 是继承于 AbstractSequentialList 的,而 ArrayList 是直接继承于 AbstractList

LinkedList 的继承链多了一层 AbstractSequentialList