JavaSE[本人复习SE时的记录,适合已经学习完JavaSE的朋友复习回顾]

   日期:2020-05-30     浏览:105    评论:0    
核心提示:00基本语法文档注释变量分类运算符流程控制数组文档注释①文档注释用javadoc来解析,在Dos中输入一下命令②javadoc -d (要生成的)文件夹的名字 -author -version 文件名(.java结尾的文件名)③执行完命令后,会在当前的目录下创建一个文件夹,其中的index.html即为该程序的说明文档变量分类运算符流程控制数组...java

JavaSE

  • 00基本语法
    • 0-1文档注释
    • 0-2变量分类
    • 0-3运算符
    • 0-4流程控制
    • 0-5数组
  • 01面向对象
    • 1-1类
    • 1-2权限修饰符
    • 1-3类的成员
      • 1-3-1属性
      • 1-3-2方法
      • 1-3-3构造器
      • 1-3-4代码块
      • 1-3-5内部类
    • 1-4三大特征
      • 1-4-1封装
      • 1-4-2继承
      • 1-4-3多态
    • 1-5关键字
      • 1-5-1package
      • 1-5-2import
      • 1-5-3this
      • 1-5-4super
      • 1-5-5static
      • 1-5-6final
      • 1-5-7static final
      • 1-5-8abstract
      • 1-5-9interface
    • 1-6面向对象其它知识点
      • 1-6-1匿名对象的使用
      • 1-6-2方法的重载
      • 1-6-3可变个数形参
      • 1-6-4属性赋值的先后顺序
      • 1-6-5方法的重写(覆盖、重置)
      • 1-6-6子类对象实例化的全过程
      • 1-6-7Math.random()使用
  • 02异常(广义上的异常)
    • 2-1理解
    • 2-2分类
    • 2-3对于Exception(狭义异常)的处理机制
    • 2-4体会
    • 2-5开发中如何选择try-catch-finally和thorws
    • 2-6如何自定义异常类
  • 03多线程
    • 3-1概述
    • 3-2线程的分类
    • 3-3线程的创建和使用【主要指的是用户线程】
    • 3-4Thread类的有关方法
    • 3-5线程的优先级
    • 3-6线程的生命周期
    • 3-7线程安全问题
    • 3-8死锁
    • 3-9线程的通信
    • 3-10sleep()和wait()方法的异同
  • 04常用类
    • 4-1Object类
    • 4-2包装类
      • 4-2-1基本数据类型、包装类、String之间的转换
      • 4-2-2两道面试题
    • 4-3String
      • 4-3-1String概述
      • 4-3-2定义方式
      • 4-3-3字符串特性
      • 4-3-4常用方法
      • 4-3-5String与其它类型之间的转换
      • 4-3-6String的源码分析
      • 4-3-7与String相关的类
    • 4-4JDK8之前日期和时间API
      • 4-4-1System.类中的current TimeMillis()
      • 4-4-2两个Date类的使用
      • 4-4-3SimpleDateFormat
      • 4-4-4Calendar日历类(抽象类)的使用
    • 4-5JDK8新日期和时间API
      • 4-5-1Instant
      • 4-5-2DateTimeFormatter类似于SimpleDateFormat
    • 4-6Java比较器的使用
    • 4-7其他常用类
      • 4-7-1System类
      • 4-7-2Math类
      • 4-7-3BigInteger和BigDecimal
  • 05枚举类
    • 5-1理解
    • 5-2如何定义枚举类
      • 方式一jdk5.0之前,自定义枚举类
      • 方式二jdk5.0之后,可以使用enum关键字定义枚举类
    • 5-3Enum类的主要方法
    • 5-4使用enum关键字定义的枚举类实现接口的情况
  • 06注解
    • 6-1概述
    • 6-2常见的Annotation示例
    • 6-3如何自定义注解:参照@SuppressWarnings定义
    • 6-4JDK提供的四种元注解(用于修饰注解的注解)
    • 6-5jdk8中注解的新特性:可重复注解、类型注解
      • 6-5-1可重复注解
      • 6-5-类型注解
  • 07集合
    • 7-1集合框架的概述
    • 7-2Collection接口中的方法的使用
      • 7-2-1集合元素的遍历操作,使用Iterator接口
      • 7-2-2foreach 循环遍历集合或者数组
    • 7-3Collection子接口
      • 7-3-1List接口
      • 7-3-2ArrayList的源码分析
      • 7-3-3LinkedList源码分析
      • 7-3-4Vector源码分析
      • 7-3-5List接口中常用方法
      • 7-3-6Set接口
      • 7-3-7Set存储数据特点的理解
      • 7-3-8关于HashCode和equals()方法的重写
      • 7-3-9LinkedHashSet 的使用
      • 7-3-10TreeSet
    • 7-4Map接口
      • 7-4-1Map接口及其多个实现类的对比
      • 7-4-2Map中存储key-value的特点
      • 7-4-3HashMap的底层的实现原理
      • 7-4-4HashMap源码中的重要常量
      • 7-4-5HashMap在jdk7中的源码分析
      • 7-4-6HashMap在jdk8中的源码分析
      • 7-4-7LinkedHashMap的底层实现
      • 7-4-8Map中的常用方法
      • 7-4-9TreeMap两种添加方式的使用
      • 7-4-10Properties处理属性文件
      • 7-4-11Collections工具类的常用方法测试
  • 08泛型
    • 8-1概述
    • 8-2使用
    • 8-3如何自定义泛型结构(泛型类、泛型接口;泛型方法)
    • 8-4泛型在继承方面的体现
    • 8-5通配符的使用
  • 09IO
    • 9-1File类的使用
      • 9-1-1概述
      • 9-1-2如何创建File类的实例
      • 9-1-3File类的常用方法
      • 9-1-4遍历、删除目录
    • 9-2IO流原理及流的分类
      • 9-2-1原理
      • 9-2-2流的分类
      • 9-2-3IO流体系
      • 9-2-4节点流之一FileReader读入数据的基本操作
      • 9-2-5节点流之一FileWriter写出数据的操作
      • 9-2-6节点流之FileInputStream/FileOutputStream
      • 9-2-7处理流之缓冲流
      • 9-2-8处理流之转换流
      • 9-2-9处理流之标准的输入输出流
      • 9-2-10处理流之打印流
      • 9-3-11处理流之数据流
      • 9-2-12处理流之对象流
      • 9-2-13RandomAccessFile
      • 9-2-14【当前阶段不重要,可以不看】
  • 10网络编程
    • 10-1网络编程概述
    • 10-2通信要素
    • 10-3TCP编程
    • 10-4UDP编程
    • 10-5URL
  • 11反射
    • 11-1概述
    • 11-2代码层面理解
    • 11-3利用反射调用类的私有结构
    • 11-4如何看待反射和封装性
    • 11-5关于Class类的理解
    • 11-6获取Class实例的4种方式
    • 11-7Class实例对应的结构
    • 11-8类的加载与ClassLoader理解
      • 11-8-1类的加载过程理解
      • 11-8-2ClassLoader的理解
      • 11-8-3利用ClassLoader读取配置文件
    • 11-9创建运行时类的对象
    • 11-10体会反射的动态性
    • 11-11获取运行时类的属性结构及其内部结构
    • 11-12获取运行时类的方法结构
    • 11-13获取运行时类的构造器结构
    • 11-14获取运行时类的父类及父类的泛型
    • 11-15获取运行时类的接口、所在包、注解等
    • 11-15获取运行时类中指定的属性
    • 11-15获取运行时类中指定的方法
    • 11-16获取运行时类中指定的构造器
  • 12动态代理
    • 12-1动态代理的举例
  • 13jdk8其它新特性
    • 13-1Lambda表达式
    • 13-2Lambda表达式的使用
    • 13-3函数式接口
    • 13-4方法引用
    • 13-5构造器引用
    • 13-6数组引用
    • 13-7Stream API
      • 13-7-1创建Stream的方式
      • 13-7-2Stream的中间操作
      • 13-7-3Stream的终止操作
    • 13-8Optional类
      • 13-8-1使用举例
  • 14拓展
    • 14-1JavaBean
    • 14-2MVC设计模式
    • 14-3JDK中主要包的介绍
    • 14-4设计模式

