Java基础note


title: Java基础note
toc: true
comments: true
tags: Java
abbrlink: 3f47467
date: 2021-08-01 15:34:54
categories:

这里记录的是对Java基础的讲义笔记 !

[TOC]

chpt02 Java基础语法和注释

基础语法

1. 注释
    作用:解释说明
    1.1  单行注释: //注释内容
    1.2 多行注释: /*注释内容*/ 
    1.3 文档注释:/** 注释内容 */

2. 标识符 & 关键字
    2.1 标识符
        定义:java程序中包、类、变量、方法的名字
        命名规则:
            。由字母、数字、下划线_、$ 构成,数字不能打头
            。长度无限制
            。java的关键字不能作为标识符
        命名规范:
            。包名全小写
            。类名遵循“驼峰法则”,首字母大写:HelloWorld
            。方法名/变量名遵循“驼峰法则”,首字母小写:helloWorld
            。常量全大写,单词之间下划线分割:HELLO_WORLD

    2.2 关键字
        goto:java保留了goto关键字,但并不使用

3. 变量 & 常量
    3.1 变量
        定义:内存中的一块有名字的存储空间
        变量三要素:类型、名字、值

    3.2 常量:
        定义:值不可变的变量
        特点:只能赋一次值,不能二次赋值

4. 数据类型
    4.1 分类
        依据:
            1. 不同的数据需要的内存大小不一样
            2. 不同的数据能参与的运算不一样
        类别:
            1. 基本数据类型(共8种):
                表示法:二进制、八进制、十进制、十六进制

                整型:byte(1字节:-128~127)、short(2字节)、int(4字节)、long(8字节)
                    常量:默认为int类型

                浮点:float(4字节)、double(8字节)
                    常量:默认double类型

                字符:char(2字节)
                布尔:boolean:true/false(未知)

            2. 引用数据类型:HelloWorld、String

            3. void

    4.2 类型转换
        1. 自动转换: 
            。小赋大、整赋浮
            。特列:byte、short、char参与运算的时候,先转换为int类型

        2. 强制类型转换:float p2 = (float)3.10;

5. 运算符
    。算数运算符: + - * / % ++ --
    。关系运算符: > >= < <= == !=
    。逻辑运算符: && || !
        * 短路现象
    。位运算符: & | ^ ~ << >> >>>
    。赋值运算符: =   += -+ *= 
    。条件运算符: ? :

6. 表达式
    由数据和运算符组合而成的式子。表达式的类型由运算符决定。
    算数表达式: 3 + 2
    关系表达式:3 > 2
    逻辑表达式:3 > 2 && 1 > 2

7. 语句
    简单语句 = 表达式 + ;
    块语句 = {}

注释

哪些地方需要添加注释

首先,我们需要确定一下,添加注释的目的是什么?(手动思考10秒)。

我认为添加注释,是为了程序更容易理解与维护,特别是维护,更是对自己代码负责的一种体现。

那基于这样的目的,在日常开发中,我们需要在哪些地方添加注释呢?

§类,接口。

这一部分注释是必须的。在这里,我们需要使用javadoc注释,需要标明,创建者,创建时间,版本,以及该类的作用。如下所示:

package com.andyqian.utils;/*** @author: andy* @date: 18-01-05* @version: 1.0.0* @deion: 生成PDF 工具类*/public class PdfUtil {}

§方法

在方法中,我们需要对入参,出参,以及返回值,均要标明。如下所示:

/** * 生成pdf文件 * @param htmlContent 待生成pdf的 html内容 * @param file 生成pdf文件地址 * @see PdfUtils#getFontPath() * @return true 生成成功 false 生成失败 */ public static boolean generatePdf(String htmlContent,File file){ ... return result; }

§常量

对常量,我们需要使用多行注释,进行标明该常量的用途,如下所示:

/*** @author: andy* @date: 18-01-05* @version: 0.0.1* @deion:*/public class StatusConsts { /** * 博客地址 */ public static final String BLOG="www.andyqian.com";}

§关键算法上

在关键算法上,添加注释并且按照顺序依次标明,写明白该方法为什么这么做。如下所示:

