JavaSE
2020-04-02 14:15:42 0 举报
AI智能生成
JavaSE知识点
作者其他创作
大纲/内容
基础语法
数据类型
8种基本数据类型
数值型
整型
byte
short
int
long
浮点型
float
double
字符型char
布尔型boolean
引用类型
类
接口
数组
枚举类型enum
类型转换
基本类型转引用类型
运算符与表达式
算术运算符
关系运算符
赋值运算符
位运算符
移位运算符
流程控制结构
顺序结构
选择结构
循环结构
方法重载 Overload
针对于同一个类或接口而言
同一个类中的多个同名方法之间参数列表必须不同。与返回值是否相同无关
方法重写/覆盖 Override
以继承为基础,子类可以覆盖父类实现的方法,实现自己的功能。
1、要保证子类中重写的方法签名要和父类一致,即返回值、方法名、参数列表必须完全一致; 2、子类抛出的异常不能超过父类相应方法抛出的异常 (子类异常不能大于父类异常);3、子类中重写的方法访问控制权限不能低于父类。
不允许方法重写的两种特殊情况
private关键字修饰的方法
final关键字修饰的方法
面向对象
对象
在软件系统中视一切事物皆为对象,不仅包括现实中客观存在的事物,还包括抽象的东西
类
对于同一类型对象的抽象表达
接口
对行为的抽象表达,可以看作是一种协议
其中仅包含对行为的定义,不包含具体实现
三大特性
封装
对内将对象具有的特征与行为进行统一管理; 对外隐藏实现细节,仅提供公开接口。
属性
用于表达对象具有的某些特征,如大小、颜色等
方法
定义一系列对属性进行操作的行为
继承/派生
用于子类对父类的功能的扩展
表现形式
子类继承父类
子类实现接口
多态
即多种形态,通常表现于接口或抽象类中抽象方法的不同实现
表现形式就是方法重写
七大设计原则
单一职责原则
简单而言,就是使类所具有的功能尽量单一。
开闭原则
对扩展开放,对修改关闭。
依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象
针对抽象(抽象类或接口)编程,而不是针对实现编程。
里氏替换原则
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
接口隔离原则与单一职责原则区别: 其一,单一职责原则注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
合成复用原则
复用时要尽量使用组合/聚合关系(关联关系),少用继承。
迪米特法则
一个软件实体应当尽可能少地与其他实体发生相互作用,低耦合。(不要和“陌生人“说话)
UML建模(visio工具)
常用的几类图:包括类图、用例图、时序图、状态图等
常用包
java.lang、java.io、java.util
java.lang.reflect、java.net、java.nio、java.util.concurrent
AWT
Abstract Window Toolkit,抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具
Swing
对AWT的扩展,更好的实现Java图形化编程
IO
区分阻塞、非阻塞、同步、异步
阻塞:等待结果返回,当前操作线程被挂起,后续操作被阻断 非阻塞:不等待返回结果,直接执行后续操作
同步:轮询模型 异步:监听模型
序列化与反序列化
序列化
序列化类型
JDK Serializable 对象序列化
ObjectInputStream、ObjectOutputStream
JSON 序列化
Fastjson、Jackson、Gson等库
XML 序列化
XStream、JAXB等
序列化协议
反序列化
IO(同步阻塞IO)
字节流/字符流
对象序列化
实现Serializable接口
readObject(ObjectInputStream ois)、writeObject(ObjectOutputStream oos)方法
文件操作(磁盘读写)
创建/删除文件
读/写文件
NIO(同步非阻塞IO),利用多路复用技术
传统IO(BIO)与NIO的区别:IO是面向流的,NIO是面向缓冲区的
主要组成
Channel(通道,双向)
多路复用。传统IO的流是单向的,不能同时用来进行读写操作,而Channel则是双向的
通过open()静态方法打开一个通道
Selector(选择器)
Selector类是NIO的核心类,它能够检测多个注册的Channel上是否有事件发生,如果有事件发生,便获取事件然后进行相应的处理
通过Selector.open()静态方法选择一个事件进行处理
Buffer(缓冲区)
其作用相当于BIO编程中常用的基本类型数组(byte[]、char[]等), 比如ByteBuffer就是对byte数组进行的封装,使得操作起来更方便。1、使用的是堆外内存,不受GC管理(GC主要是堆内存)2、非线程安全
Netty/Mina框架
基于NIO的网络框架,通常用于分布式应用开发中进行网络数据传输
AIO(异步非阻塞IO)
输入流/输出流
字节流/字符流
多线程
线程与进程
线程是程序的最小执行单元
进程是操作系统进行资源分配和调度的一个基本单位
关联:一个程序至少有一个进程,一个进程又至少包含一个线程
引入线程的目的是充分利用CPU资源,使其可以并行处理多个任务,减少时间消耗
线程分类
用户线程User Thread
一般是程序中创建的线程
守护线程Daemon Thread
为用户线程服务的线程当所有非守护线程结束时才会被终止。如JVM的垃圾回收、内存管理等。
通过thread.setDaemon(true)来将一个线程变成守护线程
线程的生命周期
六种状态
新建状态New
Thread类
实现了Runnable接口
run方法,无返回值
Runnable接口
run方法,无返回值,通过Thread类或线程池来使用
Callable接口
作为FutureTask构造方法参数使用
call方法,有返回值,且可以抛出异常
call方法实际是在Runnable的run方法中被执行
就绪状态Runnable
调用线程的start()方法
不一定会立即运行,可能需要等待CPU分配时间片
阻塞状态Blocked
调用Object的wait方法后等待同步锁的状态
等待Waiting
发生在调用以下几个方法时: 不带参数的Object.wait()不带参数的Thread.join()LockSupport.park()
超时等待Timed-Waiting
与Waiting状态不同在于不会一直等待,而是等待指定的时间
发生在调用以下几个方法时: Thread.sleep()Object.wait(long timeout)Thread.join(long timeout) LockSupport.parkNanos()LockSupport.parkUntil()
终结状态Terminated
当线程运行完毕即死亡
Thread类的常用方法
Thread.sleep()方法
1、sleep方法是Thread类的静态方法,是为了保证该操作只对当前线程有效,避免线程安全问题,其它几个常用静态方法类似。 2、让当前正在运行的线程暂时停止运行,一段时间后会继续执行。
Thread.yield()方法
当前处于运行状态的线程主动放弃占用的CPU资源,转变为就绪状态,让其他先线程执行(让步)
join方法
在当前线程执行过程中引入另一个线程,并且当前线程需要等待另一个线程执行完毕后才能继续执行
Thread.currentThread()方法
获取当前正在运行的线程
停止线程的方法
Thread.stop方法:已废弃
使用一个标识来表示线程的状态,通过更改它的值来控制线程的运行和停止
interrupt 中断方法
让多个线程顺序执行的方式
利用Thread的join方法
线程间通信
wait方法
notify方法
这三个方法用于协调多个线程对共享数据的存取(获取锁和释放锁),所以必须先获得锁(即在synchronized语句块内使用),否则会抛出IllegalMonitorStateException异常。
notifyAll方法
定时任务
Timer & TimerTask类
Timer:任务调度器,通过schedule(TimerTask task, long delay)等方法进行调度。 TimerTask:实现了Runnable接口。表示需要调度的任务,里面有一个run方法定义具体的任务。
Timer缺点:内部是单线程,因此如果有异常产生,线程将退出,整个定时任务就会失败
线程池
ScheduledExecutorService,它是ExecutorService的子接口。弥补了Timer的缺陷
通过 scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)和scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)等方法来实现定时任务调度
异步任务
只需创建并启动一个线程执行该任务即可,或者使用线程池更好
并发编程
JUC
线程池
作用
1、减少资源消耗。通过重复利用池中已创建的线程,减少频繁创建、销毁线程带来的资源消耗。 2、提高响应速度。当线程池中有空闲线程,任务到来时无需创建线程就能立即被执行。 3、提高线程的可管理性。由线程池对池中的线程进行统一的管理和监控,可以防止无限制创建线程造成的资源浪费。
ExecutorService接口
ThreadPoolExecutor类
Executor的子类
Executors工具类
包含创建线程池的工厂(静态)方法
线程池大小配置
一般需要根据任务类型来配置线程池大小: 1、如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU+12、如果是IO密集型任务,参考值可以设置为2*NCPU
通过Runtime.getRuntime().availableProcessors()获得当前CPU个数
原子操作类,如AtomicInteger
使用CAS无锁技术保证变量的操作在多线程环境下正常,比synchronized控制的粒度更细、量级更轻,并且在多核处理器具有高性能
并发集合
ConcurrentHashMap
Java7引入分段锁技术Segment
Java8开始加入红黑树
CopyOnWriteArrayList
从字面上看就是”写时复制“。原理是当需要对集合中元素进行增删改操作时首先复制一个副本,对副本进行操作
适用于“读多写少”的并发场景
BlockingQueue
阻塞队列: 1)当队列为空时,获取元素的线程会等待队列变为非空;2)当队列满时,存储元素的线程会等待队列可用。内部通过Lock与Condition(即通过等待/通知机制)实现,通常用于生产者-消费者场景
ArrayBlockingQueue:有界队列,即队列容量有限,内部是数组结构
LinkedBlockingQueue:既可以是有界队列,又可以是无界队列。若创建时不指定容量,则默认是Integer.MAX_VALUE
SynchronousQueue:同步队列
不保存元素
PriorityBlockingQueue:优先级队列
属于无界队列,按照队列中的任务优先级由高到低进行处理
通过Comparator比较器来决定优先级
ThreadLocal线程本地变量
1、它为每个线程都提供一个独立的变量副本,各个线程都可以改变自己的变量副本,各个线程间互不影响。因此可以解决并发问题。 2、实现的思路:①在ThreadLocal类中有一个静态内部类ThreadLocalMap,用于存储每一个线程的变量副本,键为ThreadLocal对象,而值则是对应线程的变量副本;②每个ThreadLocal实例都有一个唯一的threadLocalHashCode(这个值将会用于在ThreadLocalMap中找到ThreadLocal对应的value值)。3、工作原理:①在Thread类中维护一个ThreadLocalMap变量(与线程进行绑定);②取值get操作:从ThreadLocal中取变量值时先获取当前线程,通过当前线程得到与之关联的ThreadLocalMap,然后再从ThreadLocalMap中根据当前ThreadLocal获取到其中的变量值(如果ThreadLocalMap为空,则返回初始化方法initialValue()的值);set操作类似。
CountDownLatch (倒计数器)
利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他几个任务执行完毕之后才能执行,就可以使用CountDownLatch来实现。
两个关键方法:await()等待其它线程执行完毕才开始执行、countDown()当有一个线程执行完毕就减1,当减到0时当前线程开始执行。
CyclicBarrier(回环栅栏)
通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。
关键方法:await()方法,此方法作用是等待其它线程都到同一状态时开始同时执行。类似于长跑比赛中,当所有运动员都准备完毕才开始比赛。
Fork/Join 多线程并行框架
利用分而治之的思想,将大任务分成小任务执行,然后合并结果;分别对应fork、join两个操作。
Fork/Join框架的核心是ForkJoinPool类,它是对AbstractExecutorService类的扩展。 ForkJoinPool实现了工作窃取(work-stealing)算法,并可以执行ForkJoinTask任务。
线程同步
volatile
线程每次都从主内存中读取变量,改变后再写回到主内存。其作用如下: 1、使变量在多个线程间具有可见性;2、禁止JVM进行指令重排序(保证有序性)。
不能保证原子性,非线程安全
应用场景
一写多读,保证变量可见性
开销较低的读写锁策略
只在写操作时需要加synchronized同步锁,读操作不需要
synchronized
在JVM层面实现了对临界资源的同步互斥访问,锁的释放不用人工干预,由虚拟机完成
1、在volatile基础上增加了互斥锁,所谓“互斥”就是同一时间只能有一个线程操作该资源; 2、在JDK1.5以后,为了弥补synchronized的不足,引入了Lock来代替它,将同步锁对象换成了Condition对象,并且Condition对象可以有多个。
用法
同步代码块
通常将外界资源作为锁的对象
synchronized(obj) { // 同步操作代码}
用于保护外界资源不被多个线程并发修改
与同步方法比较而言,使用同步代码块的好处在于其他线程仍可以访问同步代码块以外的代码
同步方法
锁的对象是当前调用对象this
public synchronized void test() { // 同步操作代码}
用于保护对象属性值不会被多个线程并发修改,因此需要保证调用方法的对象是同一个才有意义
同步静态方法
锁的对象是类的Class对象
public static synchronized void test() { // 同步代码}
用于保护类的静态属性值不会被多个线程并发修改
缺点: 1、无法知道是否成功获取到锁2、如果是多个线程需要同时进行读操作,一个线程读操作时其它线程只有等待(互斥)
Lock接口
JDK层面实现的互斥锁,比起synchronized可控性更强,弥补了synchronized的不足。使用后必须手动释放锁,否则可能会导致死锁
包含lock(如果没获取到,会一直阻塞直到成功获取到锁)、tryLock(尝试获取锁,如果没获取到不会一直阻塞,可以指定等待时间)、unlock(释放锁)几个常用方法,都需要显示调用。
其实现类有:ReadLock(读锁)、WriteLock(写锁)、ReentrantLock(可重入锁)等
Condition接口
提供了类似Object类中wait、notify、notifyAll的方法,主要包括await、signal、signalAll方法, 与synchronized和wait、notify/notifyAll的搭配类似,这些方法与Lock锁配合使用也可以实现等待/通知机制
无锁技术CAS
CAS即Compare And Swap的缩写。Java中的原子操作类如AtomicInteger底层就是依赖它实现的。 实现原理:CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
线程死锁
产生死锁的四个必要条件
互斥条件:资源不能被共享。即任一时刻一个资源只能给一个进程使用,其他进程只能等待,直到资源被占有者释放。不可剥夺条件:已经分配的资源不能从相应的进程中被强制地剥夺,而只能由获得该资源的进程自愿释放。请求和保持条件:已经得到资源的进程可以再次申请新的资源。循环等待条件:系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
预防死锁的方法
合理对资源进行动态分配,以避免死锁
破坏死锁产生的四个必要条件
网络编程
Socket
基于TCP/UDP,它是为进行TCP/UDP编程提供的API
URL、URLConnection、HttpURLConnection
InetAddress
反射机制
涉及到的类或接口
Class(表示一个类或接口)、Constructor(构造方法)、Method(方法)、Field(对应接口或类中的属性)、 Modifier(修饰符private、protected、public、static、final等)、ParameterizedType(泛型参数类型)等
JavaBean的内省
针对JavaBean的反射,包括BeanInfo、PropertyDescriptor(属性描述器)、Introspector(工具类)等常用类或接口
注解
注解(Annotation),也叫元数据。是一种代码级别的说明。
分类
元注解
@Target
用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有: 1、CONSTRUCTOR:用于描述构造器2、FIELD:用于描述字段3、LOCAL_VARIABLE:用于描述局部变量4、METHOD:用于描述方法5、PACKAGE:用于描述包6、PARAMETER:用于描述参数7、TYPE:用于描述类、接口(包括注解类型) 或enum声明如:@Target(ElementType.TYPE)
@Retention
用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有: 1、SOURCE:在源文件中有效(即源文件保留)2、CLASS:在class文件中有效(即class保留)3、RUNTIME:在运行时有效(即运行时保留)如:@Retention(RetentionPolicy.RUNTIME)
@Documented
将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。
@Inherited
允许子类继承父类的注解
@Repeatable (Java8新增)
允许注解使用多次
内建注解
@Override
供编译器检查,保证方法重写正确
@Deprecated
标记过时的方法或类型,并建议在javadoc指明替代方法或类型
@SuppressWarnings
使编译器忽略警告
@FunctionalInterface (Java8新增)
供编译器检查,接口是否满足函数式接口条件
自定义注解
区别于接口定义,使用@interface进行声明
泛型
?通配符
只读型容器
定界符super、extends
集合框架
Collection接口
Set接口
HashSet
LinkedHashSet
SortedSet接口
TreeSet
List接口
ArrayList
LinkedList
Vector
Stack
Map接口
HashMap
LinkedHashMap
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
Hashtable
与HashMap的主要区别: * HashMap中键(key)和值(value)均可以为null,而Hashtable则不允许。原因:由JDK源码可知,HashMap中key为null时hashCode取0,value没做限制;而Hashtable中key和value为null时均会出现NullPointerException。* 方法加了synchronized关键字,线程安全其中的对象必须实现equals和hashCode方法java.util.Properties是其子类
SortedMap接口
Map接口的有序子接口,按照键的自然顺序或指定排序规则Comparator进行排序
TreeMap
实现了SortedMap接口 * 底层就是红黑树算法的实现* 线程不安全
WeakHashMap
其中的键是弱键,当它不被使用时会自动被GC给回收,同时其所在的entry节点会被删除
Collections工具类
提供了常用的集合操作方法,如排序sort等方法;同时还提供常用集合的同步实现,以适应多线程环境
异常处理
分类
预定义异常
运行时异常:RunTimeException类的子类
不需要显示的在程序中进行try...catch处理
如:NullPointerException、IllegalArgumentException、ArrayIndexOutOfBoundsException等
受检异常CheckedException:非RuntimeException子类
必须在程序中显示进行异常捕获处理
如:IOException、SQLException、FileNotFoundException等
自定义异常
继承Exception或RuntimeException
语法
try...catch、try..catch...finally、try...finally
throw、throws
Java7易忽略的新特性
try-with-resources语句:简化资源的关闭操作,会自动在语句结束后将每个资源正确关闭。 注:该资源类必须要直接或间接实现 java.lang.AutoCloseable 接口,该接口只包含一个close方法
switch语句支持String类型
单个catch捕获多个异常,如 catch(IOException | SQLException | FileNotFoundException ex)
0 条评论
下一页