Java高级语法
文章目录
- Java高级语法
- 1. 异常
- 2. 多线程
- 3. 集合框架
- 4. 输入/输出流
- 5. 网络编程
- 6. 反射机制
- 7. 常用API
- 7.1. 字符串
- 7.2. 对象比较
- 7.3. 常用类
- 7.3.1. `java.lang.Thread`
- 7.3.2. `java.lang.String`
- 7.3.3. `java.lang.StringBuffer/StringBuilder`
- 7.3.4. `java.util.Date`
- 7.3.5. `java.text.SimpleDateFormat`
- 7.3.6. `java.util.Calendar`
- 7.3.7. `java.time.LocalDate/LocalTime/LocalDateTime`
- 7.3.8. `java.time.Instance`
- 7.3.9. `java.time.format.DateTimeFormatter`
- 7.3.10. `java.util.Collections`
- 7.3.11. `java.io.File`
- 7.3.12. `java.io.Reader`
- 7.3.13. `java.io.Writer`
- 7.3.14. `java.io.InputStream`
- 7.3.15. `java.io.OutputStream`
- 7.3.16. `java.net.InetAddress`
- 7.3.17. `java.net.ServerSocket`
- 7.3.18. `java.net.Socket`
- 7.3.19. `java.net.DatagramSocket`
- 7.3.20. `java.net.DatagramPacket`
- 7.3.21. `java.net.URL`
- 7.3.22. `java.lang.Class`
- 7.4. 常用接口
- 8. 扩展
- 参考资料
1. 异常
异常是指程序在执行过程中,出现的非正常情况,用不同的类表示不同类型的异常事件
Java的异常处理分为异常的抛出和异常的处理两部分
1.1. 异常体系
java.lang.Throwable
:Java异常类的根父类java.lang.Error
:虚拟机无法解决的严重问题,一般不编写代码处理java.lang.Exception
: 编程错误或外在因素导致的一般性问题,需要编写代码处理
1.1.1. 异常分类
- 编译时期异常:也叫受检异常,是指编译时期能够确定的异常,需要提前编写处理代码,否则编译不通过(必须处理)
- 运行时期异常:也叫非受检异常,是指编译时期无法确定,代码运行时才能确定的异常,主要是
RuntimException
类及其子类
1.1.2. 常见异常
1.1.3. 抓抛模型
- 抛出异常:程序执行过程中,出现异常时生成一个异常类对象并提交给运行时系统,同时终止当前程序的执行流程转向处理异常流程
- 处理异常:异常处理代码捕获程序中的异常对象,并根据异常类型进行相应的处理
1.2. 异常的抛出
- 自动抛出:虚拟机检测到程序出现问题则创建一个异常实例并抛出
- 手动抛出:开发人员检测程序中的问题并创建一个异常实例并抛出
1.2.1. 语法格式
throw excepObj;
- excepObj:抛出异常对象,必须是Throwable类或其子类的实例,否则报错
说明
- 抛出异常后转向异常处理部分执行,正常执行流程中下方的代码不会执行
1.2.2. 自定义异常类
- 继承一个现有的异常类型
- 提供异常类型的构造器,推荐至少提供两个:无参构造器、异常信息
message
构造器 - 提供一个全局常量
serialVersionUID
说明
- 自定义异常类的对象只能手动抛出
- 自定义异常类的两个重要要素:类名(见名知义)和异常信息
message
1.3. 异常的处理
1.3.1. try-catch-finally
语法格式
try {
... // 可能产生异常的代码
} catch (ExceptionType e){
... // 异常类型的处理
} ...
finally {
... // 是否发生异常均执行
}
- ExceptionType:异常事件对象的类型
说明
- try语句可以有一个或多个catch语句,每个catch语句捕获并处理不同类型的异常对象
- 多个catch语句捕获的异常存在子父类关系时,子类异常必须在父类异常前,否则报错
- catch语句中常打印异常的跟踪栈信息
printStackTrace()
或获取异常的描述信息getMessage()
- finally语句一定会被执行(即使执行
return
语句或发生异常),除非终止虚拟机 - catch语句和finally语句都是可选的但不能单独使用
执行流程
- 程序执行try代码块,如果没有发生异常,则(不执行catch分支)直接执行步骤4;否则
- 根据异常对象的类型依次匹配,选择第一个匹配的catch分支执行并执行步骤4;否则
- 向外(方法的调用者)抛出异常,方法执行结束
- 执行finally代码块及其他语句
流程图
1.3.2. throws
在方法的标签中声明可能抛出的异常类型,实现将异常对象呈递给方法的调用者
语法格式
modifier type methodName(params) throws ExceptionList {
...
}
- ExceptionList:可能抛出的异常列表,异常之间使用
,
分隔
执行流程
方法捕获列表指定类型的异常对象,终止当前方法的执行并将其抛出给调用者
1.3.3. 选择原则
- 涉及资源调用,使用try-catch-finally
- 重写的父类方法没有throws异常,使用try-catch-finally
- 方法间存在递进关系且可能出现异常,则使用throws,其调用者使用try-catch-finally
2. 多线程
- 程序:为完成特定任务,按照一定的语言规则编写的指令集合
- 进程:程序的一次运行过程,是系统进行资源分配和调度的基本单位
- 线程:进程的实体,是CPU调度和分配的基本单位
2.1. 线程的创建
2.1.1. 方式一:继承Thread类
- 定义子类继承
java.lang.Thread
类并重写run()方法 - 实例化子类并调用start()方法
说明
- start()方法的作用:1)创建子线程;2)调用run()方法(多态性)
注意
- 手动调用子类的run()方法不会创建子线程,而是将其视为普通的方法调用
- 实例多次调用start()方法(
threadStatus
非0)会抛出IllegalThreadStateException
异常
2.1.2. (推荐)方式二:实现Runnable接口
- 定义
java.lang.Runnable
接口的实现类并实现run()方法 - 创建实现类的实例对象
- 以实现类的对象为参数实例化Thread类并调用start()方法
说明
- start()方法的作用:1)创建子线程;2)调用run()方法(代理模式)
- 线程的数据和代码独立,实现解耦操作,增加程序的鲁棒性
- 创建多个线程可使用同一个实现类对象,共享同一份资源
2.1.3. 方式三:实现Callable接口(JDK5.0
新增)
- 定义
java.util.concurrent.Callable
接口的实现类并实现call()方法 - 创建实现类的实例对象,并将其作为参数实例化
java.util.concurrent.FutureTask
类 - 以FutureTask类的对象为参数实例化Thread类并调用start()方法
说明
- 实现类对象支持泛型的返回值,且可以抛出异常
- 获取分线程执行结果时会阻塞主线程,效率较低
2.1.4. 方式四:使用线程池(JDK5.0
新增)
提前创建多个线程放入线程池中,使用时直接获取、使用完放回池中
- 创建线程池(
java.util.concurrent.ExecutorService
类的对象)并设置属性 - 传入
Runnable
或Callable
对象,指定线程执行的操作 - 关闭连接池
说明
- 线程池减少线程的创建、销毁操作,能够提高响应速度,降低资源消耗
- 使用线程池便于对线程进行管理
2.2. 线程的生命周期
状态 | 说明 |
---|---|
java.lang.Thread.Status.NEW | 线程被创建但未启动 |
java.lang.Thread.Status.RUNNABLE | 线程可以运行,但何时运行由操作系统控制 |
java.lang.Thread.Status.TERMINATED | 线程终止运行,生命周期结束 |
java.lang.Thread.Status.BLOCKED | 线程阻塞等待监视器锁 |
java.lang.Thread.Status.TIMED_WAITING | 线程限时阻塞等待唤醒 |
java.lang.Thread.Status.WAITING | 线程无限期阻塞等待唤醒 |
2.3. 线程的同步
2.3.1. 同步机制
线程安全问题是指当一个线程在操作共享数据且未结束时,其他线程参与该数据操作会污染共享数据,解决思路是当多个线程都需要操作共享数据时,需要排队完成
实现原理
给某段代码加“锁”,限制任何线程执行这段代码都要先获得“锁”,这种“锁”称为同步锁
2.3.2. synchronized
关键字
同步代码块
synchronized (syncMonitor) {
... // 需要同步的代码
}
- syncMonitor:同步监视器,可以是任意对象但必须在同步的线程间共享,通常可用
this
和ClassName.class
说明
- 代码块的范围不能太小也不能太大,前者无法解决线程安全问题,后者会降低运行效率
同步方法
[modifier] synchronized type methodName(params) throws ExceptionList {
... // 需要同步的代码
}
说明
- 静态方法的默认监视器为
ClassName.class
,非静态方法的默认监视器为this
- 方法体的范围不能太小也不能太大,前者无法解决线程安全问题,后者会降低运行效率
2.3.3. Lock
接口(JDK5.0
新增)
使用步骤
- 导包:
java.util.concurrent.locks
接口提供控制多个线程对共享资源进行访问的工具 - 创建锁对象:常用实现类
ReentrantLock
的对象 - 加同步锁:调用
lock()
方法 - 释放同步锁:调用调用
unlock()
方法
2.3.4. 同步的实现
- 锁接口方式是显示锁,需要手动加锁和解锁;关键字方式是隐式锁,自动加锁和解锁
- 锁接口方式调度线程花费时间较少,性能更好,且具有更好的扩展性
推荐顺序
锁接口 > 同步代码块 > 同步方法
2.3.5. 死锁
死锁是指不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源
死锁的条件
- 互斥条件
- 占用且等待条件
- 不可抢占条件
- 循环条件
死锁的解除:破坏死锁的任意一个条件
- 针对条件1,基本无法破坏
- 针对条件2,一次性申请所有资源
- 针对条件3,占用部分资源的线程无法进一步申请资源时,主动释放占用的资源
- 针对条件4,资源按照一定的顺序依次申请
2.4. 线程间通信
等待唤醒机制:当一个线程满足某个条件时就进入等待状态, 等待其他线程执行完后将其唤醒或超时时自动唤醒
// 开始等待
objName.wait() // 无限时等待WAITING
objName.wait(time) // 限时等待TIMED_WAITING
// 唤醒等待
objName.notify() // 唤醒等待状态中优先级最高的线程
objName.notifyAll() // 唤醒所有处于等待状态的线程
- objName:任意锁对象,调用wait方法和notify方法的对象必须是同一个对象
说明
- wait方法和notify方法定义在
Object
类中,被所有类继承;前者在进入等待状态时会释放锁 - wait方法和notify方法必须在同步代码块或同步方法中调用,且调用对象必须是锁对象,否则会抛出
IllegalMonitorStateException
异常 - 等待状态的线程被唤醒后,存在两种可能:1)能够获取锁,从WAITING状态进入RUNNABLE状态;2)否则,从WAITING状态进入BLOCKED状态
3. 集合框架
3.1. Collection
接口
用于存储多个单独存在的数据,也称单列数据集合,其子接口主要包括
List
:用于存储有序的、可重复的数据Set
:用于存储无序的、不重复的数据
3.1.1. List
接口
- 有序性:元素存储位置按照添加的顺序依次紧密排列
- 可重复:可以存在相同(比较属性)的元素
实现类
ArrayList(主要) | LinkedList | Vector(不推荐) | |
---|---|---|---|
线程安全 | 否,效率高 | 否,效率高 | 是,效率低 |
存储结构 | Object数组 | 双向链表 | Object数组 |
执行效率 | 添加、查找效率高(O(1)) 插入、删除效率低(O(n)) | 插入、删除效率高(O(1)) 添加、查找效率低(O(n)) | —— |
源码剖析
- ArrayList的默认初始容量10,在首次添加时创建(
JDK 8.0
及以后,初始化为空数组),默认扩容1.5倍 - Vector的默认初始容量10,在初始化时创建,默认扩容2倍
3.1.2. Set
接口
- 无序性:元素的存储位置用哈希散列计算,与添加顺序无关
- 唯一性:不能添加相同(比较哈希值、属性)的元素
实现类
HashSet(主要) | LinkedHashSet | TreeSet | |
---|---|---|---|
元素要求 | 重写equals()和hashCode() | 重写equals()和hashCode() | 可比较 |
遍历顺序 | 无序(非随机) | 添加顺序 | 大小顺序 |
底层实现 | HashMap | LinkedHashMap | TreeMap |
执行效率 | 遍历效率较低 插入效率较高 | 插入效率较低 遍历效率较高 | —— |
重写hashCode()的基本原则
- 程序运行时,同一对象多次调用hashCode()返回相同的值
- 两个对象调用equals()返回true时,调用hashCode()返回的结果也相等
- equals()比较的属性都参与hashCode()中哈希值的计算
重写equals()的基本原则
- hashCode()中计算哈希值的属性都应该参与equals()的相等比较
源码剖析
- HashSet和LinkedHashSet的特性与Map的key类似,区别在于key-value中的value引用同一个Object()对象
3.2. Map
接口
用于存储多个成对存在的数据即key-value
(又称entry
),也称双列数据集合,特点如下
- key是无序、不可重复的,构成一个Set集合
- value是无序、可重复的,构成一个Collection集合
- key-value即entry是无序、不可重复的,构成一个Set集合
实现类
HashMap(主要) | LinkedHashMap | TreeMap | Hashtable | Properties | |
---|---|---|---|---|---|
元素要求 | key重写equals()和hashCode() | key重写equals()和hashCode() | key可比较 | key和value非null | key和value均为字符串 |
遍历顺序 | 无序 | 添加顺序 | key的大小顺序 | 无序 | 无序 |
线程安全 | 否,效率高 | 否,效率高 | 否,效率高 | 是,效率低 | 是,效率低 |
存储结构 | Entry数组+单向链表+红黑树 | Entry数组+单向链表+红黑树+双向链表 | 红黑树 | Entry数组+单向链表 | Entry数组+单向链表 |
执行效率 | 遍历效率较低 插入效率较高 | 插入效率较低 遍历效率较高 | —— | —— | —— |
源码剖析
- HashMap的默认初始容量16,在首次添加时创建,默认加载因子0.75,默认扩容2倍,数组容量始终为2n(n≥4);树化阈值8、容量64,反树化阈值6;使用单向链表+红黑树(
JDK 8.0
及之后)解决冲突 - 哈希散列的完整过程
- 先调用key所在类的hashCode()方法计算哈希值1,再根据哈希值1得到哈希值2并根据哈希值2计算索引i,如果数组的索引i处为空,则添加元素key-value
- 否则发生散列冲突,需依次判断哈希值2与已有键的哈希值是否相同,如果哈希值不相同,则添加元素key-value
- 否则,调用key所在类的equals()方法判断相等,如果不相等,则添加元素key-value;否则修改元素key-value
- LinkedHashMap在HashMap的基础上使用双向链表记录元素的添加顺序
3.3. 泛型(JDK 5.0
新增)
泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,可用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法
3.3.1. 泛型类/接口
语法格式
[modifier] class ClassName<T...> {
...
}
[modifier] interface InterfaceName<T...> {
...
}
- T:泛型形参,通常用一个大写字母表示,多个参数之间用
,
隔开,通过实例化、继承/实现时传入的类型实参确定类型(不指定默认为Object,向下兼容)
说明
- 类型参数可用类内部属性、构造器、方法等结构(静态结构除外)的定义,也可用于类继承和接口实现
- 类继承和接口实现中类型实参不确定时,传入的实参需要在子类类型形参中声明
- 编译器根据类型实参确定泛型类型,将类型形参编译为具体类型
- 实例化时类型实参只能使用引用数据类型,基本数据类型需使用包装类
- 不能直接创建泛型类型的数组即
new T[]
,而应使用(T[]) new Object[capatity]
- 异常类不能使用泛型
3.3.2. 泛型方法
语法格式
[modifier] <T...> type methodName([params]) [throws exceptions] {
...
}
- T:泛型形参,通常用一个大写字母表示,多个参数之间用
,
隔开
说明
- 泛型参数通常用在形参列表、返回值类型中,方法调用时确定泛型类型
- 泛型类和非泛型类均可以包含泛型方法,根据方法是否有
<T...>
判断 - 泛型方法可以使用
static
关键字修饰
3.3.3. 通配符
? | ? extends ClassName | ? super ClassName | |
---|---|---|---|
匹配类型 | 任意数据类型 | ClassName及其子类 | ClassName及其父类 |
读取类型 | Object类对象 | ClassName类对象 | Object类对象 |
写入类型 | 无法写入(null除外) | 无法写入(null除外) | ClassName及其子类对象 |
4. 输入/输出流
Java程序中,数据以流的方式在设备之间传输,常用API位于java.io
包下
4.1. 概述
4.1.1. 流的分类
按照数据流向
- 输入流:从外部设备读取数据到程序(内存)中
- 输出流:把程序(内存)中的数据输出到外部设备
按照操作单位
- 字节流:以字节为单位读写数据
- 字符流:以字符为单位读写数据
按照扮演角色
- 节点流:直接从数据源或目的地读写数据
- 处理流:建立在已存在的流之上读写数据
4.1.2. IO流体系
4.1.3. 使用步骤
- 创建文件和流对象
- 使用流执行读、写操作
- 关闭流资源
注意
- 字符流只能用于处理文本文件,而字节流可以处理非文本文件和文本文件的复制操作
- 为关闭流资源,需要使用try-catch-finally方式处理异常
- 关闭流资源时需要按照从外向内的顺序(内层流会随外层流的关闭而关闭)
4.2. 常见IO流
4.2.1. 节点流——文件流
文件流是典型的节点流之一,用于文件的读写操作,包括FileReader
、FileWriter
、FileInputStream
、FileOutputStream
构造器
构造器 | 说明 |
---|---|
FileReader(File file) | 以file为数据源创建字符输入流 |
FileReader(String name) | 以name指定文件为数据源创建字符输入流 |
FileWriter(File file) | 以file为数据源创建字符输出流 |
FileWriter(String name) | 以name指定文件为数据源创建字符输出流 |
FileWriter(File file, boolean append) | 以name指定文件为数据源创建字符输出流,并指定写出方式 |
FileInputStream(File file) | 以file为数据源创建字节输入流 |
FileInputStream(String name) | 以name指定文件为数据源创建字节输入流 |
FileOutputStream(File file) | 以file为数据源创建字节输出流 |
FileOutputStream(String name) | 以name指定文件为数据源创建字节输出流 |
FileOutputStream(File file, boolean append) | 以name指定文件为数据源创建字节输出流,并指定写出方式 |
说明
- 对于输入流,要求文件对象对应的磁盘文件已存在,否则抛出FileNotFoundException
- 对于输出流,若文件对象对应的磁盘文件不存在,则创建文件;否则,默认覆盖文件
4.2.2. 处理流——缓冲流
缓冲流是典型的处理流之一,用于加快文件的读写速度,包括BufferedReader
、BufferedWriter
、BufferedInputStream
、BufferedOutputStream
构造器
构造器 | 说明 |
---|---|
BufferedReader(Reader in) | 用输入流in创建输入缓冲流 |
BufferedWriter(Writer out) | 用输出流out创建输出缓冲流 |
BufferedInputStream(InputStream in) | 用输入流in创建输入缓冲流 |
BufferedOutputStream(OutputStream out) | 用输出流out创建输出缓冲流 |
特有方法
类 | 方法 | 说明 |
---|---|---|
BufferedReader | String readLine() | 读取一行字符(不含换行符) |
BufferedWriter | void newLine() | 写一个换行符(符号有系统定义) |
说明
- 缓冲流使用缓冲区(默认8Kb)减少IO次数,从而加快文件的读写速度
- 缓冲流必须以节点流对象为作为参数(套接在节点流之上)
4.2.3. 处理流——转换流
转换流用于字节流与字符流的转换,包括InputStreamReader
、OutputStreamWriter
构造器
构造器 | 说明 |
---|---|
InputStreamReader(InputStream in) | 用输入流in创建默认字符集的输入流 |
InputStreamReader(InputStream in, String charsetName) | 用输入流in和指定字符集创建输入流 |
OutputStreamWriter(OutputStream out) | 用输出流out创建默认字符集的输出流 |
OutputStreamWriter(OutputStream out, String charsetName) | 用输出流out和指定字符集创建输出流 |
字符集
字符集 | 字节 | 外文字符 | 中文字符 |
---|---|---|---|
ASCII | 单字节 | 英文字母、阿拉伯数字、控制字符和西文符号 | —— |
ISO-8859-1 | 单字节 | ASCII字符集、拉丁字符 | —— |
GB2312 | 双字节 | ASCII字符集、希腊罗马字母、日文假名 | 7000+汉字 |
GBK | 双字节 | ASCII字符集(1字节)、希腊罗马字母、日韩汉字 | 21003汉字(2字节) |
GB18030 | 多字节 | ASCII字符集、希腊罗马字母、日韩汉字 | 70244汉字、繁体 |
Unicode | 双字节 | ASCII字符集(2字节)、世界其他语言文字 | —— |
UTF-8 | 多字节 | ASCII字符集(1字节)、世界其他语言文字 | 汉字(3字节) |
4.2.4. 处理流——对象流
对象流用于对象的读写操作,包括ObjectInputStream
、ObjectOutputStream
构造器
构造器 | 说明 |
---|---|
ObjectInputStream(InputStream in) | 用输入流in创建对象输入流 |
ObjectOutputStream(OutputStream out) | 用输出流out创建对象输出流 |
特有方法
类 | 方法 | 说明 |
---|---|---|
ObjectInputStream | xxx readXxx() | 从输入流中读取一个基本数据类型的值 |
ObjectInputStream | String readUTF() | 从输入流中读取UTF-8编码的字符串 |
ObjectInputStream | Object readObject() | 从输入流中读取一个对象 |
ObjectOutputStream | void writeXxx(xxx val) | 将基本数据类型的值val写到输出流 |
ObjectOutputStream | void writeUTF(String str) | 将字符串str以UTF-8编码写到输出流 |
ObjectOutputStream | void writeObject(Object obj) | 将对象obj写到输出流 |
对象序列化
- 序列化:用一个字节序列表示一个对象,该序列中包含对象的类型和属性等信息
- 反序列化:从字节序列中读取对象的类型和属性信息并重构对象
可序列化条件
- 对象所属类可序列化,即实现(标识)接口
java.io.Serializable
- 对象所属类的实例属性可序列化或使用
transient
关键字修饰 - 对象所属类声明一个唯一标识常量:static final long serialVersionUID
说明
- 可序列化的数据类型:基本数据类型、实现Serializable接口的类
static
和transient
关键字修饰的属性不参与序列化- 类标识常量会自动生成(无声明)但修改类时会变化,导致重构时抛出InvalidClassException
4.2.5. 其他流
标准输入/输出流
System.in
和System.out
分别表示标准输入、标准输出流- 标准输入流的默认设备是键盘,标准输出流的默认设备是显示器
特有方法
方法 | 说明 |
---|---|
public static void setIn(InputStream in) | 修改标准输入设备(native方法修改final属性) |
public static void setOut(OutputStream out) | 修改标准输出设备(native方法修改final属性) |
打印流
打印流将基本数据类型转换为字符串格式输出,主要包括PrintStream
和PrintWriter
构造器
构造器 | 说明 |
---|---|
PrintStream(String fileName) | 创建指定文件且不自动刷新的打印流 |
PrintStream(String fileName, String csn) | 创建指定文件和字符集且不自动刷新的打印流 |
PrintStream(File file) | 创建指定文件且不自动刷新的打印流 |
PrintStream(File file, String csn) | 创建指定文件和字符集且不自动刷新的打印流 |
PrintStream(OutputStream out) | 创建输入到out流且不自动刷新的打印流 |
PrintStream(OutputStream out, boolean autoFlush) | 创建输入到out流且自动刷新的打印流 |
特有方法
方法 | 说明 |
---|---|
void print(xxx val) | 打印val |
void println(xxx val) | 打印val并换行 |
说明
- 打印流的输出具有自动刷新功能且不会抛出IOException
- 打印流使用平台默认的字符编码转换字符
5. 网络编程
5.1. 概述
5.1.1. 软件架构
-
C/S架构:Client/Server结构,是指客户端和服务器结构
-
B/S架构:Browser/Server结构,是指浏览器和服务器结构
5.1.2. 通信三要素
- IP地址:在网络中唯一标识一台计算机,按照版本分为
- IPv4:4个字节,常用点分十进制表示
- IPv6:16个字节,常用
:
分开的8个无符号整数表示
- 端口号:在计算机上唯一表示一个进程,取值为0~65535
- 公认端口:0~1023,被预先定义的服务通信占用
- 注册端口:1024~49161,分配给用户进程或应用程序
- 私有端口:49152~65535
- 通信协议:通信双方连接和通信的规则,统一规定了数据的传输格式、传输速率、传输步骤和出错控制等
5.2. Socket编程
套接字(Socket)是指网络上由IP地址和端口号构成的标识符,用于把网络连接成流来传输数据
传输层协议
TCP协议 | UDP协议 | |
---|---|---|
特点 | 面向连接、可靠、基于字节流 | 面向无连接、不可靠、基于报文 |
组成 | 客户端、服务器 | 发送端、接收端 |
用途 | 大量数据传输,效率低 | 实时通信,效率高 |
5.2.1. 基于TCP协议
开发步骤
客户端
- 创建流套接字,指定服务端的IP地址和端口号
- 获取已连接套接字的IO流,进行读写操作
- 释放资源并关闭套接字
服务端
- 创建服务器套接字,并绑定要监听的端口
- 监听并处理客户端的连接请求,返回流套接字
- 获取已连接套接字的IO流,进行读写操作
- 释放资源并关闭套接字
5.2.2. 基于UDP协议
开发步骤
发送端
- 创建数据报套接字,随机分配端口号
- 创建数据报文,指定数据长度、接收端IP和端口号
- 调用套接字的send方法发送报文
- 释放资源并关闭套接字
接收端
- 创建数据报套接字,并指定监听端口号
- 创建数据包用于接收报文
- 调用套接字的receive方法接收报文
- 释放资源并关闭套接字
5.3. URL编程
5.3.1. 基本结构
<scheme>://<host>:<port>/<filepath>?query#fragmeng
- scheme:应用层协议
- host:主机IP或域名
- port:进程端口号
- path:资源路径
- query:查询参数列表
- fragmeng:信息片段
5.3.2. 开发步骤
- 创建URL实例并建立连接
- 获取连接的IO流,进行读写操作
- 释放资源并关闭连接
6. 反射机制
反射机制提供一种在程序运行期间借助Reflection API获取类的内部信息,并直接操作对象的内部属性和方法的方式,对应API位于
java.lang
和java.lang.reflect
包下
优点
- 反射提高了Java程序的灵活性和扩展性,降低了耦合性,提高了自适应能力
- 允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点
- 反射的性能较低,主要应用于对灵活性和扩展性要求很高的系统框架中
- 反射模糊程序的内部逻辑,可读性较差
6.1. 基础知识
6.1.1. 类加载过程
- 装载(Loading):类加载器将
.class
文件读入内存,并创建Class实例保存类的信息 - 链接(Linking)
- 验证(Verify):检查加载的类信息符合JVM规范
- 准备(Prepare):在方法区中正式分配类变量的内存并执行默认初始化
- 解析(Resolve):将JVM常量池的符号引用(常量名)替换为直接引用(地址)
- 初始化(Initialization):执行
类构造器<clinit>()
构造类及其父类信息
6.1.2. 类加载器
启动类加载器(Bootstrap ClassLoader)
- 基于C/C++语言实现,没有父加载器,尝试获取时返回null
- 加载核心库(%JAVA_HOME%/jre/lib/rt.jar或sun.boot.class.path指定路径下的类库)、子类加载器(扩展类加载器和应用程序类加载器)
- 出于安全考虑,仅加载包名以java、javax、sun等开头的类
扩展类加载器(Extension ClassLoader)
- 基于Java实现,继承ClassLoader类,父加载器为启动类加载器
- 加载%JAVA_HOME%/jre/lib/ext或java.ext.dirs指定路径下的类库
应用程序类加载器(系统类加载器,AppClassLoader)
- 基于Java实现,继承ClassLoader类,父加载器为扩展类加载器
- 加载CLASS_PATH或java.class.path指定路径下的类库
- 该加载器是应用程序的默认类加载器且是用户自定义类加载器的默认符加载器
- 系统类加载器可通过
ClassLoader.getSystemClassLoader()
获取
用户自定义类加载器(User-Defined ClassLoader)
- 实现类库的动态加载或应用隔离,需要继承ClassLoader类
6.2. Class类及其实例
- Class本身是一个类,其实例只能由系统创建,记载了某个特定结构的有关信息
- 所有类型(类、接口、数组、枚举、注解、基本数据类型、void)都有Class类的实例
- 在JVM中,一个类只有一个Class实例来记录.class文件中的信息
获取Class类的实例
// 方式一:访问类的class属性
Class clazz = ClassName.class;
// 方式二:调用对象的getClass()方法
Class clazz = obj.getClass();
// 方式三:调用Class类的静态方法
Class clazz = Class.forName(className);
// 方式四:调用类加载器的实例方法
ClassLoader cl = ClassLoader.getClassLoader();
Class clazz = cl.loadClass(className);
- className:全类名,即包含报名在内的完整类名
6.3. 反射的应用
6.3.1. 创建运行时类的对象
调用Class实例的newInstance()方法
- 获取类型的Class类实例
- 调用实例的
newInstance()
方法
调用构造器的newInstance()方法
- 获取类型的Class类实例
- 获取指定参数的构造器并设置访问权限(
setAccessible()
方法) - 调用构造器的
newInstance(...)
方法
6.3.2. 获取运行时类的完整结构
- 获取类的名称、修饰符、继承的父类、实现的接口、所在的包、泛型、注解等
- 获取类的内部成员及其细节信息,包括属性、方法、构造器、内部类、注解等
6.3.3. 操作运行时类的内部结构
操作指定的属性
- 获取类型的Class类实例
- 获取指定的属性并设置访问权限(
setAccessible()
方法) - 若为实例属性则创建Class类实例的对象
- 调用
get(...)
或set(...)
方法操作属性
调用指定的方法
- 获取类型的Class类实例
- 获取指定的方法并设置访问权限(
setAccessible()
方法) - 若为实例方法则创建Class类实例的对象
- 调用
invoke(...)
方法
6.3.4. 获取运行时类的注解信息
- 获取类型的Class类实例
- 获取指定的注解并进行处理
7. 常用API
7.1. 字符串
7.1.1. 字符串类
String | StringBuffer | StringBuilder | |
---|---|---|---|
特性 | 不可变、不可继承、可比较 | 可变、可继承 | 可变、可继承 |
安全 | —— | 线程安全 | 线程不安全 |
存储 | JDK 8.0 及之前:private char[]JDK 8.0 之后:private byte[] | JDK 8.0 及之前:private char[]JDK 8.0 之后:private byte[] | JDK 8.0 及之前:private char[]JDK 8.0 之后:private byte[] |
实例化 | String var = literal; String var = new String(…); | StringBuffer var = new StringBuffer(…); | StringBuilder var = new StringBuilder(…); |
常量池
字符串常量池(StringTable)中存放不同的字符串常量,其存储位置位于:方法区(JDK 7.0
之前)/堆空间(JDK 7.0
及之后)
7.1.2. 字符串拼接
+
运算符- 常量 + 常量:结果为常量池中的字面量
- 常量 + 变量 / 变量 + 常量:结果为堆空间中创建的对象
concat
方法- 无论调用者是变量还是常量,结果为堆空间中创建的对象
注意
- 常量包括两种类型:字面量、
final
变量
7.2. 对象比较
7.2.1. comparable
接口
- 定义类实现
comparable
接口 - 实现接口的
compareTo(Object obj)
方法 - 创建类的实例并比较大小或排序
7.2.2. comparator
接口
- 创建实现
comparator
接口的实现类 - 实现接口的
compare(Object obj1, Object obj2)
方法 - 创建实现类的实例并作为方法的参数实现对象比较或排序
7.3. 常用类
7.3.1. java.lang.Thread
常用属性
属性 | 说明 |
---|---|
static final int MAX_PRIORITY | 线程的最高优先级,即10 |
static final int MIN_PRIORITY | 线程的最低优先级,即1 |
static final int NORM_PRIORITY | 线程的默认优先级,即5 |
常用构造器
构造器 | 说明 |
---|---|
Thread() | 创建一个线程对象 |
Thread(String name) | 创建一个线程对象,并取名为name |
Thread(Runnable target) | 创建一个目标为target的线程对象 |
Thread(Runnable target, String name) | 创建一个目标为target的线程对象,并取名为name |
常用方法
方法 | 说明 |
---|---|
void run() | 存在Runnable实现类的实例时,调用其run()方法 |
void start() | 启动线程,使JVM调用该线程的run()方法 |
final String getName() | 返回当前线程的名称 |
final void setName(String name) | 修改当前线程的名称 |
final int getPriority() | 返回当前线程的优先级 |
final void setPriority(int newPriority) | 修改当前线程的优先级,优先级的范围为[1, 10] |
final boolean isAlive() | 测试线程是否处于存活 |
final void setDaemon(boolean on) | 将当前线程标记为守护/非守护线程 |
final void join() | 等待当前线程结束 |
final void join(long millis) | 等待线程结束,最长等待时间millis毫秒 |
static Thread currentThread() | 返回当前正在执行线程对象的引用 |
static void sleep(long millis) | 暂停当前执行的线程指定的毫秒数 |
static void yield() | 挂起当前正在执行的线程,让系统重新调度线程 |
final void stop() | ( |
final void suspend() | ( |
final void resume() | ( |
7.3.2. java.lang.String
常用属性
属性 | 说明 |
---|---|
private final char/byte value[] | 存储字符串数据的容器,其地址不可变 |
常用构造器
构造器 | 说明 |
---|---|
String() | 创建一个字符串对象,其值为空字符串序列 |
String(String original) | 创建一个字符串对象,其值为与original相同的字符串序列 |
String(char[] value) | 创建一个字符串对象,其值为value表示的字符串序列 |
String(char[] value, int offset, int count) | 创建一个字符串对象,其值为value[offset, offset + count)表示的字符串序列 |
String(byte[] bytes) | 使用默认字符集解码bytes数组来创建一个字符串对象 |
public String(byte[] bytes,String charsetName) | 使用charsetName字符集解码bytes数组来创建一个字符串对象 |
常用方法
方法 | 说明 |
---|---|
int length() | 返回字符串的长度 |
String concat(String str) | 将str拼接到字符串末尾并返回 |
boolean isEmpty() | 判断字符串是否为空(长度为0) |
boolean equals(Object obj) | 判断字符串与另一对象是否相等 |
boolean equalsIgnoreCase(String str) | 判断字符串与str是否相等(忽略大小写) |
String trim() | 删除字符串开头、结尾的所有空白符 |
String intern() | 返回字符串在常量池中的表示 |
String toLowerCase() | 将字符串转为小写 |
String toUpperCase() | 将字符串转为大写 |
boolean startsWith(String prefix) | 判断字符串是否以前缀prefix开始 |
boolean startsWith(String prefix, int toffset) | 判断字符串从是否以前缀prefix开始 |
boolean endsWith(String suffix) | 判断字符串是否以后缀suffix结束 |
int compareTo(String str ) | 比较字符串与str在Unicode编码下的大小 |
int compareToIgnoreCase(String str ) | 比较字符串与str在Unicode编码下的大小(忽略大小写) |
boolean contains(CharSequence s) | 判断字符串是否包含字符序列s |
int indexOf(String str) | 返回str在字符串中第一次出现的索引,不存在返回-1 |
int indexOf(String str, int fromIndex) | 返回str在字符串fromIndex之后第一次出现的索引,不存在返回-1 |
int lastIndexOf(String str) | 返回str在字符串中最后出现的索引,不存在返回-1 |
int lastIndexOf(String str, int fromIndex) | 返回str在字符串fromIndex之后最后出现的索引,不存在返回-1 |
String substring(int beginIndex) | 返回下标[beginIndex, 末尾]对应的子字符串 |
String substring(int beginIndex, int endIndex) | 返回下标[beginIndex, endIndex]对应的子字符串 |
char charAt(index) | 返回字符串index处的字符 |
char[] toCharArray() | 返回字符串的字符数组表示 |
static String valueOf(char[] data) static String copyValueOf(char[] data) | 返回字符数组data的字符串表示 |
static String valueOf(char[] data, int offset, int count) static String copyValueOf(char[] data, int offset, int count) | 返回字符数组data[offset, offset + count)表示的字符串 |
String replace(char oldChar, char newChar) | 用字符newChar替换字符串中的所有oldChar |
String replace(CharSequence target, CharSequence replacement) | 用字符序列replacement替换字符串中的所有target |
String replaceAll(String regex, String replacement) | 用字符序列replacement替换字符串中regex匹配的子序列 |
String replaceFirst(String regex, String replacement) | 用字符序列replacement替换字符串中regex匹配的第一个子序列 |
7.3.3. java.lang.StringBuffer/StringBuilder
常用属性
属性 | 说明 |
---|---|
char/byte value[] | 存储字符串数据的容器 |
int count | 记录有效字符的个数 |
常用构造器
构造器 | 说明 |
---|---|
StringBuffer/StringBuilder() | 创建一个空字符串,初始容量为16 |
StringBuffer/StringBuilder(CharSequence seq) | 创建一个包含序列seq的字符串 |
StringBuffer/StringBuilder(int capacity) | 创建一个空字符串,初始容量为capacity |
StringBuffer/StringBuilder(String str) | 创建一个包含字符序列str的字符串 |
常用方法
方法 | 说明 |
---|---|
int length() | 返回存储的字符数据的长度 |
StringBuffer append(xx) | 将xx拼接到字符串末尾 |
StringBuffer insert(int index, xx) | 将xx插入到字符串下标index处 |
StringBuffer delete(int start, int end) | 删除字符串[start, end)之间的字符 |
StringBuffer deleteCharAt(int index) | 删除字符串下标index处的字符 |
StringBuffer replace(int start, int end, String str) | 用str替换字符串[start, end)之间的字符 |
void setCharAt(int index, char ch) | 用ch替换字符串下标index处的字符 |
char charAt(int index) | 返回字符串下标index处的字符 |
StringBuffer reverse() | 反转字符串 |
void setLength(int newLength) | 设置当前字符串的长度(有效字符数)为newLength |
int indexOf(String str) | 返回字符串中str第一次出现的索引,不存在返回-1 |
int indexOf(String str, int fromIndex) | 返回字符串从fromIndex起str第一次出现的索引,不存在返回-1 |
int lastIndexOf(String str) | 返回字符串中str最后出现的索引,不存在返回-1 |
int lastIndexOf(String str, int fromIndex) | 返回字符串从fromIndex起str最后出现的索引,不存在返回-1 |
String substring(int beginIndex) | 返回字符串从beginIndex到末尾的子字符串 |
String substring(int beginIndex, int endIndex) | 返回字符串从beginIndex到endIndex的子字符串 |
String toString() | 返回当前字符序列的字符串表示 |
7.3.4. java.util.Date
常用构造器
构造器 | 说明 |
---|---|
Date() | 使用系统时间创建一个时间对象 |
Date(long date) | 使用时间戳date(毫秒数)创建一个时间对象 |
常用方法
方法 | 说明 |
---|---|
long getTime() | 返回当前对象的时间戳(毫秒数) |
String toString() | 返回“dow mon dd hh:mm:ss zzz yyyy”格式的时间字符串 |
7.3.5. java.text.SimpleDateFormat
常用构造器
构造器 | 说明 |
---|---|
SimpleDateFormat() | 创建使用默认模式和格式符的对象 |
SimpleDateFormat(String pattern) | 创建使用pattern指定模式的对象 |
常用方法
方法 | 说明 |
---|---|
String format(Date date) | 格式化时间对象 |
Date parse(String source) | 解析字符串以生成日期对象 |
常见规则
字母 | 含义 | 类型 |
---|---|---|
y | 年 | 数字 |
M | 月 | 数字、文本 |
w | 周数(年) | 数字 |
W | 周数(月) | 数字 |
D | 天数(年) | 数字 |
d | 日 | 数字 |
E | 星期 | 文本 |
a | 上下午 | 文本 |
H | 时(24小时制) | 数字 |
h | 时(12小时制) | 数字 |
m | 分 | 数字 |
s | 秒 | 数字 |
S | 毫秒 | 数字 |
z | 时区 | 本文 |
7.3.6. java.util.Calendar
常用属性
属性 | 说明 |
---|---|
static int YEAR | 年 |
static int MONTH | 月(从0开始) |
static int DAY_OF_MONTH | 日 |
static int DAY_OF_WEEK | 星期(周日为1) |
static int HOUR | 时(12小时制) |
static int HOUR_OF_DAY | 时(24小时制) |
static int MINUTE | 分 |
static int SECOND | 秒 |
常用方法
方法 | 说明 |
---|---|
static Calendar getInstance() | 获取默认时区的日历对象 |
int get(int field) | 返回field字段的值 |
void set(int field, int value) | 设置field字段的值为value |
void add(int field, int amount) | 按照日历规则为field字段加amount |
final Date getTime() | 获取该对象时间的Date对象表示 |
final void setTime(Date date) | 使用Date对象设置该对象的时间 |
7.3.7. java.time.LocalDate/LocalTime/LocalDateTime
常用方法
方法 | 说明 |
---|---|
static LocalDate/Time/DateTime now() | 根据当前时间创建默认时区的时间/日期对象 |
static LocalDate/Time/DateTime now(ZoneId zone) | 根据当前时间创建zone时区的时间/日期对象 |
static LocalDate/Time/DateTime of(params) | 根据params指定时间/日期创建时间/日期对象 |
type getXxx() | 获取对象的xxx属性 |
LocalDate/Time/DateTime with(TemporalAdjuster adjuster) | 将对象值设置为adjuster指定的日期/时间 |
LocalDate/Time/DateTime plusXxx(long amount) | 将对象的xxx属性加amount |
LocalDate/Time/DateTime minusXxx(long amount) | 将对象的xxx属性减amount |
boolean isLeapYear() | 判断对象表示的年是否为闰年 |
String format(DateTimeFormatter formatter) | 使用formatter格式化对象的字符串 |
static LocalDate/Time/DateTime parse(Charsequence text) | 解析text字符串以创建日期/时间对象 |
7.3.8. java.time.Instance
常用方法
方法 | 说明 |
---|---|
static Instance now() | 根据当前系统时间创建UTC时区的Instance对象 |
static Instance ofEpochMilli(long epochMilli) | 根据时间戳epochMilli创建Instance对象 |
OffsetDateTime atOffset(ZoneOffset offset) | 根据当前对象和offset创建一个偏移日期时间对象 |
long toEpochMilli() | 获取当前对象的时间戳 |
7.3.9. java.time.format.DateTimeFormatter
常用属性
属性 | 说明 |
---|---|
static DateTimeFormatter ISO_LOCAL_DATE_TIME | ISO时间日期标准格式“yyyy-MM-ddTHH:mm:ss” |
static DateTimeFormatter ISO_LOCAL_DATE | ISO日期标准格式“yyyy-MM-dd” |
static DateTimeFormatter ISO_LOCAL_TIME | ISO时间标准格式“HH:mm ”或“HH:mm:ss ” |
常用方法
方法 | 说明 |
---|---|
static DateTimeFormatter ofPattern(String pattern) | 根据指定的模式创建格式化对象 |
String format(TimporalAccessor accessor) | 格式化时间日期对象表示的时间字符串 |
TemporalAccessor parse(CharSequence text) | 解析text字符串以创建时间日期对象 |
7.3.10. java.util.Collections
Collections
是一个操作Set、List和Map等集合的工具类
常用方法
方法 | 说明 |
---|---|
static void reverse(List list) | 反转列表list中的元素顺序 |
static void shuffle(List list) | 打乱列表list中的元素顺序 |
static void sort(List list) | 按照自然顺序对列表list中的元素排序 |
static void sort(List list, Comparator c) | 按照Comparator指定顺序对列表list中的元素排序 |
static void swap(List list, int i, int j) | 交换列表list中下标为i和j的元素 |
static T max(Collection coll) | 返回自然顺序中集合coll的最大元素 |
static T max(Collection coll, Comparator c) | 返回Comparator指定顺序中集合coll的最大元素 |
static T min(Collection coll) | 返回自然顺序中集合coll的最小元素 |
static T min(Collection coll, Comparator c) | 返回Comparator指定顺序中集合coll的最小元素 |
static int binarySearch(List list, T key) | 返回列表list中元素key在自然排序下的下标 |
static int binarySearch(List list, T key, Comparator c) | 返回列表list中元素key在Comparator指定顺序下的下标 |
static int frequency(Collection c,Object o) | 返回元素o在集合list中出现的次数 |
static void copy(List dest,List src) | 将列表src中的元素拷贝到集合list中,其中src.size() <= dest.size() |
boolean addAll(Collection c, T… elements) | 将指定的所有元素elements添加到集合c中 |
boolean replaceAll(List list,Object oldVal,Object newVal) | 将集合list中的所有值为oldVal的元素替换为newVal |
static Xxx unmodifiableXxx(Xxx xxx) | 返回Xxx的不可修改视图 |
static Xxx synchronizedXxx(Xxx xxx) | 返回Xxx的的线程安全版本 |
7.3.11. java.io.File
- 一个实现文件/目录的创建、删除、重命名等功能的类,不能访问文件内容
- 类的对象表示一个文件或目录(万事万物皆对象),但该文件/目录在磁盘上不一定存在
常用构造器
构造器 | 说明 |
---|---|
File(String pathname) | 以pathname为抽象路径创建文件对象 |
File(String parent, String child) | 以parent为父路径,child为子路径创建文件对象 |
File(File parent, String child) | 以parent为父路径,child为子路径创建文件对象 |
常用方法
方法 | 说明 |
---|---|
String getName() | 返回对象的名称 |
String getPath() | 返回对象的抽象路径 |
String getParent() | 返回对象上层目录的抽象路径 |
String getAbsolutePath() | 返回对象的绝对路径 |
File getAbsoluteFile() | 返回该对象的绝对路径表示 |
long length() | 返回文件的长度(字节数) |
long lastModified() | 返回文件/目录上一次修改的时间 |
String[] list() | 返回目录下的所有子文件/目录的路径数组 |
File[] listFiles() | 返回目录下的所有子文件/目录的对象数组 |
boolean exists() | 判断文件/目录是否存在 |
boolean isDirectory() | 判断对象是否是目录 |
boolean isFile() | 判断对象是否是文件 |
boolean canRead() | 判断文件/目录是否可读 |
boolean canWrite() | 判断文件/目录是否可写 |
boolean isHidden() | 判断文件/目录是否隐藏 |
boolean createNewFile() | 创建文件,并返回是否创建成功 |
boolean mkdir() | 创建目录,并返回是否创建成功 |
boolean mkdirs() | 创建多级目录,并返回是否创建成功 |
boolean delete() | 删除文件/目录,并返回是否删除成功 |
boolean renameTo(File dest) | 使用文件对象dest重命名文件/目录,并返回是否成功 |
7.3.12. java.io.Reader
常用方法
方法 | 说明 |
---|---|
int read() | 从流中读取单个字符(到达末尾返回-1) |
int read(char[] cbuf) | 从流中读取字符到数组并返回读取数量(到达末尾返回-1) |
abstract int read(char[] cbuf, int off, int len) | 从流中读取字符到数组指定位置并返回读取数量(到达末尾返回-1) |
abstract void close() | 关闭流并释放相关资源 |
7.3.13. java.io.Writer
常用方法
方法 | 说明 |
---|---|
void write(int c) | 将单个字符写到流中 |
void write(char[] cbuf) | 将字符数组写到流中 |
abstract void write(char[] cbuf, int off, int len) | 将字符数组的指定部分写到流中 |
void wirte(String str) | 将字符串写到流中 |
void wirte(String str, int off, int len) | 将字符串的指定部分写到流中 |
abstract void flush() | 刷新流 |
abstract void close() | 刷新并关闭流 |
7.3.14. java.io.InputStream
常用方法
方法 | 说明 |
---|---|
abstract int read() | 从流中读取单个字符(到达末尾返回-1) |
int read(byte[] b) | 从流中读取字节到数组并返回读取数量(到达末尾返回-1) |
abstract int read(byte[] b, int off, int len) | 从流中读取字节到数组指定位置并返回读取数量((到达末尾返回-1) |
void close() | 关闭流并释放相关资源 |
7.3.15. java.io.OutputStream
常用方法
方法 | 说明 |
---|---|
abstract void write(int b) | 将单个字节写到流中 |
void write(byte[] b) | 将字节数组写到流中 |
void write(byte[] b, int off, int len) | 将字节数组的指定部分写到流中 |
void flush() | 刷新流并强制写出所有字节 |
void close() | 关闭流并释放相关资源 |
7.3.16. java.net.InetAddress
常用方法
方法 | 说明 |
---|---|
static InetAddress getLocalHost() | 获取本机IP的InetAddress实例 |
static InetAddress getByName(String host) | 获取host指定主机的InetAddress实例 |
static InetAddress getByAddress(byte[] addr) | 获取addr指定主机的InetAddress实例 |
String getHostName() | 返回IP地址的主机名 |
String getHostAddress() | 返回IP地址的字符串表示 |
boolean isReachable(int timeout) | 测试IP地址是否可达 |
7.3.17. java.net.ServerSocket
常用构造器
构造器 | 说明 |
---|---|
ServerSocket(int port) | 创建绑定到端口port的服务器套接字 |
常用方法
方法 | 说明 |
---|---|
Socket accept() | 监听并接受连接请求,返回流套接字 |
7.3.18. java.net.Socket
常用构造器
构造器 | 说明 |
---|---|
Socket(InetAddress address, int port) | 创建连接到指定主机和端口号的流套接字 |
Socket(String host, int port) | 创建连接到指定主机和端口号的流套接字 |
常用方法
方法 | 说明 |
---|---|
InputStream getInputStream() | 返回套接字的输入流 |
OutputStream getOutputStream() | 返回套接字的输出流 |
void shutdownInput() | 禁用套接字的输入流 |
void shutdownOutput() | 发送套接字的数据并禁用输出流 |
InetAddress getInetAddress() | 返回套接字连接的远程地址,未连接则返回null |
InetAddress getLocalAddress() | 返回套接字连接的本地地址 |
int getPort() | 返回套接字连接的远程端口号,未连接则返回0 |
int getLocalPort() | 返回套接字连接的本地端口号,未绑定则返回-1 |
void close() | 释放资源并关闭套接字 |
7.3.19. java.net.DatagramSocket
常用构造器
构造器 | 说明 |
---|---|
DatagramSocket() | 创建绑定到本机随机端口和默认IP的数据报套接字 |
DatagramSocket(int port) | 创建绑定到本机指定端口和默认IP的数据报套接字 |
DatagramSocket(int port, InetAddress addr) | 创建绑定到本机指定端口和IP的数据报套接字 |
常用方法
方法 | 说明 |
---|---|
void send(DatagramPacket p) | 使用套接字发送数据包 |
void receive(DatagramPacket p) | 使用套接字接收数据包 |
InetAddress getInetAddress() | 返回套接字连接的远程地址,未连接则返回null |
InetAddress getLocalAddress() | 返回套接字连接的本地地址 |
int getPort() | 返回套接字连接的远程端口号,未连接则返回-1 |
int getLocalPort() | 返回套接字连接的本地端口号 |
void close() | 释放资源并关闭套接字 |
7.3.20. java.net.DatagramPacket
常用构造器
构造器 | 说明 |
---|---|
DatagramPacket(byte[] buf, int length) | 构造接收长度为length的数据包的报文 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 构造将长度为length的数据包发送到指定主机的指定端口的报文 |
常用方法
方法 | 说明 |
---|---|
InetAddress getInetAddress() | 返回报文来源/目的的地址 |
int getPort() | 返回报文来源/目的的端口 |
byte[] getData() | 返回报文的数据缓冲区 |
int getLength() | 返回报文中数据的长度(字节数) |
7.3.21. java.net.URL
常用构造器
构造器 | 说明 |
---|---|
URL(String spec) | 使用表示URL的字符串构造对象 |
URL(URL context, String spec) | 使用基URL和表示相对URL的字符串构造对象 |
URL(String protocol, String host, String file) | 使用指定协议、主机和文件构造对象 |
URL(String protocol, String host, int port, String file) | 使用指定协议、主机、端口和文件构造对象 |
常用方法
方法 | 说明 |
---|---|
String getProtocol() | 返回对象的协议名 |
String getHost() | 返回对象的主机名 |
String getPort() | 返回对象的端口号 |
String getPath() | 返回对象的文件路径 |
String getFile() | 返回对象的文件名 |
String getQuery() | 返回对象的查询名 |
URLConnection openConnection() | 返回对象的URL连接实例 |
final InputStream openStream() | 返回对象的输入流实例 |
7.3.22. java.lang.Class
常用方法
方法名 | 功能说明 |
---|---|
static Class forName(String className) | 返回className指定类的Class实例 |
ClassLoader getClassLoader() | 返回Class实例的类加载器 |
Object newInstance() | 调用无参构造器创建Class实例的对象 |
String getName() | 获取Class实例表示实体的名称 |
Package getPackage() | 获取Class实例所在的包 |
Class getSuperClass() | 获取Class实例继承类的Class实例 |
Type getGenericSuperclass() | 获取Class实例继承类的带泛型Class实例 |
Class[] getInterfaces() | 获取Class实例实现的所有接口的Class实例 |
Type getGenericInterfaces() | 获取Class实例实现的所有接口的带泛型Class实例 |
Constructor<?>[] getConstructors() | 获取Class实例的所有公共构造器 |
Constructor<?>[] getDeclaredConstructors() | 获取Class实例声明的所有构造器 |
Constructor< T > getConstructors(Class<?>… parameterTypes) | 获取Class实例具有指定参数的公共构造器 |
Constructor< T > getDeclaredConstructors(Class<?>… parameterTypes) | 获取Class实例声明的具有指定参数的构造器 |
Field[] getFields() | 获取Class实例的所有公共属性 |
Field[] getDeclaredFields() | 获取Class实例声明的所有属性 |
Field getField(String name) | 获取Class实例指定的公共属性 |
Field getDeclaredFields(String name) | 获取Class实例声明的指定属性 |
Method[] getMethods() | 获取Class实例的所有公共方法 |
Method[] getDeclaredMethods() | 获取Class实例声明的所有方法 |
Method[] getMethod(String name, Class<?>… parameterTypes) | 获取Class实例指定的公共方法 |
Method[] getMethod(String name, Class<?>… parameterTypes) | 获取Class实例声明的指定方法 |
Annotation[] getAnnotations() | 获取元素关联的所有注解 |
Annotation[] getDeclaredAnnotations() | 获取元素上出现的所有注解 |
< A extends Annotation > A[] getAnnotation(Class< A > annotationClass) | 获取元素关联的指定注解 |
< A extends Annotation > A[] getDeclaredAnnotation(Class< A > annotationClass) | 获取元素上出现的特定注解 |
Class<?>[] getClasses() | 获取Class实例的所有公共内部类/接口 |
Class<?>[] getDeclaredClasses() | 获取Class实例声明的所有内部类/接口 |
7.4. 常用接口
7.4.1. java.util.Collection
常用方法
方法 | 说明 |
---|---|
boolean add(E e) | 将元素e添加到集合中 |
boolean addAll(Collection c) | 将集合c的所有元素添加到集合中 |
int size() | 返回集合中的元素个数 |
boolean isEmpty() | 判断集合是否为空(元素个数为0) |
boolean contains(Object o) | 判断集合中是否包含元素o |
boolean containsAll(Collection c) | 判断集合中是否包含c中的所有元素 |
boolean equals(Object o) | 判断集合与o(的元素)是否(按序)相等 |
void clear() | 清楚集合中的所有元素 |
void remove(Object o) | 删除集合中的元素o |
void removeAll(Collection c) | (差集)删除集合中所有存在于c中的元素 |
void retainAll(Collection c) | (交集)保留集合中所有存在于c中的元素 |
Object[] toArray() | 返回包含集合所有元素的数组 |
int hashcode() | 返回集合的hash code |
Iterator iterator() | 返回集合的迭代器 |
注意
- 判断集合是否存在某个元素使用equals方法比较
7.4.2. java.util.Iterator
常用方法
方法 | 说明 |
---|---|
Iterator iterator() | 返回容器的迭代器对象 |
E next() | 获取迭代器位置之后的一个元素 |
boolean hasNext() | 判断迭代器位置之后是否存在元素 |
default void remove() | 删除迭代器返回的最后一个元素 |
7.4.3. java.util.List
常用方法
方法 | 说明 |
---|---|
void add(int index, E e) | 将元素e插入到索引index处 |
boolean addAll(int index, Collection c) | 将结合c的所有元素插入到索引index处 |
E get(int index) | 返回索引index处的元素 |
E set(int index, E e) | 将索引index处的元素修改为e |
int indexOf(Object o) | 返回对象o在列表中的第一次出现的索引 |
int lastIndexOf(Object o) | 返回对象o在列表中的最后一次出现的索引 |
E remove(int index) | 返回并删除索引index处的元素 |
List subList(int fromIndex, int toIndex) | 返回索引[fromIndex, toIndex)处元素组成的子列表 |
7.4.4. java.util.Map
常用方法
方法 | 说明 |
---|---|
int size() | 返回map中entry的个数 |
V get(Object key) | 返回键key对应的value |
V put(K key, V value) | 如果键key不存在,添加key-value到map中 否则,修改键key对应的值为value |
void putAll(Map m) | 将m中所有的entry添加到map中 |
void clear() | 清空map中所有的entry |
V remove(Object key) | 删除键key对应的entry |
boolean isEmpty() | 判断map是否为空 |
boolean equals(Object obj) | 判断map和obj是否相等 |
boolean containsKey(Object key) | 判断map中是否包含键key |
boolean containsValue(Object value) | 判断map中是否包含值value |
Set keySet() | 返回所有键构成的Set集合 |
Set entrySet() | 返回所有entry构成的Set集合 |
Collection values() | 返回所有值构成的Collection集合 |
8. 扩展
8.1. 增强for循环
语法格式
for (type var: Collection/Array) {
...
}
执行流程
从可迭代容器中依次取出一个元素赋值给var,并执行相关操作,直到取遍容器中的所有元素