00基本语法

0-1文档注释

①文档注释用javadoc来解析,在Dos中输入一下命令
②javadoc -d (要生成的)文件夹的名字 -author -version 文件名(.java结尾的文件名)
③执行完命令后,会在当前的目录下创建一个文件夹,其中的index.html即为该程序的说明文档

0-2变量分类


1、byte byteNum = 128;(该语句编译时报错,因为byte数据类型的表数范围为-128~127)

2、声明long类型的变量,必须以“l”或“L”结尾;声明float类型的变量,必须以“f”或“F”结尾;

3、使用整型变量通常用int,使用浮点型变量通常用double

4、char类型的三种表现形式:
******用一对’’,内部只能写一个字符,如char charNum = ‘9’;
******可以是转义字符如:char charNum = ‘\n’;
******可以是Unicode码(如:\u000a表示\n)【16进制4位数】

5、java中的boolean类型值是true false,不像C语言用1和0表示真假

6、 基本数据类型之间的运算规则(只讨论7种基本数据类型之间的运算,不包含boolean类型)

①自动类型提升(容量小的数据类型的变量与容量大的数据类型的变量运算,结果的数据类型为容量大的数据类型)
注意:【是容量小的->容量大的 不是 占内存空间小的->占内存空间的大的;】【byte,short,char之间做运算,结果的数据类型是int。(byte、short、char)->int->long->float->double】

