JavaSE知识内容
2021-03-26 20:31:57 0 举报
AI智能生成
JavaSE整理
作者其他创作
大纲/内容
概述与环境搭建
语言基础
变量
计算机内存中的存储空间,是存放数据的基本单元
组成部分
数据类型
变量名
值
声明方式
先声明,再赋值
数据类型 变量名;
变量名 = 值;
变量名 = 值;
声明并赋值
多个同类型变量的声明与赋值
数据类型
基本数据类型
整数
byte
1个字节
-2^7 ~ 2^7-1
short
2个字节
-2^15 ~ 2^15-1
int
4个字节
-2^31 ~ 2^31-1
long
8个字节
-2^63 ~ 2^63-1
小数
float
4个字节
double
8个字节
存的是近似值,可用BigDecimal求准确值
布尔
boolean
1个字节
字符
char
2个字节
转义字符\
\'
\"
\\
\t
\n
引用数据类型
字符串
String
数组
对象
类型的转换
自动类型转换
两种类型相互兼容,目标类型大于源类型
强制类型转换
两种类型相互兼容,目标类型小于源类型
转换规则
整数长度足够,数据完整
整数长度不够,数据截断
小数强转整数,数据截断
字符整数互转,数据完整
保证正整数转换成字符,可以正常显示
boolean不可与其他类型转换
运算符
算数运算符
+ - * / % ++ --
赋值运算符
= += -= *= /= %=
关系运算符
> < >= <= == !=
逻辑运算符
&& || !
三目运算符
布尔表达式 ? 结果1 : 结果2
选择结构与分支结构
概念:根据已知条件进行逻辑判断,满足条件后执行相应的操作
选择结构
基本if选择结构
if else选择结构
多重if选择结构
相互排斥,有一个选项为true,其他选项不再执行,适用于区间判断
嵌套if选择结构
可以在一个选择结构当中,嵌套另一个选择结构,语法正确、格式正确的情况下,可以任意组合
分支结构
switch
可判断byte、short、int、char、String(JDK7+)
switch中的多个case取值不可以相同
switch有自动向下贯穿的特性,如需要在某个选项执行后中止,需要追加break关键字
局部变量
概念:声明在函数内部的对象,必须先赋值再使用
作用范围:从定义行开始到所在的代码块结束
注意:多个变量在重合的作用范围内,不可出现重名
循环结构
概念:通过某个条件,重复的执行一段逻辑代码
循环结构
while
首次即有入口条件,先判断,再执行,适用于循环次数明确的情况
do while
首次没有入口条件,先执行,再判断,适用于循环次数不明确的情况
for
首次即有入口条件,先判断,再执行,适用于循环次数明确的情况
流程控制语句
break
中止、跳出:switch分支结构、循环结构
continue
结束本次,进入下一次循环
嵌套循环的概念
概念:在一个完整的循环结构中,嵌套另一个循环结构
外层控制循环次数,内层控制单次循环操作
函数
概念:实现特定功能的一组代码,可反复使用
定义的位置:定义在类的内部,与main函数并列
函数的调用:函数名()
函数调用时,优先执行函数内部代码,结束后,返回到函数调用处,继续向下执行
返回值与返回值类型
定义返回值类型:基本数据类型、引用数据类型、void
return value; //应用在具有返回值类型的函数中,函数结束时,伴有返回值,返回到函数调用处
return; //应用在返回值类型为void的函数中,遇到return时,直接结束函数
经验:一个函数只做一件事(单一职能原则)
递归
实际在开发中,递归可以解决一些具有既定规律的问题
当需要解决的问题可以拆分成若干个小问题,大问题、小问题的解决方法相同,有特定的规律,函数自己调用自己
设置有效的出口条件,避免无穷递归
数组
概念:一组连续的存储空间,存储多个相同数据类型的值
数据类型[] 数组名 = new 数据类型[长度]; // int [] a = new int[5];
数组的组成概述
访问元素时,需要通过“下标”(从0开始,依次+1,自动生成)
访问的语法:数组名[下标]; //存:a[0] = 10; 取:a[0]
下标的范围:0 ~ 数组的长度 - 1
数组的复制
手工循环完成逐一的赋值
System.arraycopy(原数组,起始位置,新数组,起始位置,长度);
java.util.Arrays.copyOf(原数组,新长度);
基本类型变量与引用类型变量的区别
基本数据类型中,存储的是“值”
引用数据类型中,存储的是“地址”
排序
冒泡排序
相邻的两个值比较大小,互换位置
选择排序
固定值与其他值比较大小,互换位置
JDK排序
java.util.Arrays.sort(数组名);
二维数组
一维数组中的一维数组,数组中的元素,还是数组
创建语法:数据类型[][] 数组名 = new 数据类型[高维下标][低维下标];
访问元素的方式:数组名[高维下标][低维下标]
高维数组中保存了低维数组的地址,访问数组[0],等价于访问低维数组的地址
面向对象
程序:程序是为了模拟现实世界、解决现实问题而使用计算机语言编写的指令集合
对象:一切客观存在的事物都是对象,万物皆对象。对象一定具有自己的特征和行为
类的抽取:在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分
类:定义了对象应具有的特征和行为,类是对象的模板
对象:拥有多个特征和行为的实体,对象是类的实例
三大特性
封装
概念:尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限
由private修改为私有的属性 + 提供set/get公共的访问方法
封装之后,不可直接访问属性,仅可通过get/set公共方法进行访问,可以在方法内部对数据进行过滤
继承
程序中的继承,是类与类之间特征和行为的一种赠予与获得
构成继承关系的要求:两个类必须满足“is a”的关系
选择父类:功能越精细、重合点越多,越接近直接父类
父类的抽象:在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用
定义子类时:class 子类 extends 父类
产生继承关系后,子类可以使用父类中的属性和方法,也可以定义子类独有的属性和方法
Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加
不可继承:父类构造方法、父类中由private修饰的成员、父子类不在同一个包时由default修饰的成员
访问修饰符:private、default、protected、public
方法的覆盖:父类提供的方法无法满足子类需求、可在子类中定义相同的方法进行覆盖
覆盖的要求:方法名、参数列表、返回值都与父类完全相同,仅访问修饰符可以与父类相同或更宽
方法覆盖后,执行时,优先执行子类覆盖后的版本
super关键字
使用“super.”的形式在子类中访问父类的属性和方法(解决属性遮蔽、方法覆盖调用)
使用“super()”、“super(实参)”在子类构造方法的首行,调用父类的构造方法,如果没有显示书写,则默认调用父类无参构造super()
同一个子类的构造方法中,super()、this()不可同时存在
构建子类对象时,先构建父类对象
多态
概念:父类引用指向子类对象,从而产生多种形态
父类引用仅可调用父类中所声明的属性和方法,不可调用子类独有的属性和方法
实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法
多态应用场景一:使用父类作为方法形参实现多态,使方法参数的类型更为广泛
多态应用场景二:使用父类作为方法返回值实现多态,使方法可以返回不同的子类对象
三个关键字
abstract
概念:似是而非的,像却又不是,具备某种对象的特征,但不完整
抽象类:不能new对象,但可以声明引用
抽象方法:只有方法声明,没有方法实现。(必须包含在抽象类中)
经验:抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
子类继承抽象类后,必须覆盖父类中所有的抽象方法,否则,子类还是抽象类
static
概念:static可以修饰属性和方法,即为静态属性(类属性)、静态方法(类方法)
静态成员是全类所有对象共享的成员,全类中只有一份,不因创建多个对象而产生多份,不必创建对象,可直接通过类名访问
静态方法:允许直接访问静态成员,不能直接访问实例成员,不允许使用this、super关键字;可以继承,不能覆盖,没有多态
类加载:JVM首次使用某个类时,通过CLASSPATH查找该类的.class文件,并将.class文件中对类的描述信息加载到内存中,进行保存
加载机制:创建对象、创建子类对象、访问静态成员、Class.forName("全限定名")
静态代码块:类加载的执行环节,执行地位和静态属性一致,只有首次加载类时,需要执行,仅一次。可为静态属性赋值,或程序必要的初始行为
final
概念:最终的,不可修改的
final修饰的类不能被继承,修饰的方法不能被覆盖,修饰的变量不能被修改(常量)
接口
概念:接口是一种能力和约定
经验:Java单继承,当父类的方法种类无法满足子类需求时,可实现接口来扩充子类的能力
接口支持多实现,可为类扩充多种能力
规范:任何类在实现接口时,必须覆盖接口中所有的抽象方法,否则此类还是抽象类
实现接口中的抽象方法时,访问修饰符必须是public
接口引用同父类引用一样,可以声明为引用,指向实现类对象,仅可调用接口中所声明的方法,无法调用实现类独有方法
接口引用指向实现类对象时,需要调用实现类独有方法,可强转回实现类本身类型,进行调用
常用类
内部类
成员内部类、静态内部类、局部内部类、匿名内部类
Object类
所有类的父类
getClass():返回引用中存储的实际对象类型
equals():比较两个对象的内容是否相同
toString():返回该对象的字符串表示(表现形式)
包装类
概念:基本数据类型所对应的引用数据类型
转型方法
Number父类提供的,常用作自动拆箱
parseXXX() 通过String进行包装类对象的机构件(String类型转换为基本类型)
valueOf()
通过基本类型构建(Integer.valueOf(123) 将基本类型转换为包装类型)
通过String构建(Integer.valueOf("aaa") 将String类型转换为包装类型)
注意:在使用字符串构建数字型包装类型对象时,要保证类型的兼容,否则产生NumberFormatException
JDK5之后,提供自动装箱、拆箱,简化使用包装类的编程过程
自动装箱时,会调用valueOf方法,Byte、Short、Integer、Long,四种整数包装类型都提供了对应的cache缓冲区,将常用的256个数字提前创建对象并保存在数组中,实现复用
String
字符串是常量,创建之后不可改变
字符串字面值存储在字符串池中,可以共享
StringBuilder
可变字符串,JDK5发布,线程不安全,运行效率快
StringBuffer
可变字符串,JDK1.0发布,线程安全,运行效率慢
BigDecimal
精确计算浮点数
java.math.BigDecimal
add、subtract、multiple、divide (需要确定保留的精度,除不尽时的四舍五入策略)
集合
概念:对象的容器,存储对象的对象,可代替数组
集合是容器的工具,定义一个对多个对象进行操作的常用方法
位置:java.util.*
Collection体系集合
Collection父接口:代表一组任意的对象、无序、无下标
List
有序、有下标、元素可以重复
ArrayList
地址连续,数组结构存储,查询快,增删慢
JDK1.2发布,运行效率快,线程不安全
Vector
数组结构存储,查询快,增删慢
JDK1.0发布,运行效率慢,线程安全
LinkedList
地址不连续,链表结构存储,增删快,查询慢
Set
无序、无下标、元素不可重复
HashSet
基于HashCode实现元素不重复
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
TreeSet
基于排列顺序实现元素不重复,可重复
实现了SortedSet接口,对集合元素自动排序
元素对象的类型必须实现Comparable接口,指定排序规则
通过CompareTo方法确定是否为重复元素
Map体系集合
Map父接口的特点:存储一对数据(Key-Value),无序、无下标,键不可重复,值可重复
HashMap【重点】
JDK1.2版本提供,线程不安全,运行效率快
允许用null作为Key或Value
HashMap底层是链表数组
Hashtable
JDK1.0版本提供,线程安全,运行效率慢
不允许用null作为Key或Value
Properties
Key和Value都是String类型
setProperty();
getProperty();
配置文件的读取
SortedMap
TreeMap
可以对Key做自动排序
自定义类型需要实现Comparable
异常
概念:程序在运行过程中出现的特殊情况
异常的分类
Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中
Error:JVM、硬件、执行逻辑错误,不能手动处理
Exception:程序在运行和配置过程中产生的问题,可处理
RuntimeException:运行时异常,可处理,可不处理
CheckedException:受查异常,必须处理
异常的产生
自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常
手动抛出异常:throw new 异常类型("实际参数");
产生异常结果:相当于遇到return一句,导致程序因异常而终止
异常的传递
按照方法的调用链反向传递,如果始终没有处理异常,最终会由JVM进行默认处理(打印堆栈跟踪信息)
受查异常:throws 异常类型 声明异常,修饰在方法参数列表后端,强制处理
非受查异常:由于运行时异常,是可处理可不处理,所以无需声明异常
异常的处理
try() catch(Exception e){}finally{}
常见异常处理结构
try{}
catch(Exception){}
catch(Exception){}
try{}
catch(){}
catch(){}
catch(){}
catch(){}
try{}
catch(){}
finally{}
catch(){}
finally{}
try{}
catch(){}
catch(){}
finally{}
catch(){}
catch(){}
finally{}
try{}
finally{}
finally{}
注意:多重catch情况下,异常捕获的顺序要遵从从子(小)到父(大)的顺序,父类异常在最后
自定义异常
需要继承Exception或Exception的子类,常用RuntimeException
无参构造方法
String message参数的有参构造方法
异常方法覆盖
方法名、参数列表、返回值类型必须和父类相同
子类的访问修饰符和父类相同或比父类更宽
子类中的方法,不能抛出比父类更宽泛的异常,可以抛出更多的异常
多线程
概述
同步:两件事情,先做1,1做完,再做2
异步:两件事情可以同时做
并行:1个CPU核心,只做一件事
并发:1个CPU核心,同时做多件事,利用时间分片
进程
真正运行时的程序,称之为进程
单核CPU下,在任何时间点上,只能运行一个程序
宏观并行,微观串行
资源不共享
线程
轻量级进程
资源共享
程序中的一个顺序控制流程,也是CPU的基本调度单位
进程可以由单个或多个线程组成,彼此间完成不同的工作,交替执行,称为多线程
JVM是一个进程,当中默认包含了主线程(Main)
线程的组成
CPU时间片
运行数据
栈空间
存储线程需要使用的局部变量,每个线程都拥有独立的栈
堆空间
存储线程需要使用的对象,多个线程可以共享堆中的对象
线程的创建
extends Thread
implements Runnable
线程的状态(基本)
线程的常见方法
休眠 sleep(long millis);
放弃 yield();
结合 join();
线程的状态(等待)
线程安全
当多线程并发访问临界资源时,如果破坏原子操作,可能会造成数据不一致
临界资源:共享资源(同一对象),一次仅允许一个线程使用,才能保证其正确性
原子操作:不可分割的多步操作,被视为一个整体,其顺序和步骤不可打乱或缺省
synchronized
同步代码块 synchronized(临界资源对象)
同步方法,互斥锁
线程的状态(阻塞)
线程的通信
等待
wait();
通知(唤醒)
notify();
在等待队列中随机唤醒一个线程
notifyAll();
唤醒等待队列中所有的线程
线程池
线程容器,可以设定线程分配的数量上限
预先创建线程对象,存入池中,并实现重用池中的线程对象
避免频繁的创建、销毁
Executor 顶级接口
ExecutorService 线程池接口
Executors 工厂类
newFixedThreadPool(int nThreads); 手动固定线程池的数量
newCachedThreadPool(); 动态数量线程池
Callable<V>接口
public V call() throws Exception{}
JDK5加入,与Runnable类似,都代表了一个线程任务
call方法,具有泛型返回值,可以声明异常
Future接口
异步接收ExecutorService.submit();方法返回的结果,包含了call方法的返回值
V get();以阻塞形式等待Future中的异步处理结果(call的返回值)
Lock锁
JDK5加入,与synchronized比较,显示定义,结构更灵活
void lock();上锁
void unlock();释放锁
boolean tryLock();//尝试获取锁
ReentrantLock
重入锁
最多持有2147483648把锁
ReadWriteLock
ReentrantReadWriteLock
一种支持一写多读的同步锁,读写分离,可分配读锁、写锁
多次分配读锁,多个读操作可以并发执行
互斥规则
写-写:互斥,阻塞
读-写:互斥,读阻塞写、写阻塞读
读-读:不互斥、不阻塞
在读操作远远大于写操作的环境中,可在保障线程安全的情况下,提高运行效率
线程安全的集合
Collections中的工具方法
以synchronized开头的方法
JDK1.2提供,接口统一、维护性高,但是性能没有提升,均以synchronized实现
CopyOnWriteArrayList
线程安全的ArrayList,加强版读写分离
写有锁,读无锁,读写之间不阻塞,优于读写锁
写入时,先copy一个容器副本,再添加新元素,最后替换引用
CopyOnWriteArraySet
底层是CopyOnWriteArrayList
在添加新元素时,使用addIfAbsent();添加,遍历数组
如果重复了,则抛弃掉副本(复制的数组)
ConcurrentHashMap
JDK1.7
初始容量16段(Segment),使用分段锁设计
不对整个Map加锁,而是对每个Segment加锁
当多个对象存入同一个Segment时,才需要互斥
最理想的状态为16个对象分别存入16个Segment,并行数量16个
JDK1.8
Queue队列
FIFO:First in first out 先进先出
抛出异常的方法
返回特殊值的方法(推荐)
ConcurrentLinkedQueue
线程安全、可高效读写的队列,高并发下性能最好的队列
采用的是无锁、CAS比较交换算法
V:要更新的变量 E:预期值 N:新值
只用当V==E时,V=N,否则标识已被更新过,则取消当前操作
BlockingQueue 阻塞队列
put 阻塞添加
take 阻塞移除
可用于解决消费者、生产者问题
ArrayBlockingQueue
数组结构实现,有界队列,手工固定上限
LinkedBlockingQueue
链表结构实现,无界队列(默认上限是Integer.MAX_VALUE)
I/O框架
流
内存与存储设备之间传输数据的通道
流的分类
按方向
输入流
将存储设备中的内容读入到内存中
输出流
将内存中的内容写入到存储设备中
按单位
字节流
以字节为单位,可以读写所有的数据
字符流
以字符为单位,只能读写文本数据
按功能
节点流
具有实际传输数据的读写功能
过滤流
在节点流的基础之上增强功能
字节流
InputStream 字节输入流
OutputStream 字节输出流
字节节点流
FileInputStream
FileOutputStream
字节过滤流
BufferedInputStream
BufferedOutputStream
flush()
对象字节流
ObjectOutputStream:对象序列化到磁盘当中
ObjectInputStream
使用对象字节流传输对象的过程,称为序列化、反序列化
必须实现Serializable接口
必须保证其属性均可序列化
transient修饰的属性为临时属性,不参与序列化
读取到文件末尾:java.io.EOFException
字符编码
UTF-8
针对Unicode可变长度字符编码
GB2312
简体中文
GBK
简体中文、扩展
当编码方式和解码方式不一致时,会出现乱码
字符流
Reader
Writer
字符节点流
FileWriter
FileReader
字符过滤流
BufferedWriter
BufferedReader
PrintWriter
桥转换流
InputStreamReader
OutputStreamWriter
可将字节流转换为字符流
可设置字符的编码方式
File类
代表了物理盘符中的一个文件或文件夹
FileFilter接口
对获取文件进行过滤,满足条件的文件或文件夹才能保存下来
网络编程
网络
由点和线构成的,标识诸多对象间的相互联系
计算机网络
为实现资源共享和信息传递,通过通信线路连接起来的若干主机(Host)
互联网:点与点相连
万维网:端与端相连
物联网:物与物相连
网络编程:让计算机与计算机之间建立连接、进行通信
网络模型:OSI开放式系统互联
第一层:物理层(双绞线、光导纤维)
第二层:链路层(MAC)
第三层:网络层(IP地址)
第四层:传输层(TCP、UDP)
第五层:会话层(断点续传)
第六层:表示层(对数据转换以及加密)
第七层:应用层(HTTP、FTP、SMTP)
TCP/IP模型
一组用于实现网络互联的通信协议,分为了四层
第一层:网络接口层(以太网、ADSL)
第二层:网络层(分配地址、传送数据、IP协议)
第三层:传输层(文本数据、协议是TCP、UDP协议)
第四层:应用层(负责传送最终形态的数据,协议为HTTP、FTP)
TCP/UDP
TCP:传输控制协议
是一种面向连接、可靠的、基于字节流的传输层控制协议
数据大小无限制
建立连接的过程需要三次握手
断开连接的过程需要四次挥手
是一种面向连接、可靠的、基于字节流的传输层控制协议
数据大小无限制
建立连接的过程需要三次握手
断开连接的过程需要四次挥手
UDP:用户数据报协议
是一种无连接的传输层协议,提供面向事务的简单、不可靠信息传送服务
每个包的大小是64KB
是一种无连接的传输层协议,提供面向事务的简单、不可靠信息传送服务
每个包的大小是64KB
IP
互联网协议/网际协议地址
分配给互联网设备的唯一数字标签(标识)
IPV4
4字节32位整数,分成4段8位的二进制数
255.255.255.255
255.255.255.255
IPV6
16字节128位整数,分成8段十六进制整数
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
回环地址
127.0.0.1
localhost
localhost
Port端口
在通信实体上进行网络通讯的程序的唯一标识
0~65535
Mysql:3306
Oracle:1521
Tomcat:8080
Web服务器:80
FTP服务器:21
InetAddress
标识互联网协议(IP)地址对象,封装了与该IP地址对象相关的所有信息,并提供常用方法
无法直接创建对象,构造方法私有化,需要通过getXXX方法来获得
基于TCP的网络编程
Socket
是网络中的一个通信节点
分为客户端Socket和服务器ServerSocket
通信要求:IP地址+端口号
反射
Java8
Lambda表达式
允许把函数作为一个方法的参数(函数作为参数传递到方法中)
<函数式接口> <变量名> = (参数1,参数2,...) {
// 方法体
}
// 方法体
}
注意事项
形参列表的数据类型会自动推断
如果形参列表为空,只需保留()
如果形参只有1个,()可以省略,只要参数名字
如果执行语句只有一句,且无返回值,{}可以省略
若有返回值,想省略{},return也省略,保证执行语句只有1句
Lambda表达式不会生成单独的内部类文件
Lambda访问局部变量时,局部变量要修饰为final,如果没修饰,会自动添加final修饰
函数式接口
如果一个接口只有一个抽象方法,则该就扣称为函数式接口
为了确保接口达到函数式接口的要求,可以添加@FunctionalInterface注解,明确要求该接口只能有一个抽象方法
内置四个核心函数式接口
Consumer<T> 消费型接口
void accept(T t);
Supplier<T> 供给型接口
T get();
Function<T,R> 函数型接口
R apply(T t);
Predicate<T> 断言型接口
boolean test(T t);
方法引用
方法引用是Lambda表达式的一种简写形式,如果Lambda表达式方法体中是调用一个特定的已存在的方法,可以使用方法引用代替
::操作符
对象:实例方法
类:静态方法
类:实例方法
类:new
注意:调用的方法参数列表、返回值类型,要与函数型接口中的方法参数列表、返回值类型一致
Stream API
处理数组、集合的抽象概念
流(与I/O不同)
可以执行复杂的查找、过滤、映射
创建
中间操作
终止操作
串行
stream();
并行
parallelStream();
0 条评论
下一页