Strings=a[i];
//处理s
}
foreach简化语法:
for(Strings:
a){
//处理s
}
● 集合的迭代遍历
for(Iteratorit=list.iterator();it.hasNext();){
Strings=it.next();
//处理s
}
foreach简化语法:
for(Strings:
list){
//处理s
}
2、异常
● 封装错误信息的对象
● 错误信息:
⏹ 类名
⏹ 提示消息
⏹ 行号
2.1 异常的继承结构
Throwable
|-Error 系统级错误
|-Exception 可修复的错误
|- 其他Exception
|-RuntimeException
|-NullPointerException
|-ArrayIndexOutOfBoundsException
|-NumberFormatException
|-ArithmeticException
|-ClassCastException
|-...
2.2 异常捕获
try{
}catch(AExceptione){
}catch(BExceptione){
}catch(父类型Exceptione){
}finally{
不管出错不出错,都会执行
}
2.3 throws
● 为方法设置异常的抛出管道
voidf()throwsA,B,C{
}
● 方法中抛出异常,必须有对应类型的管道才能抛出
● 异常处理两种方式(必须二选一):
⏹ 捕获
⏹ 添加管道抛出
3、异常(续)
3.1 try-catch 和 throw
● catch 捕获异常
⏹ 修复异常
● throw
⏹ 向前抛,让前面代码处理
● 一般底层异常,要抛到上层处理
● 经验少,不知道该 catch 还是 throw,选throw
3.2 throw
● 手动抛出异常,执行异常的抛出动作
AExceptione=newAException();
thorwe;
3.3 异常包装
● 捕获的异常对象,包装成另一种类型,再抛出
try{
}catch(AException e){
thrownewBException(e);
}
● 使用场景:
◆ 不能抛出的异常,包装成能抛出的类型,再抛出
◆ 异常简化
● 方法重写时,子类方法,异常不能比父类方法多
3.4 自定义异常
● 现有的异常类型,不能表示具体业务中的错误
● 自定异常,用新的异常类型名称,来表示错误
◆ 转账失败
ZhuanZhangShiBaiException
◆ 用户名错误
UsernameNotFoundException
◆ 密码错误
WrongPasswordException
● 自定义异常
◆ 起一个合适的类名
◆ 选择一个合适的父类
◆ 添加合适构造方法
4、io
● io
Input/Output
输入 / 输出
● java.io 包
File
InputStream/OutputStream
FileInputStream/FileOutputStream
BufferedInputStream/BufferedOutputStream
ObjectInputStream/ObjectOutputStream
Reader/Writer
InputStreamReader/OutputStreamWriter
BufferedReader
PrintWriter、PrintStream
5、File
● 封装一个磁盘路径字符串,对这个路径可以执行一次操作
● 可以封装:
◆ 文件的路径
◆ 文件夹的路径
◆ 不存在的路径
● 文件、文件夹属性方法
◆ length()
文件的字节量,文件夹无效
◆ exists() 是否存在
◆ isFile() 是否文件
◆ isDirectory() 是否文件夹
◆ lastModified() 最后修改时间毫秒值
◆ getName() 文件、文件夹名
◆ getParent() 父文件夹
◆ getAbsolutePath() 完整路径
◆ ....
● 创建、删除方法
◆ createNewFile()
新建文件,
文件已经存在,不会新建文件,返回false
文件夹不存在,会出现异常
◆ mkdirs()
新建多层文件夹
◆ delete()
删除文件,删除空文件夹
◆ File.createTempFile()
在系统临时目录中,创建临时文件
● 文件夹列表方法
◆ list()
返回String[] 数组
["a.txt", "b.txt", "c.txt"]
◆ listFiles()
返回 File[] 数组
5.1 流 Stream
● 把数据的读写操作,抽象成数据在管道中流动
● 流只能单方向流动
◆ 输入流,用来读取数据
◆ 输出流,用来输出数据
● 数据只能从头到尾顺序读写一次
5.2InputStream/OuputStream
● 字节流的抽象父类
● write(intb)
int四个字节中,只输出末尾的一个字节值
● write(byte[]buff)
输出数组中全部字节值
● write(byte[]buff,start,length)
输出数组中从 start 开始的 legnth 个字节值
● read()
读取一个字节值,再补三个0字节,转成int
读取结束,再读取,返回 -1
● read()
5.3FileInputStream/FileOutputStream
● 直接插在文件上,直接读写文件数据
● 创建对象
◆ newFileOutputStream(文件)
不管文件是否存在,都会新建空文件;
文件夹不存在,会出现异常
◆ newFileOutputStream(文件, true)
如果文件已经存在,追加数据
5.4BufferedInputStream/BufferedOutputStream
● 缓冲流,提供一个内存缓冲区,提高单字节读写效率
● BufferedInputStream
预读一批数据,缓存在它内部数组中
● BufferedOutputStream
输出的数据,暂时缓存在它内部数组中,缓存满会批量输出,或者手动 flush() 刷出
5.6ObjectInputStream/ObjectOutputStream
● 对象序列化和反序列化流
● writeObject(Objectobj)
● readObject()
● 不序列化的成员变量
⏹ static
属于类,不随对象被序列化输出
⏹ transient
临时,只在程序运行期间,在内存中存在,不会随对象被序列化持久保存
● 序列化版本id
⏹ 控制旧版本的数据,不能恢复成新版本的类型
staticfinalserialVersionUID=7
⏹ 自己不定义,编译器会添加版本id
◆ 根据类的定义信息,计算产生一个版本值
6 字符编码
● ASC-II
0 到 127
英文字符、标点,控制指令字符
● iso-8859-1,Latin-1
160 到 255
西欧字符
● CJK (中日韩)等
⏹ 双字节编码
⏹ 256 到 65535
● GBK
⏹ 国标码
⏹ 2万+ 中文
● Unicode
⏹ 统一码、万国码
⏹ 100万+
⏹ 常用字符表,双字节
⏹ 生僻字符表,三字节或以上
● UTF-8
⏹ UnicodeTransformationFormat
Unicode 传输格式
⏹ 英文,单字节
⏹ 某些字符,双字节
⏹ 中文,三字节
⏹ 特殊符号,四字节
● GBK
a中 -- 61 d6d0
● Unicode
a中 -- 0061 4e2d
● UTF-8
a中 -- 61 e4b8ad
6.1 Java的char类型字符,采用 Unicode 编码
6.2 Java的编码转换运算
● Unicode--> 其他编码
s="abc中文";
//转成系统默认编码
byte[]a=s.getBytes();
//转成指定的编码
s.getBytes("UTF-8");
● 其他编码 -->Unicode
//从默认编码转换
s=newString(byte[]);
//从指定的编码转换
s=newString(byte[],"UTF-8");
7 Reader/Writer
● 字符流的抽象父类
● 方法
⏹ write(intc)
int四个字节中,末尾两个字节是char类型字符的字节值,只处理末尾两个字节的输出
⏹ write(char[]buff)
⏹ write(char[]buff,start,length)
⏹ write(Strings)
8InputStreamReader/OutputStreamWriter
● 编码转换流
● InputStreamReader
读取其他编码,转换成 Unicode
● OutputStreamWriter
Unicode转成其他编码输出
9 BufferedReader
● 字符缓冲流,提高单个字符读写效率
● readLine()
⏹ 读取一行字符串,返回值不含末尾换行符
10 PrintWriter、PrintStream
● 打印输出流
● 任何类型数据,都可以转成字符串输出
out.write(97) -->61
out.print(97) -->3937
● 方法
⏹ print()
⏹ println()
● PrintStream 只能接字节流
● PrintWriter 能接字节流,也能接字符流
11 io小结
● File
⏹ 文件目录属性
⏹ 创建删除
⏹ 目录列表
● 字节流
⏹ FileIn...
⏹ BufferedIn...
⏹ ObjectIn...
⏹ PrintStream
● 字符流
⏹ InputStreamReader/OutputStreamWriter
⏹ BufferedReader readLine()
⏹ PrintWriter println()
8 线程
● 进程
⏹ 在操作系统中,并行运行的任务
● 线程
⏹ 进程内部并行执行的子任务
8.1 创建线程
● 继承 Thread
● 实现 Runnable
8.2 继承 Thread
● 定义 Thread 子类
● 重写 run() 方法
● 线程启动后,并行执行 run() 方法中的代码
8.3 线程的方法
● Thread.currentThread()
获得正在执行这行代码的线程对象
● Thread.sleep(毫秒值)
让当前线程暂停指定的毫秒时长
● start()
● getName()
● setName(name)
● interrupt()
打断一个线程的暂停状态,
被打断的线程,会出现 InterruptedException
● join()
当前线程暂停,等待被调用的线程执行结束
main线程执行:
t.join()
main暂停,等待t线程结束
● getPriority()
● setPriority(优先级)
线程优先级 1 到 10,默认是5
● setDaemon(true)
把线程,设置成后台线程、守护线程
虚拟机等待所有前台线程结束,自动退出
不会等待后台线程结束
8.3 多线程数据访问冲突
● 一个线程修改数据
● 另一个线程同时访问数据
● 访问到修改了一半的数据,称为“脏数据”
8.4 线程同步 (步调一致)
● 一个线程修改数据时,另一个线程等待
● 一个线程访问数据时,修改线程等待
8.4.1 同步锁
● Java中任何对象上,都有唯一的一个同步锁
● 让多个线程执行时,争夺同一个对象的锁
● 抢到锁可以执行,抢不到锁,要等待
8.5 synchronized
● 同步
● synchronized(对象){
代码
}
⏹ 争夺指定对象的锁
● synchronizedvoidf(){
代码
}
⏹ 争夺当前对象的锁 this
● staticsynchronizedvoidf(){
代码
}
⏹ 争夺“类”的锁 R1.class
8.6 生产者、消费者
● 线程间的通信模型
● 生产者线程,产生数据,放入一个数据容器
● 消费者线程,从数据容器,获取数据进行处理
8.7 等待和通知
● Object 的方法
⏹ wait()
⏹ notify()
⏹ notifyAll()
● 线程在被调用的对象上等待
● 向在被调用的对象上等待的线程发出通知
● 等待和通知方法,必须在同步代码块内才能调用
● 等待和通知的对象,必须是加锁的对象
synchronized(a){
a.wait()
a.notifyAll()
}
● wait() 外面,通常使用循环检查条件
● notify() 只通知所有等待线程中的一个
● notifyAll() 通知所有等待的线程
9 网络
● win+r, 输入cmd
● 执行命令:
ipconfig
ping192.168.31.xxx
如果ping不通,对方要关闭防火墙
9.1 Socket通信
● Socket 网络套接字
● IP地址
● 端口
9.2 ServerSocket
服务器端Socket
● 在服务器端,选择一个端口,等待客户端发起连接
● 启动服务
ServerSocketss=newServerSocket(端口);
● 等待客户端发起连接,并建立连接通道,
返回的 Socket 对象,是连接通道的服务器端插头
Sockets=ss.accept();
9.3 客户端Socket
● 新建Socket对象,连接指定服务器的指定端口
Sockets=newSocket(ip, 端口);
● 从Socket获得双向的流
in=s.getInputStream()
out=s.getOutputStream()
● 设置接收数据的等待超时时长
s.setSoTimeout(毫秒值)
等待接收数据超时后,会出现SocketTimeoutException
10 反射 Reflect
● 框架底层代码都是通过反射执行
config.txt
day1802.A;f1
day1802.B;f2
day1802.C;f3
● 使用方法区加载的“类”,执行反射操作
● 反射可以:
⏹ 获得类的定义信息
◆ 包名、类名
◆ 成员变量定义信息
◆ 构造方法定义信息
◆ 方法定义信息
⏹ 反射创建对象
⏹ 反射调用成员
10.1 获得“类对象”(三种方式)
● Classc=A.class
● Classc=Class.forName("day1802.A")
● Classc=a.getClass()
10.2 获得包名类名
● c.getPackage().getName()
● c.getName() 完整类名
● c.getSimpleName() 简写类名
10.3 成员变量的定义信息
● getFields()
获得所有可见的变量,包含从父类继承的变量
● getDeclaredFields()
获得本类定义的变量,包括私有,不包含继承的变量
● getField(变量名)
● getDeclaredField(变量名)
10.4 构造方法的定义信息
● getConstructors()
获得所有可见的构造方法
● getDeclaredConstructors()
获得所有构造方法,包括私有
● getConstructor(参数类型列表)
● getDeclaredConstructor(参数类型列表)
10.5 方法的定义信息
● getMethods()
获得所有可见的方法,包含从父类继承的方法
● getDeclaredMethods()
获得所有本类定义的方法,包括私有,
不包含继承的方法
● getMethod(方法名,参数类型列表)
● getDeclaredMethod(方法名,参数类型列表)
10.6 反射创建对象
● 执行无参构造
Objectobj=c.newInstance()
● 执行有参构造
//1. 获得构造方法
Constructort=c.getDeclaredConstructor(int.class,String.class);
//2. 创建对象,并执行这个构造方法
Objectobj= t.newInstrance(5,"sdfsd");
10.7