System.out.println(1F+1L);// 2.0 【容量小的long类型转换为容量大的float类型】

②强制类型转换【不再阐述】

0-3运算符

算术运算符
+ - * / %
赋值运算符
+= -= *= /= %=
比较运算符
> < == != >= <= instanceof
逻辑运算符
& && | || ^ !
位运算符
& | ~ ^ >> >>> <<
三元运算符
? :


public class V01Operator {
    public static void main(String[] args) {
        short shortNum = 10;
        // 如果要对short类型的变量实现增值操作 shortNum = (short) (shortNum + 3);但是++ -- += -= *= /= %=不会改变结果的类型
        shortNum = (short) (shortNum + 3); // shortNum = 13
        shortNum += 7; // shortNum = 20
        System.out.println(shortNum);
    }
}

【注意】++ – += -= *= /= %=不会改变结果的类型【具体见上述代码】

0-4流程控制



public class V03ProcessControl {
    public static void main(String[] args) {
        int i = 0;
        for(System.out.print("a");i < 3; System.out.print("c") , i++){
            System.out.print("b");
        }// 结果是abcbcbc
        for(int j = 0;j < 3;j++){
            System.out.println("Hello World!");
        }
        System.out.println(i);// 结果是3------因为变量i没有在for循环内定义,所以在for循环的外面有效,可以使用。
         // System.out.println(j); 该语句编译出错,变量j只在for循环内有效
        for(int j = 1;j <= 150;j++){
            System.out.print(j);
            if(j % 3 == 0){
                System.out.print("->3的倍数");
            }
            if(j % 5 == 0){
                System.out.print("->5的倍数");
            }
            if(j % 7 == 0){
                System.out.print("->7的倍数");
            }
            System.out.println();
            // for(;;)相当于是while(true)
        }
    }
}

0-5数组

public class V04Array {
    
    public static void main(String[] args){
        //1、一维数组的声明与初始化
        //静态初始化:数组的初始化与数组元素的赋值是同时进行的
        int[] numbers = new int[]{11, 12, 13, 14, 15};// 第二种写法(类型推断):int [] nubmers = {1,2,3,3,4}
        //动态初始化:数组先初始化,之后再对数组元素进行赋值
        int[] numbers1 = new int[7];
        numbers1[0] = 11;
        numbers1[1] = 12;
        numbers1[2] = 13;
        numbers1[3] = 14;
        //2、获取数组的长度(应用属性:length)
        System.out.println(numbers.length + " " + numbers1.length);
        

        
        //1、静态初始化
        int[][] arr = new int[][]{{1,2,3},{4,5,6}};
        //2、动态初始化
        int[][] arr1 = new int[2][3];
        int[][] arr2 = new int[2][];
        arr2[0] = new int[3];
        System.out.println(arr2[1]);
        //3、其余的写法int[][] arr;int[] arr[];int arr[][];
        

        //初始化数组
        int test[][] = new int[5][];
        for(int i = 0;i < test.length;i++){
            test[i] = new int[i + 1];
        }
        //遍历数组
        for(int i = 0;i < test.length;i++){
            for(int j = 0;j < test[i].length;j++){
                System.out.print(test[i][j]);
            }
            System.out.println();
        }
    }
}

01面向对象

1-1类

一、类和对象的理解
1、类:是对一类事物的描述,是抽象的概念上的定义
2、对象:是实际存在的该类实物的实体,因此也称实例(instance)
3、面向对象程序设计的重点是类的设计
4、设计类就是设计类的成员
二、类和对象的使用(面向对象思想落地的实现)
1、创建类、设计类的成员
2、创建类的对象
3、通过"对象.属性"、"对象.方法"调用对象的结构*/

public class V00HelloWorld {
    public static void main(String[] args){
        Person p1 = new Person();
        p1.age = 10;
        System.out.println(p1.age);
        p1.eat();
        p1.talk("中文");
    }
}
class Person{
    int age = 1;
    public void eat(){
        System.out.println("人吃饭");
    }
    public void talk(String language){
        System.out.println("人说" + language);
    }
}

1-2权限修饰符

用来修饰类、属性、方法、构造器、内部类
public------当前工程下可见
protected------不同包的子类可见
缺省------当前包下可见
private------类内部可见
【注意】:类只能被public和缺省修饰

1-3类的成员

1-3-1属性


1-3-2方法


