JAVASE回顾

发展


  • 1995年出世,三大模块SE、ME、EE,

  • 目前的主流核心还是EE,2006年出了新的发展趋势

  • Hadoop 大数据方向

JDK、JRE


JAVA开发工具包 配置环境变量 JAVA_HOME PATH CLASSPATH

java7之后可以不用再配置classpath

.;%Java_Home%\bin;%Java_Home%\lib\dt.jar;%Java_Home%\lib\tools.jar

在JDK1.5以后,classpath并不是必须配置了,在JDK1.5之前,是没有办法在当前目录下加载类的(找不到 JDK目录下lib文件夹中的.jar文件),所以我们需要通过配置classpath,但JDK1.5之后,JRE能自动搜索目录下类文件,并且加载dt.jar和tool.jar的类。
通过官方的文档说明,rt.jar和tools.jar这两种属于java平台自身的包就不需要添加到classpath中,只有一些第三方类或者自定义类需要,也并不推荐使用配置CLASSPATH的方法,更推荐使用-classpath选项

java -classpath=%PROJECT_HOME%\xx\lib\ -jar xxxx.jar

JRE-java运行环境 java程序运行的基本环境,没有该环境即不可运行java程序

Hellow World


publicclassHellowWorld{

publicstaticvoidmain(String[] args){

System.out.println("Hellow World!");

}

}

#编译java文件

javac HellowWorld.java

#执行编译后形成的class文件

java HellowWorld.class

Java基础语法


注释

  1. 单行注释 也叫行内注释 //

  1. 多行注释 /* */

  1. 文档注释 /** */ javadoc命令生成帮助文档

关键字(标识符)

关键字

含义

abstract

表明类或者成员方法具有抽象属性

assert

断言,用来进行程序调试

boolean

基本数据类型之一,声明布尔类型的关键字

break

提前跳出一个块

byte

基本数据类型之一,字节类型

case

用在switch语句之中,表示其中的一个分支

catch

用在异常处理中,用来捕捉异常

char

基本数据类型之一,字符类型

class

声明一个类

const

保留关键字,没有具体含义

continue

回到一个块的开始处

default

默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现

do

用在do-while循环结构中

double

基本数据类型之一,双精度浮点数类型

else

用在条件语句中,表明当条件不成立时的分支

enum

枚举

extends

表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口

final

用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量

finally

用于处理异常情况,用来声明一个基本肯定会被执行到的语句块

float

基本数据类型之一,单精度浮点数类型

for

一种循环结构的引导词

goto

保留关键字,没有具体含义

if

条件语句的引导词

implements

表明一个类实现了给定的接口

import

表明要访问指定的类或包

instanceof

用来测试一个对象是否是指定类型的实例对象

int

基本数据类型之一,整数类型

interface

接口

long

基本数据类型之一,长整数类型

native

用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的

new

用来创建新实例对象

package

private

一种访问控制方式:私用模式

protected

一种访问控制方式:保护模式

public

一种访问控制方式:共用模式

return

从成员方法中返回数据

short

基本数据类型之一,短整数类型

static

表明具有静态属性

strictfp

用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范

super

表明当前对象的父类型的引用或者父类型的构造方法

switch

分支语句结构的引导词

synchronized

表明一段代码需要同步执行

this

指向当前实例对象的引用

throw

抛出一个异常

throws

声明在当前定义的成员方法中所有需要抛出的异常

transient

声明不用序列化的成员域

try

尝试一个可能抛出异常的程序块

void

声明当前成员方法没有返回值

volatile

表明两个或者多个变量必须同步地发生变化

while

用在循环结构中

数据类型

基本数据类型(四类八型)
整数

byte(1字节)、short(2字节)、int(4字节,整数默认类型)、long(8字节)

浮点数(小数)

float(4字节)、double(8字节,小数默认类型)

扩展:金融计算BigDecimal 用BigDecimal.valueOf()或者BigDecimal(String)方法避免精度丢失,禁止使用BigDecimal(double)方法初始化BigDecimal值

字符型

char(2字节)

布尔类型

boolean(1位,0、1)

引用数据类型
  • 类引用

  • 接口引用

  • 数组

类型转换

自动类型转换

低转高,父类引用指向子类;

强制类型转换

高转低,父转子

转义字符

\n 换行

\b 退格

\n 换行

\r 回车

\t 制表

\\ \

\" " ...

进制转换

  • 0b 二进制

  • 0x 十六进制

  • 0 八进制

变量和常量

变量声明

type varName = [xxx];可以不赋值初始化

变量作用域
  • 类变量

  • 实例变量

  • 局部变量

常量

final MAX_VALUE = 10;

