jdk1.8的新特性
一丶lamuda表达式
函数式接口可以用 ()->{}代替内部类
二丶stream流 操作
创建stream:
1.集合.stream;
2.Arrays.stream(数组);
3.通过Stream的iteate创建 一个无限流
stream的分类:
1.stream:串行流
2.parallelStream:并行流
三丶四大基本函数式接口
Function<T, R>:传入T类型返回R类型 stream.map();
Consumer<T>:传入T不返回 消费数据 stream.forEach(); strea.sorted();
Supplier<T>:生产一个T类型的对象 返回一个T对象 生产数据
Predicate<T>:对T进行断言判断 返回一个boolean stream.filter
四丶新日期类
旧时间操作类:
Date:线程不安全,功能 不够全面
Calendar:现线程不安全,是 Date的替代品
新时间操作类
LocalDate:获取日期
LocalTime:获取时间
LocalDateTime:获取日期时间
ZonedDateTime:获取带时区的时间
Instant:获取时间戳
Duration:用于计算两个时间间隔的类
旧时间格式化器:
SimpleDateFormat:线程不安全
新时间格式化器:
DateTimeFormatter:线程安全,支持格式多,提供语言选择
五丶IO流
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
AIO(NIO.2): 异步非阻塞IO,在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
通道:Channel ,不记录数据只负责传输
BIO/NIO通道
FileChannel //文件通道
SocketChannel //客户端 client通道
ServerSocketChannel //tcp服务端server通道
DatagramChannel //udp服务端server通道
AIO通道:
AsynchronousFileChannel //异步文件通道
AsynchronousSocketChannel //异步网络客户端client通道
AsynchronousServerSocketChannel //y异步网络服务端server通道
缓冲区 :负责数据的存储
ByteBuffer
CharBuffer
…
获取方式
allocate:非直接缓冲区,程序–>用户态–>内核态–>磁盘
allocateDirect:直接缓冲区,程序–>内核态–>磁盘 快但风险和不可控指数高
四大参数
byteBuffer.limit(); //界限 界限外的不可读写 可以理解为有效数据
byteBuffer.capacity(); //容量 一旦声明不可改变
byteBuffer.position(); //正在操作的缓冲区的位置
byteBuffer.mark(); //记录psotation的位置
关系:postation<limit<capacity
四种操作方式
flip:切换到读数据
rewind:切换到写数据
clear:还原四大参数,缓冲区的数据不被清除
reset:回复到mark记录的位置
阻塞模式切换非阻塞模式
SocketChannel.configureBlocking(false);
Selector 选择器:
//获取选择器
Selector selector = Selector.open();
//注册选择器:将
open.register(selector, SelectionKey.OP_ACCEPT);
while (selector.select()>0) {
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey next = iterator.next();
if (next.isAcceptable()) {
SocketChannel accept = open.accept();
ByteBuffer allocate = ByteBuffer.allocate(1024);
while (accept.read(allocate) > 0) {
allocate.flip();
System.out.println(new String(allocate.array(), 0, allocate.array().length));
allocate.clear();
}
} else if (next.isReadable()) {
SocketChannel accept = open.accept();
ByteBuffer allocate = ByteBuffer.allocate(1024);
while (accept.read(allocate) > 0) {
allocate.flip();
System.out.println(new String(allocate.array(), 0, allocate.array().length));
allocate.clear();
}
}
}
iterator.remove();
}