1-3-3构造器


public class V06Constructor {
    public static void main(String[] args){
        Person1 p = new Person1();
    }
}
class Person1{
    //构造器
    public Person1(){
        System.out.println("自定义空参构造器!");
    }
}

1-3-4代码块

1、作用:来初始化类、对象
2、修饰:只能被static修饰
3、分类
4、属性赋值的先后顺序

1-3-5内部类


1、创建非静态成员内部类对象;创建静态成员内部类对象

public class InnerClass {
    public static void main(String[] args) {
        //创建静态成员内部类对象
        Pet.Dog dog = new Pet.Dog();
        //创建非静态成员内部类对象
        Pet pet = new Pet();
        Pet.Bird bird = pet.new Bird();
    }
}
class Pet{
    String name;
    static class Dog{
        String name;
    }
    class Bird{
        String name;
        public void display(String name){
            System.out.println(name);//调用形参的name
            System.out.println(this.name);//调用Bird类中的name
            System.out.println(Pet.this.name);//调用Pet的name
        }
    }
}

2、局部内部类使用

public class InnerClass2 {

}
class Pet2{
    //开发中局部内部类,一般用于方法中,返回该内部类的对象

    //返回一个实现了Comparable接口的内部类对象
    public Comparable getComparable(){
        //方式一
        class MyComparable implements Comparable{
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }
        return new MyComparable();
    }
    public Comparable getComparable2(){
        //方式二
        return new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
    }
    //局部内部类使用在方法中的一个注意点
    public void method(){
        
        //局部变量num
        int num = 0;
        class Inner{
            public void show(){
                System.out.println(num);
            }
        }
    }
}

1-4三大特征

1-4-1封装


public class V04Encapsulation {
    public static void main(String[] args){

    }
}
class Animal{
    private int age;

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return this.age;
    }
}

1-4-2继承

public class Person {
    int age;
    String name;
    char gender;
    public Person(){}
    public Person(int age,String name,char gender){
        this.age = age;
        this.name = name;
        this.gender = gender;
    }
    public void eat(){
        System.out.println("吃饭");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return this.age;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setGender(char gender){
        this.gender = gender;
    }
    public char getGender(){
        return this.gender;
    }
}
public class Student extends Person {
    
    public void study(){
        System.out.println("学习");
    }
    public void eat(){
        System.out.println("学生吃饭");
    }

}

public class ExtendsTest {
    public static void main(String[] args) {
        Student student = new Student();
        //调用父类的方法
        student.setAge(10);
        System.out.println(student.getAge());
        //调用自己方法
        student.study();
    }
}

1-4-3多态

1、核心内容

2、扩展内容

1-5关键字

1-5-1package

1-5-2import

import static java.lang.System.*;
public class TestImport {
    public static void main(String[] args) {
        out.println("HelloWorld");
    }
}

1-5-3this

1-5-4super

1-5-5static

一、可以修饰属性、方法、代码块、内部类

二、开发中如何确定一个属性要声明为static
1、属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
2、类中的常量也常常声明为static

三、开发中如何确定一个方法要声明为static
1、操作静态属性的方法,通常设置为static的
2、工具类中的方法,习惯上声明为static的。比如: Math、 Arrays、collections

四、static的应用
1、单例模式

public class TestSingleton {
    public static void main(String[] args) {
        //获取饿汉式对象
        Singleton1 instance1 = Singleton1.getInstance();
        //获取懒汉式对象
        Singleton2 instance2 = Singleton2.getInstance();
    }
}
class Singleton1{
    //饿汉式(线程安全)
    private Singleton1(){}
    private static Singleton1 instance = new Singleton1();
    public static Singleton1 getInstance(){
        return instance;
    }
}
class Singleton2{
    //懒汉式(①懒汉式延迟创建对象②目前代码是线程不安全的)
    private Singleton2(){}
    private static Singleton2 instance = null;
    public static Singleton2 getInstance(){
        if(instance == null){
            instance = new Singleton2();
        }
        return instance;
    }

}

①jdk源码中使用的例子:

②应用场景

2、main()方法的使用说明
①main方法作为程序的入口
②main方法也是一个普通的静态方法
③main方法可以作为我们与控制台交互的方式
运行的时候可以为String[] args传入参数

1-5-6final

一、表示最终的
二、可以修饰的结构
1、类
①表明此类不能被继承
②比如:String、StringBuffer、StringBuilder
2、变量
①表明此时的变量是一个常量
②修饰属性
③修饰局部变量
尤其是使用final修饰形参时,表明此形参是一个常量。 当我们调用此方法时, 给常量形参赋一个实参。赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值
3、方法
①表明此方法不可以被重写
②例如:Object中的getClass()
4、内部类

1-5-7static final

用来修饰属性,表示全局常量

1-5-8abstract

一、可以修饰的结构
1、类

2、方法

3、注意点
4、①创建匿名子类的非匿名对象
Person是一个抽象类,eat(),breath()是其中的两个抽象方法

②创建匿名子类的匿名对象

1-5-9interface


一、如何定义接口(定义接口的成员)
①JDK7及之前:只能定义全局常量和抽象方法

②JDK8:

二、接口的使用

1-6面向对象其它知识点

1-6-1匿名对象的使用

常常作为参数

public class V01AnonymousObject {
    public static void main(String[] args){
        
        PhoneMall phoneMall = new PhoneMall();
        //匿名对象使用如下:
        phoneMall.showMessage(new Phone());
    }
}
class PhoneMall{
    public void showMessage(Phone p){
        System.out.println("手机品牌:" + p.brand + ";功能:" + p.function + ";手机屏幕尺寸:" + p.screenSize + "寸");
    }
}
class Phone{
    String brand;//手机品牌
    String function;//手机功能描述
    double screenSize;//手机屏幕尺寸
    public void showDescription(String modelNumber,String function,double screenSize){
        System.out.println("手机品牌:" + modelNumber + ";功能:" + function + ";手机屏幕尺寸:" + screenSize + "寸");
    }
}

1-6-2方法的重载

public class V02OverLoad {
    public static void main(String[] args) {
        //在一个类中,允许存在一个以上的同名方法,只要他们的参数个数或参数类型不同即可。(方法在同类中,同名,不同参数),以下三方法构成重载
        V02OverLoad v=new V02OverLoad();
        v.get(2,3);
    }
    public int getSum(int a,int b){
        return a + b;
    }
    public double getSum(double a,double b){
        return a + b;
    }
    public double getSum(int a,double b){
        return a + b;
    }