/** * 应用场景: * 1.在windows下,使用Thread.currentThread()获取路径时,出现空对象,导致不能使用 * 2.在linux下,使用PdfUtils.class获取路径为null, * 获取字体路径 * @return 返回字体路径 */ private static String getFontPath(){ String path=""; // 1. ClassLoader classLoader= Thread.currentThread().getContextClassLoader(); URL url = (classLoader==null)?null:classLoader.getResource("/"); String threadCurrentPath = (url==null)?"":url.getPath(); // 2. 如果线程获取为null,则使用当前PdfUtils.class加载路径 if(threadCurrentPath==null||"".equals(threadCurrentPath)){ path = PdfUtils.class.getClass().getResource("/").getPath(); } // 3.拼接字体路径 StringBuffer stringBuffer = new StringBuffer(path); stringBuffer.append("/fonts/SIMKAI.TTF"); path = stringBuffer.toString(); return path; }

怎么添加注释?

1. IDEA 自动生成

对于类中的注释,我们可以通过IDEA自动生成。

如IDEA 可以通过:File->Settings->Editor->File and Code Templates->Includes->File Header来设置模板,这样新建文件时,IDEA会按照设置的模板,会自动生成一个注释,就不需要一个一个敲了。

其中标签有:

${USER} : 当前用户。

${DATE} : 当前日期。

${PACKAGE_NAME}:包名。

${TIME}: 当前时间。

${YEAR}: 当前年。

${MONTH}:当前月。

${DAY}: 当前日。

${HOURS}: 当前小时。

${MINUTE}: 当前分钟

1.注释引用

如果方法中引用了其他的方法,在注释中如何体现呢?细心的朋友,应该已经发现了,在上面的:

/** * 生成pdf文件 * @param htmlContent 待生成pdf的 html内容 * @param file 生成pdf文件地址 * @see PdfUtils#getFontPath() * @return true 生成成功 false 生成失败 */ public static boolean generatePdf(String htmlContent,File file){ ... return result; }

中的@see就有这个作用,其语法是:

@see package.class#method label@see #field@see #method(Type, Type,...)@see #method(Type argname, Type argname,...)@see #constructor(Type, Type,...)@see #constructor(Type argname, Type argname,...)

例如:

@see PdfUtils#getFontPath()

如果是同一个类中,package(包名全路径)可以省略。有相同功能的标签有:

{@linkpackage.class#metod}

/** * 生成pdf文件 * @return true 生成成功 false 生成失败 * @throws Exception * {@link PdfUtils#getFontPath()} */ public static boolean generatePdf(String htmlContent,File file){ .... }

其区别是:@see必须要在注释行首,{@link}可以在任意位置。

    在IDEA中,我们可以选中方法通过快捷键Ctrl+D即可查看我们添加的注释,如下图所示:

1.如果需要引用外网的连接,我们可以通过HTML标签中的a标签来表示,如下所示:

@see <ahref="http://www.andyqian.com">博客地址</a>

以下为javadoc 需要熟知的注释标签:

@see 引用类/方法。

@author: 作者。

@date:日期。

@version: 版本号。

@throws:异常信息。

@param:参数

@return: 方法返回值。

@since: 开源项目常用此标签用于创建日期 。

{@value}: 会使用该值,常用于常量。

{@link} 引用类/方法。

{@linkplain} 与@link功能一致。

完整案例如下:

package com.andyqian.pdf.utils;import com.itextpdf.text.log.Logger;import com.itextpdf.text.log.LoggerFactory;import java.io.File;import java.net.URL;/*** @author: 鞠骞* @date: 18-01-05* @version: 1.0.0* @deion: 生成PDF 工具类*/public class PdfUtils { private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); /** * 生成pdf文件 * @param htmlContent 待生成pdf的 html内容 * @param file 生成pdf文件地址 * @see <a href="https://itextpdf.com/">https://itextpdf.com/</a> * @return true 生成成功 false 生成失败 */ public static boolean generatePdf(String htmlContent,File file)throws Exception{ ... return true; } /** * 应用场景: * 1.在windows下,使用Thread.currentThread()获取路径时,出现空对象,导致不能使用 * 2.在linux下,使用PdfUtils.class获取路径为null, * 获取字体路径 * @return 返回字体路径 */ private static String getFontPath(){ String path=""; // 1. ClassLoader classLoader= Thread.currentThread().getContextClassLoader(); URL url = (classLoader==null)?null:classLoader.getResource("/"); String threadCurrentPath = (url==null)?"":url.getPath(); // 2. 如果线程获取为null,则使用当前PdfUtils.class加载路径 if(threadCurrentPath==null||"".equals(threadCurrentPath)){ path = PdfUtils.class.getClass().getResource("/").getPath(); } // 3.拼接字体路径 StringBuffer stringBuffer = new StringBuffer(path); stringBuffer.append("/fonts/SIMKAI.TTF"); path = stringBuffer.toString(); return path; }}

添加注释时的一点建议

1.类中,接口等必须有创建时间,创建人,版本号,描述等注释。

2.注释不是越多越好,比如:get/set方法就不需要写注释。更不需要每一行都写注释。

3.注释需要写的简明易懂。特别是方法的参数,以及返回值。

4.每一次修改时,相应的注释也应进行同步更新。

5.在类,接口,方法中,应该都使用/** */javadoc注释。因为这样调用者就不需要进入方法内部才知道方法的用处。提高编码效率。

6.方法代码中如果有顺序之分,最好将代码也加上序号,如1,2,3等。

7.枚举中的每一个值都需要添加注释。

小结

写注释是一个好习惯,能让自己和团队都受益,如果你接手一个一丁点注释都没有的项目,那么上一个程序员就倒霉了(此处省略N个字),不知你们有没有看过开源项目的源码,那注释写的相当详细,大家可以多多参考,争取别做一个”倒霉”的程序员。

chpt03 流程控制

    if(表达式1) {
        if(表达式2){
            代码块1;
        }else{
            代码块2;   
    }else {
        代码块3;
    }

switch(表达式){
    case 常量1:
        代码块A;
        break;
    case 常量2:
        代码块B;
        break;
    case 常量3:
        代码块C;
        break;
    case 常量4:
        代码块D;
        break;
    ……
    default:
        代码块F;
        break;
    }

while(循环条件){
    循环代码块;
    }

do{
    循环代码块;
    }while(循环条件);

    1   2   4
for(表达式1;表达式2;表达式3){
    循环代码块;
        3
    }

int i,j;
for(i=1;i<=20;i++1){
    for(j=1;j<=i;j++){
        语句块;
        }
    }

chpt04 方法与数组

权限修饰符+(static)+函数返回类型+函数名(参数列表){
    if(递归结束条件){递归结束终值赋值语句;
        return 返回值;
    }else{
        累计计算+循环调用函数语句;
        return 返回值;
        }

数组名 = new 数组类型[数组长度];
数据类型[] 数组名 = new 数据类型[数组长度];
int[] engNo = new int[5];
String[] engName = new String[5];

数组名[数组下标] = 数值;

int[] engNo = new int[]{1001,1002,1003,1004,1005};
String[] engName = new Sting[]{"刘海龙","孙传戒","孙越"};

int[] engNo = {1001,1002,1003,1004,1005};
String[] engName = {"刘海龙","孙传戒","孙越"};

chpt05 String

String stuName1 = new String("王云");
char[] charArray = {'刘','静','涛'};
String stuName2 = new String(charArray);
String stuName3 = new String(charArray,1,2);//从'静'自开始,截取2个字符,结果是"静涛"'

String stuName1 = "王云";

class TestString2{
    public static void main(String[] args){
        String stuName1 = new String("王云");
        stuName1.concat("同学");
        Sytem.out.println("stuName1");
    }
}

StringBuffer strB1 = new StringBuffer();
StringBuffer strB2 = new StringBuffer("刘海龙");

chpt06 类和对象

类和对象:

1、面向过程 & 面向对象
    a. 面向过程(POP:procedure oriented programming): 
        “面向过程”就是汽车启动是一个事件,汽车到站是另一个事件。
        在编程序的时候我们关心的是某一个事件。而不是汽车本身。我们分别对启动和到站编写程序。

    b. 面向对象(OOP:Object Oriented Programming):
        “面向对象”需要建立一个汽车的实体,由实体引发事件。
        我们关心的是由汽车抽象成的对象,这个对象有自己的属性,像轮胎,颜色等;
        有自己的方法,像启动,行驶等.方法也就是汽车的行为.而不是汽车的每个事件。

2、类(群体)
    概念:对具有相同属性和行为的对象的抽象。
    语法:class Person{}

    界门纲目科属种

3、封装:
    定义:就是将抽象得到的属性和行为结合起来,形成一个整体,就是类。
    目的:
        a. 增强安全性
        b. 简化编程

4、对象: 一切皆对象(苹果、桌子、人),类的实例

5、构造方法(构造器):
    。主要作用:对象初始化
    。构造器没有返回值类型;名称同类名;
    。构造器中的第一条可执行语句是对其它构造器(父类构造器|当前类构造器)的调用,当没有显示调用其它构造器时,系统默认调用的是父类无参构造器(父类中必须有无参构造器)

    * this

6、对象初始化过程:
    系统默认初始化 》 成员变量声明时的初始化   =  初始化块初始化 》 构造器初始化

7、方法重载
    方法名相同,方法参数不同(参数个数、参数类型、参数顺序)的方法,称为重载方法。

chpt07 权限控制&static

》包:

    。包是类的容器,用于分隔类名空间。最主要作用:解决类名冲突。
    。默认包中的类无法被其它包引用。

》权限控制:
    private : 类内部;
    默认:同一个包中;
    protected: 同一个包中和子类中;
    public: 任何地方。

》静态变量 & 静态方法:

    1、静态成员属于类,静态方法不能操作实例变量。
    2、java类首次装入JVM时,会对静态变量(含静态块)或方法进行一次初始化(执行)。

》static的使用:
    。依赖于实例的方法属性,不用static修饰;这样的成员,被称为实例成员;
    。不依赖于实例的方法属性,需用static修饰;这样的成员,被称为类成员;

》静态块:
    静态块在类首次装入JVM时执行,且只执行一次。
    所谓类首次加载,是指:比如第一次new对象,第一次调用类的静态方法,都要用到这个类,第一次用到该类的时候,
    静态块就会被率先执行。
    注:
        在java中,java的静态类、方法、变量是存放在全局数据区中的,在应用程序运行期间一直占用内存而不被销毁。

》import:
    。普通导入:import java.lang.Math.*;          使用:Math.PI
    。静态导入:import static java.lang.Math.PI;      使用:PI
    注:
        只有静态属性和方法才能被静态导入。

chpt08 继承和多态

继承和多态:

》继承:
    。概念:子承父业,子类持有父类的成员(属性、方法)。子类获取父类(属性&方法)的,新增自己的,覆盖(override)父类的。
    。功能:代码的复用,实现多态
    。可继承成员:父类中的非私有成员都能被继承,私有的成员只能通过从父类中继承来的公有方法间接的调用
    。成员覆盖:属性覆盖 & 方法覆盖(重写override) (就近原则调用自己的)
        重写(方法覆盖):
            子类拥有与父类完全相同的方法,覆盖了父类中的方法。重写的方法返回值类型/异常类型可以缩小,访问权限可以被放大。

    。继承中的初始化:先人(父)后己(子)
        。构造器中的第一条可执行语句是对其它构造器(父类构造器|当前类构造器)的调用,当没有显示调用其它构造器时,
        系统默认调用的是父类无参构造器(父类中必须有无参构造器)

    。类是单继承的 

    。最终类不能被继承
        1.最终量(常量)不能被二次赋值
        2.最终方法不能被覆盖(重写)
        3.最终类不能被继承

》多态:
    1、向上转型:父类的属性,子类的方法
        。静态绑定/前期绑定/编译期绑定/属性绑定
        。动态绑定/后期绑定/运行时绑定/行为绑定
    2、向下转型:a -> b -> a , 强制类型转换。

 》instanceof: 类型判断

 》对象(类)间的关系:
    。继承(白箱复用) is a :
        class A extends B{
        }

    。依赖 has a :
        class A{
            B b;
        }

    。相持 
        class A{
            void f(B b){

            }
        }

    。聚合
        class A{
            B[] b;
        }

    。组合(黑箱复用)
        class A{
            B b;
            C c;
        } 

    注:优先使用对象组合,而不是类继承;

chpt09 抽象类和接口

抽象类 & 接口

    抽象类:abstract修饰的类
        抽象方法:abstract修饰的没有方法体的方法
        1. 抽象类不能实例化
        2. 子类继承抽象父类,如果父类中的抽象方法不在子类中实现,那么子类依然是抽象类

    接口:只有静态常量或抽象方法的抽象类
        1.类: 类是单继承的(一个只能继承一个类),接口是多实现的(一个类可以实现多个接口)
        2.接口:接口多继承(一个接口可以继承多个接口)

        ps:
            JDK8及以后,允许在接口中定义static方法和default方法。
                1. 静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。
                2. default方法,只能通过接口实现类的对象来调用。如果默认方法不能满足需要,实现类可以覆盖默认方法。

chpt10 Java异常处理机制

》概念:程序中出现的错误

》体系
 Throwable
    。Error:错误,Java程序本身无法恢复的严重错误,程序无需捕获处理。
    。Exception:异常,程序中的错误,程序员必须解决
        1.检查时异常:编译期异常(.java -> .class)
            。ClassNotFoundException 类没被找到异常
            。FileNotFoundException 文件找不到异常
            。IOException

        2.运行时异常: .class 被执行期间
            。NullPointerException 空指针异常
            。ArrayIndexOutOfBoundsException 数组下标越界异常
            。IndexOutOfBoundsException
            。ArithmeticException 算术异常
            。InputMismatchException 输入不匹配异常
            。ClassCastException
            。NumberFormatException

》异常处理:
    try...catch...finally
    1. try结构是必须的,catch结构和finally结构二者至少要出现其一
    2. try语句块抛出异常,则try中抛出异常后的代码将不再执行,转而执行相应的catch块;如果try结构中无异常,catch则不执行。
    3. catch结构可以出现多次 
    4. 多重捕获(multi-catch ,jdk1.7新增):一个catch语句可以捕获多个异常。
        语法:
            catch(Exception1 | Exception2 | ... | ExceptionN e){}
    5. 如果有finally结构,finally总会被执行;唯一不被执行的情况是catch(只限于catch)中出现了System.exit(1)语句;

    6. throw & throws
        throw: 手动抛出异常
        throws: 声明方法抛出异常
    ps:
        。异常应该按“由小到大”的顺序进行捕获;
        。异常处理结构中的return 和中断

》扩展try语句的使用。(jdk1.7新增)
    扩展try语句,称为带资源的try(try-with-resources)语句,这种try语句支持自动资源管理(例如,当流不再需要时,能自动关闭他们)。
    语法:
        try(resource-specification){
            //use the resource 
        }
        [catch(){}finally{}]
    说明:
        1.resource-specification 是用来声明和初始化资源(如文件流)的语句。该语句包含一个变量声明,
        在该声明中使用将被管理的对象引用初始化变量。try代码块结束时,自动释放资源。对于文件,
        意味着将会被自动关闭(不再需要显示的调用close方法)。
        2.只有实现了AutoCloseable接口的资源,才能使用带资源的try语句。所有流类都实现了该接口。

 》自定义异常:继承Exception
    DIYException extends Exception{}

chpt11 数据结构

数据:一切可以被计算机识别存储的信息

数据结构:数据的组织形式(表现形式&存储形式)
    。逻辑结构:
        1.集合结构:相互独立,无关联
        2.线性结构(数组、栈(First In,Last Out)、队列(First In,First Out))
        3.树结构(二叉树)
            遍历:
                。先根遍历 :根 -> 左 -> 右   
                。中根遍历: 左 -> 根 -> 右
                。后根遍历: 左 -> 右 -> 根
        4.图结构(地图)

    。物理结构(存储结构):
        1.顺序存储结构
        2.链式存储结构
        。比较:
            a.从内存开销角度:链式存储结构更耗内存
            b.从数据操作的角度:顺序存储结构的优势在于数据的查询,链式存储结构的优势在于数据的增删

数据的查找:
    1.无序查找
    2.有序查找(二分查找)

数据排序:
    1. 冒泡排序
    2. 选择排序
    3. 插入排序
    4. 快速排序
    ......

chpt12 集合

》集合:数据的容器

    >集合框架
        。Collection:单值集合(value)
            .Set:数据无序不可重复
                1.HashSet
                2.TreeSet: 元素有序

            .List:数据有序可重复
                1.ArrayList/Vector: 数组存储,顺序存储结构,优势在于数据的查询
                2.LinkedList:链式存储结构,优势在于增删
                线程安全:Vector(扩容100%)
                线程不安全:ArrayList(扩容50%)、LinkedList

        。Map:键值对集合<key,value>

    >Collection(List&Set)的使用

    >集合的遍历
        Set:
        1.forEach (遍历的同时不允许增删)
        2.Iterator

        List:
        1.for
        2.forEach (遍历的同时不允许增删)
        3.Iterator/ListIterator (遍历的同时不允许增删)

    >集合的排序:比较器(Collections)
        1.内部比较器Comparable: 为TreeSet和List服务的
        2.外部比较器Comparator: 为List服务
        。TreeSet -> Comparable
        。List -> Comparable / Comparator

    >单值集合工具:
        Collections: 服务Collection集合
        Arrays: 服务数组

    >Map
        .HashMap: 键值都可以为空,线程不安全
        .HashTable: 键值都不可以为空,线程安全
        .Properties: 线程安全

》泛型:参数化类型

》拆箱&装箱
    。拆箱
    。装箱

chpt13

文件和IO

File:
    文件 & 文件夹
    1. 文件夹操作:创建、删除、遍历
    2. 文件操作:创建、删除、控制

IO流:
    概念:Input 输入,读入,Output 输出,写入
    主体:内存
    数据源 : 提供数据的文件
    数据端: 接收数据的文件
    工具:流
        1.字节流:继承自 InputStream / OutputStream 这两个抽象类。
            FileInputStream / FileOutputStream
            ObjectInputStream / ObjectOutputStream

        2.字符流:继承自 Reader / Writer 这两个抽象类。
            FileReader / FileWriter

        注:字节流和字符流,因没有使用缓冲区等原因,一般不直接使用。

        。缓冲流:缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能。
            BufferedInputStream & BufferedOutputStream
            BufferedReader & BufferedWriter

        。数据流:允许字节流直接操作基本数据类型和字符串。
            DataOutputStream & DataInputStream

》Serializable && Externalizable
    用于存储到本地磁盘或网络传输的对象必须实现序列化接口Serializable,如果对象中的某些属性不想被序列化,
    将该属性用transient(临时的)修饰即可。另外,static成员也不会被序列化。

XML

XML: eXtensible Markup Language ,可扩展标记语言

应用范围:
    。数据存储
    。系统配置
    。数据交换

XML文档结构
    1. 文档声明(可选)
    2. DTD 约束 (可选)
    3. 文档正文 (标签:不可以数字开头)
    示例:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE team SYSTEM "team.dtd">
    <team>
    </team>

    XML元素命名规则
        名称可以含字母、数字以及其他的字符
        名称不能以数字或者标点符号开始
        名称不能以字符 “xml”(或者 XML、Xml)开始
        名称不能包含空格
        标签名大小写敏感

DTD: Document Type Definition
    。规范:元素、属性、元素间的关系

    ?: 被修饰的元素可以出现0次或1次
    +: 被修饰的元素至少要出现1次
    *: 被修饰的元素可以出现任意次

    示例:
    <!ELEMENT team (coach,players)>
    <!ELEMENT coach (name,sex)>
    <!ELEMENT players (player+)>
    <!ELEMENT player (name,age*,sex)>
    <!ATTLIST player id CDATA #REQUIRED >   //#REQUIRED:必须的,#IMPLIED:非必须的
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>

XML解析
    。DOM: 把整个xml文件读入内存进行解析
    。SAX:一次读一部分,分段解析

chpt14 反射

反射:
    java程序在运行时加载、使用编译期完全未知的类信息。

Class:
    class:类型修饰符
    Class:是一个数据类型

对比:
    Class:描述所有的类(数据类型)
        。共性:成员变量、构造器、成员方法

    Student:描述所有的学生
        。属性:学号、姓名、分数
        。行为:学习、运动、睡觉

chpt15 多线程

多线程:

进程:
    。程序
    。进行(运行)中的程序
    。进程是操作系统资源(内存、IO)分配的基本单位

线程:
    。所有的线程共享进程持有的资源
    。线程是操作系统调度执行的基本单位

线程状态:
    新建(启动)、就绪、运行、阻塞(等待)、死亡(终止)
    。阻塞 = 缺资源(IO、内存)
    。就绪 = 阻塞 + 资源
    。运行 = 就绪 + CPU

线程控制:
    1.创建
        1.1 extends Thread
        1.2 implements Runnable

    2.新建&启动
        2.1 new Thread().start();
        2.2 new Thread(new ImpRunnbale()).start();

    3.阻塞
        sleep(time:毫秒)
        interrupt() 中断阻塞

    4.死亡
        。stop()//不再使用
        。代码控制线程的终止

    5.等待加入
        join()

    6.设置线程优先级
        setPriority()

    7.设置守护线程(后台线程)  
        setDaemon(true) 
        。通过在线程启动(start)前调用其setDaemon方法,可将其设置为一个守护线程
        。当程序只有守护线程时,程序会立即结束运行

数据共享 & 线程同步
    。synchronized
    。同步块
        1.内部锁
        2.外部锁
    。同步方法

线程死锁和协作

chpt16 计算机网络

计算机网络:
    。分类:
        1. 局域网:LAN(内网)
        2. 广域网: WAN(外网、公网)

    。协议:
        1. OSI
        2. TCP/IP

    。IP & 域名
        1. IP:
            。表示形式:32位二进制、点分十进制
            。分类:网络号 + 主机号
        2. 域名:
            www.baidu.com == 112.80.248.76

网络配置:
    ipconfig: 查看网络配置信息
    ping: 测试网络是否连通

套接字编程:
    ServerSocket:服务器套接字
    Socket: 套接字

chpt17 注解

注解:
    。注释:说明
    。注解:功能

语法:
    @interface()

三大内置注解:
    。@Override  重写
    。@Deprecated    已过时
    。@SusspressWarnings 抑制警告

DIY注解:
    public @interface SqlProvider {
        String value() default "delete from tableName";
        String sql() default "";
    }

四大元注解:
    。元数据
    1.@Target
    2.@Retention
    3.@Documented
    4.@Inherited

chpt18 测试与调试

》测试与调试:
    。测试 test:发现问题;
    。调试 debug:解决问题;

》测试分类:
    。黑盒测试:功能测试;
    。白盒测试:结构测试、逻辑驱动测试,要求测试员对被测程序的结构非常清楚。
    。灰盒测试

》JUnit 3/4/5 注解:
    。@Before: 被@Before修饰的方法,在每个测试方法运行前,均执行一次;
    。@After:被@After修饰的方法,在每个测试方法运行完毕后,均执行一次;
    注:
        1.@Before和@After可以出现多次;
        2.经这两个注释的初始化和注销,可以保证各个测试之间的独立性而互不干扰,他的缺点是效率低。

    。@BeforeClass:所有测试开始之前运行
    。@AfterClass :所有测试结束之后运行
    注:
        对于消耗资源,可以使用这两个注释。

    。@Test(expected=*.class) 
        通过传入异常类后,测试类如果没有抛出异常或者抛出一个不同的异常,本测试方法就将失败。

    。@Test(timeout=xxx)
        该元数据传入了一个时间(毫秒)给测试方法,  如果测试方法在制定的时间之内没有运行完,则测试也失败。

    。@ignore: 
        该元数据标记的测试方法在测试中会被忽略。    

》Faliure和Error的区别:
    。 Failure是指测试失败
    。 Error是指测试程序本身出错

》测试类:
    。测试类是一个独立的类,没有任何父类。测试类的名字可以任意命名。所以我们不能通过类的声明来判断它是不是一个测试类,它与普通类的区别在于它内部方法的声明。
    。测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”(@Annotation)来明确表明哪些是测试方法。
    。测试方法的名字可以随便取,没有限制,但是返回值必须为void,而且不能有任何参数。

》参数化测试:
    只写一个测试函数,把若干种情况作为参数传递进去,一次性的完成测试。

》测试集:
    把多个测试类放在一个测试套件中集中运行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注