命名规范

  1. 见名知意

  1. 驼峰命名

  1. 类首字母大写

  1. 常量全大写 下划线分割

  1. 禁止使用拼音命名

运算符

算数运算符
  • + - * /

赋值运算符

=

关系运算符
  • > < >= <= == != instanceof

逻辑运算符

&& || !

位运算符

& | ~ ^ >> << >>>

条件运算符(三元运算符)

? :

扩展运算符

+= -= *= /=

java的包机制

  • 域名倒写,防止命名冲突

  • package必须位于第一行

  • import

javadoc

  • jdk帮助文档

  • javadoc命令 @author @version @since @param @return文档注解

流程控制


顺序结构

默认结构,程序计数器+执行引擎自上而下的抽取指令执行

选择结构

  • 单分支 if

  • 双分支 if-elsse

  • 多分支 if-else if-else

  • switch case break defau switch的穿透现象 不写break就会依次执行,都会执行;同时,java7之后,switch case支持了字符串

循环结构

  • while

  • do while

  • for

  • foreach for(type var : varArrayList) 也叫增强for循环,之所以称之为增强是因为foreach在遍历的时候,禁止对遍历的数组或者集合进行长度变化,因而保证了遍历的安全性,同时减少代码书写以及省略了终止条件的变化迭代运算;至于效率,通过测试,可知在固定数量的大额循环中,运用下标形式存取的数据结构,for效率略强于foreach;运用引用指针形式存取的数据结构foreach效率远强于for

break&continue&return

  • break 跳出当前循环

  • continue 跳过本次循环体

  • 带标签的continue(类似goto 了解,目前已废弃)

  • return 结束方法 返回返回值或引用 如果return位于finally之前执行 那么return过程中就会执行当前方法的finally块,finally执行完毕后 return也随之完成

方法


什么是方法?

语句块的集合,封装完成任务的语句块即为方法

方法的声明

修饰符 返回值类型 方法名(参数列表){

方法体

return返回值

}

方法的调用

  • 静态方法调用 类名.方法名(入参)

  • 对象方法调用 对象名.方法名(入参)

方法重载(Reload)

方法名相同,参数列表不同

方法重写(Overwrid)

重写父类方法体,其余不变

可变长参数

  1. 必须位于参数列表末端

  1. 可变长参数会以指定类型的数组形式加入参数列表,如不传,则在获取时会给一个空数组而非null

递归

自身调用自身,必须设置递归终止条件,不然会发生栈溢出StckOverFlowError

数组


数组的定义


  1. int[] array=newint[5];


  1. int[] array= {1, 2, 3, 4 ,5};

排序算法

  1. 冒泡排序

  1. 选择排序

  1. 插入排序

  1. 快速排序

  1. 归并排序

  1. 希尔排序

  1. 堆排序

  1. 基数排序

常用类 Arrays

面向对象


类与对象

  • 类是对象的抽象 对象是类的具体 类是作为构造对象的模板存在的

构造方法(构造器)

构造器的重载

默认有无参构造器,如果添加了有参构造器,则需手动添加无参构造器;单例模式需要私有构造器

new 对象

栈存放引用,堆存放具体对象

封装

私有属性,提供公共存取器方法

继承

  • extends this super关键字

  • 所有对象都继承自超类Object

  • 子类拥有父类全部特性 除开父类私有

多态

  1. 父类引用指向子类对象

  1. instanceof关键字,如果匹配,可进行类型之间的转换

修饰符


public protected private static final abstract

接口(interface)


  1. 用implement关键字实现

  1. 约束,只能定义方法名,无方法实现(注意 java8之后,可以添加default方法和static修饰的方法,可以拥有方法体,default方法在实现单个接口时不用重写,但多个接口实现中,default方法重名的,需要实现类重写default方法)

  1. 接口中没有变量的说法,所有声明的变量都会被解释成用 static final修饰,所以也可以说接口中没有变量,只有常量,在声明时,必须给予其初始值

  1. 只有一个方法的接口,叫做函数式接口,可以用lambda表达式简化

  1. 接口比抽象类更抽象

抽象类


  1. 用abstract修饰符修饰的类称为抽象类

  1. 抽象类不能被实例化,但必须拥有构造器,至少是无参构造,因为在子类继承时需要先调用父类构造器

  1. 抽象类受限于java继承机制,只能被单继承,和接口不同

  1. 抽象类中既允许有抽象方法,也允许有普通方法,并且,抽象类中允许有自身的成员变量,这也和接口不同

内部类

  • 局部内部类

  • 静态内部类

  • 匿名内部类

异常


  • Throwable是异常总接口 两个实现 Exception Error

  • Exception 分为运行时异常(RuntimeException)和检查时异常,也称为受检异常和非受检异常