    public void get(double a,double b){
        System.out.println(a * b);
    }
    public void get(int a,int b){
        System.out.println(a + b);
    }

}

1-6-3可变个数形参

public class V03VariableNumberOfArguments {
    
    public static void main(String[] args) {

    }
    //3、可变个数形参的方法与本类中方法名相同,形参不同的方法之间构成重载
    //4、可变个数形参在方法的形参的中,只能声明在末尾==>一个方法的形参中只能声明一个可变个数形参
    public void show(String str,String ... strs){

    }
    public void show(String ... strs){
        //5、可变个数形参可以理解为同数组一样,因此在一个类中,形参是一个'可变个数形参'的方法,不能与形参是一个'数组'的方法构成重载
        for(int i = 0;i < strs.length;i++){
            System.out.println(strs[i]);
        }
    }
}

1-6-4属性赋值的先后顺序

①默认初始化
②显式初始化/代码块初始化
③构造器初始化
④通过‘对象.属性’或者‘对象.方法’赋值

1-6-5方法的重写(覆盖、重置)

1-6-6子类对象实例化的全过程

1-6-7Math.random()使用

//Math.random()得到的随机数范围是[0.0,1.0)(double类型)
//7、随机数的获取-获取[a,b]范围内的整数:(int)(Math.random()*(b - a + 1) + a)

02异常(广义上的异常)

2-1理解

①程序执行中发生的不正常情况
②开发过程中的语法错误和逻辑错误不是异常

2-2分类

一、Error

二、Exception

2-3对于Exception(狭义异常)的处理机制

对Exception(狭义异常)的处理机制就是抓抛模型(将"抛"出来的异常"抓"住)
其中抛有两种方式,抓也有两种方式

2-4体会

①开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,一定要考虑异常的处理。
②使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try- catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

2-5开发中如何选择try-catch-finally和thorws

①如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。

②执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

2-6如何自定义异常类

1、step1:继承现有的异常结构(RunTimeException、Exception)
2、step2:提供全局常量serialVersionUID
3、step3:提供重载的构造器

03多线程

3-1概述

1、关于进程和线程的概念及了解,大家可以百度,科班出身的码神应该已经学习了操作系统这门课,这门课讲解的很详细,码神们可以跳过这部分。

2、JVM简图如下

3、JVM允许程序运行多个线程,需要通过java.lang.Thread类体现

3-2线程的分类

3-3线程的创建和使用【主要指的是用户线程】

一、线程的创建
1、继承Thread类

2、实现Runnable接口

原理(JDK源码):



public class V00ExtendsThread {
    public static void main(String[] args) {
        //方式一:继承Thread
        Window1 w1 = new Window1();
        Window1 w2 = new Window1();
        Window1 w3 = new Window1();
        w1.start();
        w2.start();
        w3.start();
        //方式二:实现Runnable接口
        Window2 window = new Window2();
        Thread t1 = new Thread(window);
        Thread t2 = new Thread(window);
        Thread t3 = new Thread(window);
        t1.start();
        t2.start();
        t3.start();
    }
}
class Window1 extends Thread{
    public static int ticketNum = 100;
    public void run(){
        while(true){
            if(ticketNum > 0){
                System.out.println(Thread.currentThread().getName() + "售出 =>【" + ticketNum + "】<= 号票");
                ticketNum--;
            }else break;
        }
    }
}
class Window2 implements Runnable{
    public int ticketNum = 100;
    public void run(){
        while(true){
            if(ticketNum > 0){
                System.out.println(Thread.currentThread().getName() + "售出 =>【" + ticketNum + "】<= 号票");
                ticketNum--;
            }else break;
        }
    }
}

3、两种创建方式的对比

二、JDK5.0新增的线程创建方式
1、实现Callable接口

如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?

2、使用线程池


3-4Thread类的有关方法

3-5线程的优先级

3-6线程的生命周期

具体的请码神们百度或者参考操作系统

3-7线程安全问题

一、在Java中,通过线程同步解决线程安全问题
1、同步代码块

2、同步方法

3、Lock锁(JDK5.0新增)


4、synchronized与Lock 的异同 && 优先使用顺序

二、同步监视器

三、利用线程同步机制解决懒汉单例模式的线程安全

四、体会
①同步方式解决了线程的安全问题;
②操作同步代码时,只能有一个线程参与, 其他线程等待。相当于是一个单线程的过程,效率低。

3-8死锁

具体的请码神们百度或者参考操作系统

3-9线程的通信

3-10sleep()和wait()方法的异同

04常用类

4-1Object类

一、finalize()------对象被回收之前,会调用此方法。不要自己去调用,交给垃圾回收机制调用
二、clone()------克隆一个对象
三、toString()

四、equals(Object obj)

String类中重写的equals()方法

4-2包装类

4-2-1基本数据类型、包装类、String之间的转换


4-2-2两道面试题


说明:
Integer内部定义了IntegerCache结构,IntegerCache中定义了 Integer[],保存了从- 128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在-128到127范围内时,可以直接使用数组中的元素,不用再去new了。

目的是提高效率

4-3String

4-3-1String概述

一、使用一对“”引起来
二、String类声明为final的表示不可以被继承
三、
①String实现了Serializable接口:表示字符串是支持序列化的
②实现了Comparable接口:表示可以比较大小
四、内部定义了final char[] value用于存储字符串数据
五、代表不可变的字符序列,简称不可变性

4-3-2定义方式


问题:String s = new String(“abc”);在内存中创建了几个对象?
两个
①一个是堆空间中new的结构
②一个是char[]对应的常量池中的数据

4-3-3字符串特性


4-3-4常用方法




1、subString(int beginIndex,int endIndex)是左闭右开
2、什么情况下,indexOf(str)和lastIndexOf(str)返回值相同?
①情况1:存在唯一的str
②情况2:不存在str

4-3-5String与其它类型之间的转换

一、String与基本数据类型、包装类之间的转换(具体见包装类)
二、String与char[]之间的转换

三、String与byte[]之间的转换

4-3-6String的源码分析

4-3-7与String相关的类

一、StringBuffer
1、StringBuffer源码分析

2、扩容问题




如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。

3、常用方法

二、StringBuilder

一、String、StringBuffer、StringBuilder三者的异同

二、指导意义
①开发中建议使用: StringBuffer(int capacity) 或StringBuilder(int capacity)
②三者的效率,StringBuilder > StringBuffer > String

4-4JDK8之前日期和时间API

4-4-1System.类中的current TimeMillis()

4-4-2两个Date类的使用

4-4-3SimpleDateFormat

一、两个操作
1、格式化(日期—>字符串)
2、解析(字符串—>日期)
二、SimpleDateFormat的实例化

public class Test {
    public static void main(String[] args) throws ParseException {
        Date date = new Date();
        /
        Season[] seasons = Season.values();
        for (int i = 0; i < seasons.length; i++) {
            seasons[i].show();
        }
        //春天春天春天
        //夏天夏天夏天
        //秋天秋天秋天
        //冬天冬天冬天
    }
}
interface info{
    void show();
}
enum Season implements info{
    //1、提供当前枚举类的对象,多个对象之间用”,”隔开,末尾对象”;"结束
    SPRING("春","春暖花开"){
        @Override
        public void show(){
            System.out.println("春天春天春天");
        }
    },
    SUMMER("夏","夏日炎炎"){
        @Override
        public void show(){
            System.out.println("夏天夏天夏天");
        }
    },
    AUTUMN("秋","秋高气爽"){
        @Override
        public void show(){
            System.out.println("秋天秋天秋天");
        }
    },
    WINTER("冬","寒风刺骨"){
        @Override
        public void show(){
            System.out.println("冬天冬天冬天");
        }
    };
    //2、声明Season对象的属性:private final 修饰
    private final String seasonName;
    private final String seasonDesc;
    //3、私有化类的构造器,并给对象属性赋值
    private Season(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //4、其它诉求1:获取枚举类对象的属性
    public String getSeasonName(){
        return this.seasonName;
    }
    public String getSeasonDesc(){
        return this.seasonDesc;
    }
}

06注解

6-1概述


6-2常见的Annotation示例




6-3如何自定义注解:参照@SuppressWarnings定义

定义注解必须配上注解的信息处理流程才有意义
一、注解声明为@interface
public @interface Suppres sWarnings


6-4JDK提供的四种元注解(用于修饰注解的注解)

JDK5.0提供了4个标准的meta-annotation类型, 分别是:
一、Retention

二、Target

自定义注解通常都会指明两个元注解: Retention、 Target

三、Documented
四、Inherited

6-5jdk8中注解的新特性:可重复注解、类型注解

6-5-1可重复注解

①在MyAnnotation上声明@Repeatable,成员值为MyAnnotations. class
②MyAnnotation的Target和Retention等元注解与MyAnnotations相同。

6-5-类型注解



07集合

7-1集合框架的概述

一、集合、数组都是对多个数据进行存储操作的结构,简称Java容器。
说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(. txt,.jpg,.avi,数据库中的数据)

二、数组在存储多个数据方面的特点:
1、一旦初始化以后,其长度就确定了。
2、数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。比如: String[] arr;int[] arr1;object[] arr2;
3、数组在存储多个数据方面的缺点: .
①一旦初始化以后,其长度就不可修改。
②数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
③获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
④数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。

三、Java集合可以分为Collection和Map两种体系
Collection接口:单列数据,定义了存取一组对象的方法的集合

List: 元素有序、可重复的集合
Set:元素无序、不可重复的集合

Map接口:双列数据,保存具有映射关系“key-value对”的集合

7-2Collection接口中的方法的使用

向Collection接口的实现类的对象中添加数据obj时,要求obj所在类要重写equals().【contains(Object obj)方法,会将obj与集合中的元素逐一进行equals()比较;remove(Object obj)、removeAll(Collection coll1)方法也会调用equals()方法】
java.lang.UnsupportedOperationException解决方法

public class Test {
    public static void main(String[] args) throws ParseException {
        /
            //3.读入操作(方式二)
            while((len = fr.read(cbuf)) != -1){
                System.out.print(new String(cbuf,0,len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //3.流的关闭操作
            try {
                if(fr != null){
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

9-2-5节点流之一FileWriter写出数据的操作


public class Test {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            //1.实例化File类的对象,指明要操作的文件
            File file = new File("c://Users//18369//Desktop//helloworldout.txt");
            //2.提供具体的流
            fw = new FileWriter(file);
            //3.写出数据
            fw.write("哈哈哈哈!");
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件的复制操作

9-2-6节点流之FileInputStream/FileOutputStream


复制文件

public class Test {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File src = new File("G://html_code//img//2.jpg");
            File dest = new File("c://Users//18369//Desktop//copy.jpg");
            fis = new FileInputStream(src);
            fos = new FileOutputStream(dest);
            int len;
            byte[] buf = new byte[5];
            while((len = fis.read(buf)) != -1){
                fos.write(buf,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

9-2-7处理流之缓冲流



使用BufferedReader、BufferedWriter复制文件

使用BufferedInputStream、BufferedOutputStream复制文件

public class Test {
    public static void main(String[] args) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //1.造文件
            File src = new File("G://html_code//img/py3.jpg");
            File dest = new File("C://Users//18369//desktop//copy.jpg");
            //2.造流
            //2.1造节点流
            FileInputStream fis = new FileInputStream(src);
            FileOutputStream fos = new FileOutputStream(dest);
            //2.2造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            //3.复制的细节:读取、写入
            int len;
            byte[] buf = new byte[10];
            while((len = bis.read(buf)) != -1){
                bos.write(buf,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(bis != null){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bos != null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //4.资源关闭
        //要求1:先关闭外层的流,再关闭内层的流
        //说明:关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略
    }
}

统计字符个数

9-2-8处理流之转换流



InputStreamReader的使用,实现字节的输入流到字符的输入流的转换

综合使用InpuStreamReader、OutputStreamWriter(读取编码格式为utf-8的文件,并将其以gbk编码方式输出)

9-2-9处理流之标准的输入输出流


9-2-10处理流之打印流


9-3-11处理流之数据流


作用:用于读取或写出基本数据类型的变量或字符串

9-2-12处理流之对象流


对象的序列化机制【重点 只是借助对象流来讲解】

一、序列化过程

二、反序列化过程

三、自定义类实现序列化和反序列化的操作
1、自定义可序列化类的要求

2、serialVersionUID的理解

3、实际中使用JSON将对象变为字符串,再进行序列化

9-2-13RandomAccessFile

一、实现数据的读写操作





二、实现数据的插入


9-2-14【当前阶段不重要,可以不看】







10网络编程

10-1网络编程概述



10-2通信要素

一、IP



二、端口号

三、协议

10-3TCP编程

一、



二、
由于read方法是阻塞的所以服务器端一直等待客户端的数据发送。不会执行之后的代码。所以需要客户端关闭数据输出告诉给服务器终止发送,让其停止接收。

10-4UDP编程


10-5URL



11反射

11-1概述

Class是用来描述类的类



11-2代码层面理解

反射之前的操作

利用反射的操作

11-3利用反射调用类的私有结构

一、在Person类外部, 不可以通过Person类的对象调用其内部私有结构。
二、通过反射,可以调用Person类的私有结构的。比如:私有的构造器、方法、属性

public class Test {
    public static void main(String[] args) throws Exception {
        Class clazz = Person.class;
        Constructor cons = clazz.getDeclaredConstructor();
        Person p = (Person)cons.newInstance();
        //获取私有方法
        Method showNation = clazz.getDeclaredMethod("showNation", String.class);
        showNation.setAccessible(true);
        String nation = (String)showNation.invoke(p,"中国");//相当于String nation = p.showNation("中国");
    }
}
class Person{
    private String showNation(String nation){
        return nation;
    }
}

11-4如何看待反射和封装性

一、封装性是建议我们如何调用相关结构
二、反射解决的是我们能不能调用某些结构。二者并不矛盾

11-5关于Class类的理解


11-6获取Class实例的4种方式



常用第三种方式获取Class实例

11-7Class实例对应的结构


11-8类的加载与ClassLoader理解

11-8-1类的加载过程理解



11-8-2ClassLoader的理解



11-8-3利用ClassLoader读取配置文件

11-9创建运行时类的对象

11-10体会反射的动态性



11-11获取运行时类的属性结构及其内部结构



获取属性的内部结构

11-12获取运行时类的方法结构


获取运行时类的方法的内部结构



框架可以看做 注解+反射+设计模式

11-13获取运行时类的构造器结构

11-14获取运行时类的父类及父类的泛型


获取运行时类带泛型的父类


获取运行时类带泛型的父类的泛型

11-15获取运行时类的接口、所在包、注解等

获取接口

获取所在包

获取注解

11-15获取运行时类中指定的属性

getField()只能获取public的属性

11-15获取运行时类中指定的方法

11-16获取运行时类中指定的构造器

12动态代理


静态代理的特点:代理类和被代理类在编译期间就确定下来了

12-1动态代理的举例





二、

13jdk8其它新特性

13-1Lambda表达式

一、

二、

13-2Lambda表达式的使用



13-3函数式接口





13-4方法引用


一、


二、


三、

13-5构造器引用



13-6数组引用

13-7Stream API




13-7-1创建Stream的方式

一、通过集合


二、通过数组


三、通过Stream的of()


四、创建无线流

13-7-2Stream的中间操作


一、筛选与切片



二、映射



三、排序

13-7-3Stream的终止操作


一、匹配与查找





二、归约

三、收集


Collectors:

13-8Optional类



13-8-1使用举例

14拓展

14-1JavaBean

一、是一种Java编写的可重用组件
二、是指符合以下标准的Java类
1、类是公共的
2、有空参构造器
3、有属性及其对应的get、set方法

14-2MVC设计模式

一、将整个程序分为三个层次
1、视图层(view):显示数据
2、模型层(model):主要用来处理数据
3、控制层(controller):处理业务逻辑
二、好处
1、这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式,使程序结构变的灵活而且清晰
2、同时也描述了程序各个对象间的通信方式,降低了程序的耦合性

14-3JDK中主要包的介绍

14-4设计模式

一、创建型模式(5种)
工厂方法模式
抽象工厂模式
单例模式
建造者模式
原型模式
二、结构型模式(7种)
适配器模式
装饰器模式
代理模式
外观模式
桥接模式
组合模式
享元模式
三、行为型模式(11种)
策略模式
模板方法模式
观察者模式
迭代子模式
责任链模式
命令模式
备忘录模式
状态模式
访问者模式
中介模式
解释器模式

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服