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
double
存的是近似值,可用BigDecimal求准确值
布尔
boolean
字符
char
转义字符\\
\\'
\\\"
\\\\
\\t
\
引用数据类型
字符串
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 数据类型[长度];\t// 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修饰的类不能被继承,修饰的方法不能被覆盖,修饰的变量不能被修改(常量)
JavaSE知识内容
接口
概念:接口是一种能力和约定
经验: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个数字提前创建对象并保存在数组中,实现复用
字符串是常量,创建之后不可改变
字符串字面值存储在字符串池中,可以共享
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){}
try{}catch(){}catch(){}
try{}catch(){}finally{}
try{}catch(){}catch(){}finally{}
try{}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
IP
互联网协议/网际协议地址
分配给互联网设备的唯一数字标签(标识)
IPV4
4字节32位整数,分成4段8位的二进制数255.255.255.255
IPV6
16字节128位整数,分成8段十六进制整数FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
回环地址
127.0.0.1localhost
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();
R apply(T t);
Predicate<T> 断言型接口
boolean test(T t);
方法引用
方法引用是Lambda表达式的一种简写形式,如果Lambda表达式方法体中是调用一个特定的已存在的方法,可以使用方法引用代替
::操作符
对象:实例方法
类:静态方法
类:实例方法
类:new
注意:调用的方法参数列表、返回值类型,要与函数型接口中的方法参数列表、返回值类型一致
Stream API
处理数组、集合的抽象概念
流(与I/O不同)
可以执行复杂的查找、过滤、映射
创建
中间操作
终止操作
串行
stream();
并行
parallelStream();
0 条评论
回复 删除
下一页