常见运行时异常

  • ClassNotFoundException

  • NullPointException

  • UnKnownTypeException

  • IndexOutOfBoundsException...

Error

  1. AWTError

  1. JVMError StackOverFlowError OutOfMemoryError

五个关键字

try catch finally throw throws

自定义异常

继承Exception类即可

常用类


Object类

  • hashCode()

  • toString()

  • clone()

  • getClass()

  • notify()

  • wait()

  • equals()

  • finalize()

String类

String的不可变性,定义后会存放在字符串常量池中,长度不再可变化,会直接进入常量的生命周期中进行流转

  • charAt()

  • reverse()

  • indexOf()

  • isEmpty()...

StringBuffer类

可变长,性能不如StringBuilder,但线程安全

StringBuilder类

可变长,性能高于StringBuffer,但线程不安全

Math类

常见是数学运算,金融的计算用BigDecimal类

Random类

File类

  • 创建文件 createFile()

  • 查看文件

  • 修改文件

  • 删除文件 removeFile()

包装类

八大基本数据类型都有包装类,自动装箱和拆箱

Date类(目前推荐使用Calendar类)

Date SimpleDateFormate 注意格式 yyyy-MM-dd HH:mm:ss

集合框架


Collection

集合总接口 下属三个子接口 List(列表) Set(集合) Queue(队列)

List(有序可重复)
ArrayList

数组集合,以下标形式存储

  • add()

  • remove()

  • contains()

  • size()

LinkedList

链表集合

  • push()

  • pop()

  • getFirst()

  • getLast()

  • removeFirst()

  • addFirst()...

Vactor

和ArrayList一样,只是线程安全,用来实现Stack

Set(无序不可重复)
HashSet

运用Hash算法的Set,允许空值,无序,通过重写hashCode和equals方法来保证数据唯一

TreeSet

运用红黑树算法,有序,用Compareable接口的compareTo方法保证数据唯一

Queue

队列集合,后续补充

Map

散列总接口,代表为HashMap、TreeMap等

HashMap
  1. java7以前,用数组+链表形式实现,java8后用数组+链表+红黑树实现,增加红黑树主要用于解决扩容闭环的问题

  1. HashMap是Map实现类里,效率最高的一个,但是在java8以前,他线程不安全,java8提供的ConcurruentHashMap解决了这个线程不安全的问题,在这之前,线程安全问题都是用HashTable代替来解决

  1. HashMap允许一个key为空,多个value为空,Hashtable不允许任何空元素

TreeMap

运用红黑树算法实现的Map,只要是Tree,那就有序,当然这个有序指的是字典排序,不是直观的视觉排序

泛型

java5引入,用于约束对象类型,常和集合连用,避免类型的强制转换,可以通过反射操作获取泛型的参数类型进行操作

IO流(I输入O输出)


字符流

  • Reader

  • Writer

字节流

  • InputStream

  • OutputStream

转换流

负责字符流和字节流的转换,也属于处理流,因为是重点所以单独划出

  • InputStreamReader

  • OutputStreamWriter

处理流

  • BufferInputStream

  • BufferOutputStream

  • FilterInputStream

  • FilterOutputStream

  • FileInputStream

  • FileOutputStream

  • DataInputStream

  • DataOutputStream

  • BufferReader

  • BuffeWriter

  • FilterReader

  • FilterWriter

  • FileReader

  • FileWriter...

序列化

  • 实现Serializable接 标记性接口 来序列化

  • transient关键字修饰的阻止序列化

多线程


进程

标识程序运行的标志,程序运行必然会有进程存在,当然不一定是一个进程,可能有进程树

线程

CPU调度执行任务的单位,一个进程可能拥有多个线程

线程的创建方式
  1. 继承Thread类(实际上Thread类本身也实现了Runnable接口),Thread调用线程时会调用native方法start(0),调用底层c去交互机器

  1. 实现Runnable接口,Runnable接口为函数式接口,可以用Lambda表达式简化代码

  1. 实现Callable接口 Callable接口可以有返回值,Runnable没有返回值

  1. Thread实现了Runnable接口,属于函数式接口调用,因而可以使用静态代理模式书写代码

newThread(newRunnable{

run(){

/**

run方法重写

*/

}

}).start();

也可以用lambda表达式简化书写

newThread(()->{

/**

run方法重写

*/

}).start();

lambda表达式诞生旨在减少内部类定义过多,代码冗余

