Java多线程机制

一、线程的基本概念
1. 线程是一个程序内部的顺序控制流。
2. 线程和进程的区别
①每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
②线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
③多进程:在操作系统中能同时运行多个任务(程序)
④多线程:在同一应用程序中有多个顺序流同时执行
3. Java的线程是通过java.lang.Thread类来实现的。
4. VM启动时会有一个由主方法(public static void main() {})所定义的线程。
5. 可以通过创建Thread的实例来创建新的线程。
6. 每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。
7. 通过调用Thread类的start()方法来启动一个线程。

二、线程的创建和启动
1. 可以有两种方法创建新的线程
①第一种

1.定义线程类实现Runnable接口
2.Thread myThread = new Thread(target); //target为Runnable接口类型
3.Runnable中只有一个方法:
public void run();用以定义线程运行体。
4.使用Runnable接口可以为多个线程提供共享的数据。
5.在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
public static Thread currentThread();获取当前线程的引用。

②第二种

1.可以定义一个Thread的子类并重写其run方法,如:
class MyThread extends Thread {
public void run() {
...
}
}
2.然后生成该类的对象:
MyThread myThread = new MyThread(...);san
继续阅读“Java多线程机制”

Java流

一、Java流式输入/输出原理

在Java程序中,对于数据流的输入/输出操作以“流”(stream)方式进行。
JDK提供了各种各样的“流”类,用以获取不同种类的数据。
程序中通过标准的方法输入或输出数据。

二、输入/输出流的分类
1. java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同的角度对其进行分类:
①按数据流的方向不同可以分为输入流和输出流。
②按处理数据单元不同可以分为字节流和字符流。
③按功能不同可以分为节点流和处理流。
2. JDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象流类型:

字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter
继续阅读“Java流”

Java常用类

一、字符串相关类
1. String类
①java.lang.String类代表不可变的字符序列。
②“xxxxx”为该类的一个对象。
③String类的常见构造方法:

  • String(String original):创建一个String对象为original的拷贝。
  • String(char[] value):用一个字符数组创建一个String对象。
  • String(char[] value, int offset, int count):用一个字符数组从offset项开始的count个字符序列创建一个String对象。

2. StringBuffer类
①java.lang.StringBuffer类代表可变的字符序列。
②StringBuffer和String类似,但StringBuffer可以对其字符串进行改变。
③StringBuffer类的常见构造方法:

  • StringBuffer():创建一个不包含字符序列的“空”的StringBuffer对象。
  • StringBuffer(String str):创建一个StringBuffer对象,包含与String对象str相同的字符序列。

二、基本数据类型包装类
1. 包装类(如:Integer,Double等)封装了一个相应的基本数据类型数值,并为其提供了一系列操作。
2. 以java.lang.Integer类为例,构造方法:

  • Integer(int value)
  • Integer(String s)
继续阅读“Java常用类”

Java数组

一、数组概述
1. 数组可以看成是多个相同类型数据组合,对这些数据的统一管理。
2. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
3. 数组中的元素可以是任何数据类型,包括基本类型和引用类型。

二、一维数组
1. 一维数组的声明

type[] var; 

* type var[ ];也可以,但Java中推荐type[ ] var;
* Java语言中声名数组时不能指定其长度(数组中元素的个数),如int a[5];是非法的。
2. 数组对象的创建
Java中使用关键字new创建数组对象,格式为:
数组名 = new 数组元素的类型[数组元素的个数];
* 例如:

public class Test {
public static void main(String[] args) {
int[] s;
s = new int[5];
}
}

* 注意:元素为引用数据类型的数组中的每一个元素都需要实例化。

继续阅读“Java数组”

Java异常处理

一、Java异常的概念
1. Java异常是Java提供的用于处理程序中错误的一种机制。
2. 所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在)。
3. 设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。
4. Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
5. 当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。

二、Java异常的分类

Java中定义了很多异常类,这些类对应了各种各样可能出现的异常事件。
  • Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。
  • Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。
  • Runtime Exception:一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。
继续阅读“Java异常处理”

Java容器

一、容器的概念
Java API所提供的一系列类的实例,用于在程序中存放对象。位于java.util包内。

二、容器框架图
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

继续阅读“Java容器”

Java面向对象

一、引用
1. Java语言中除基本类型之外的变量类型都称之为引用类型。
2. Java中的对象是通过引用对其操作的。
* A a = new A( ); 中,a是对象的引用,位于栈内存,指向位于堆内存的对象的实体,也就是
new A( )。

二、构造方法
1. 构造方法与类同名且没有返回值。
2. 当没有指定构造方法时,编译器为类自动添加形如 类名( ) { } 的构造方法。

三、方法的重载
1. 方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。
2. 构造方法也可以重载。

四、类的继承
1. Java中使用extends关键字实现类的继承机制。
2. 通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。
3. Java只支持单继承,不允许多继承。
* 一个子类只能有一个基类,一个基类可以派生出多个子类。

继续阅读“Java面向对象”

Java特殊关键字

一、this
1. 在类的方法定义中使用的this关键字代表使用该方法的对象的引用。
2. 当必须指出当前使用方法的对象是谁时要使用this。
3. 有时使用this可以处理方法中成员变量和参数重名的情况。
4. this可以看作是一个变量,它的值是当前对象的引用。

二、super
1. 在Java类中使用super来引用基类的成分。

三、static
1. 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。
2. 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。
* 静态方法不再是针对于某个对象调用,所以不能访问非静态成员。
3. 可以通过对象引用或类名(不需要实例化)访问静态成员。

四、final
1. final的变量的值不能够被改变
final的成员变量
final的局部变量(形参)
2. final的方法不能被重写
3. final的类不能够被继承

五、abstract
1. 用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract关键字来修饰一个 方法时,这个方法叫做抽象方法。
2. 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
3. 抽象类不能被实例化。
4. 抽象方法只需声明,而不需实现。

Java内存解析

一、内存分区
Java的内存分为三个区,分别为:
1. 堆空间(heap)不连续的空间,用于存放new出的对象,或者说是类的实例
2. 栈空间(stack)连续的存储空间,遵循后进先出的原则,用于存放局部变量
3. 方法区(method):方法区存在于堆中,用于存放代码静态变量字符串常量

二、相关概念
1. Java中除了基本数据类型,其他的均是引用类型,包括类、数组等等。
2. 数据类型的默认值
基本数据类型默认值:
数值型:0
浮点型:0.0
布尔型:false
字符型:\u0000
引用类型:null
3. 变量初始化
成员变量可不初始化,系统会自动初始化;
局部变量必须由程序员显式初始化,系统不会自动初始化。

三、解析过程
待更新。