常用方法
  • sleep() 睡眠 不释放锁

  • join() 强制插队,无论其余线程状态如何是否正在运行,直接强行插入立即执行,执行完成后再继续其余线程

  • yield() 礼让 重新竞争调度,并不一定礼让成功

  • isLive() 是否存活

  • start() 开启线程,进入就绪状态,等待CPU调度执行

  • setPriority() 设置优先级 1-10 10最高,1最低 main线程默认为5,设置了优先级只是增加了cpu优先调度的权重,并不一定会优先成功

  • interruput() 中断 不建议使用

  • stop() 停止 不建议使用

  • wait() 等待 释放锁

  • notify() 唤醒线程,进入就绪状态

线程同步
  • 因为线程的调度权在CPU手上,无法确定线程的执行顺序,从而造成多线程程序并没有固定的执行顺序,因此,线程同步就是来解决这个问题,使得多线程按照我们制定的顺序和规则去执行,从而控制多线程,使得多线程开发变得可能

  • java采用队列+锁的方式,来实现线程的同步,当一个线程持有锁的时候,其余需要访问锁的线程自动排队等待锁的释放,从而操控线程执行的有序性

  • synchronize关键字 可修饰属性、对象、方法或代码块,用来给修饰的东西加锁

  • 同步方法,就是用synchronize修饰的方法,他会锁住方法内使用的所有东西,在多线程面前显得锁太多,影响效率,为同步方法的最大弊端,建议减少同步方法的书写

privatesynchronizevoiddo(){

/**

同步方法体

*/

}

  • 同步代码块,用synchronize修饰的代码块,为我们常用的同步书写方式,他相对于同步方法加锁更加具有局部性

privatevoiddo(){

synchronize(锁定对象){

/**

需要锁定的执行体

*/

}

}

死锁

死锁是一个概念,他表示在多线程的程序中,两个或多个线程各自持有部分对象的锁并同时在请求对方所持有的对象的锁,导致线程运行都被永久阻塞的情况

死锁产生有四个必要条件,我们解决死锁的问题,也只需要考虑打破其中之一

死锁的四个必要条件
  1. 资源使用的互斥,一个资源只能同时被一个线程使用,不能被多个线程同时使用

  1. 请求与保持,当资源请求者在请求其他的资源的同时保持对原有资源的占有

  1. 不可剥夺,资源在使用过程中不能被强制停止使用并释放,只能由使用者进行主动释放称为资源不可剥夺

  1. 循环等待,线程因为请求不到资源,而阻塞等待,同时也持有自身拥有的锁不释放,持有的锁也被其他线程所请求而造成叠加等待的死环,注意区别于死锁的概念,死锁是四个条件同时存在时才会出现,打破任何一个条件,都可以打破死锁

Lock锁

java.util.concurruent包下的用于多线程开发的安全锁,是官方推荐最优先使用的用于多线程开发的锁类,代表有ReentrantLock(可重入锁),他相对synchronize多封装了部分方法,支持手动上锁、尝试上锁和解锁

  • lock()

  • tryLock()

  • unlock()...

线程通信

因为线程是接受CPU调度互相独立执行任务,光规定了线程的执行顺序并不能让下一个线程知晓上一个线程的执行状态,多线程开发不具有时效性是不行的,我们需要让下级任务的线程及时知晓上级线程的执行状态,从而决定下级线程的执行方案,才能操控多线程协作处理复杂任务,为解决此问题,线程通信诞生,我们通常采取缓冲区和标志位(也叫信号灯)的方式来解决线程之间的通信问题

缓冲区模式
信号灯模式
两个超类方法
  1. wait(); 等待

  1. notifyAll(); 唤醒所有

线程池

池化技术,池的大小、最大连接数、保持时间等七个参数

GUI(图形用户界面)
  • AWT包

  • SWING包

目前,JAVAEE的使用上,Swing和Awt使用几乎没有,有时间的时候再梳理

注解和反射


注解
  1. 元注解

  1. 内置注解

  1. 自定义注解

  1. 文档注解(也可归类到内置注解)

  1. 反射读取注解,可以应用到自身编程中,可自行实现Spring的Autowride

反射

反射可称之为java独有的且最强构建对象机制,他呼应java主题,以Class模板来实例化对象以及对象中的成员属性和执行方法,反射加注解也是多数框架包括Spring的IOC容器在内的主流构建方式

  • 反射实例化对象class的newInstance();无参构造器构造

  • 类加载机制,双亲委派、沙箱安全

  • 破坏私有setAccessible(true),可攻破不完善的单例模式

  • Method和Field,invoke()执行方法

  • constructor,他的newInstance()方法,获取的时候需要传递参数的class类型

  • 性能分析,正常创建的对象>检测关闭的反射(setAccessible(true))>默认的反射

  • 反射获取注解、泛型

  • 单例模式的探究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值