java{{}}匿名内部类初始化
前言在刷题的时候看到有人写代码用了{{}}写法,以前没有见过,特此记录。
1Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};
简单介绍举例{{}}这种方法是对一个集合进行初始化操作,避免了对集合初始化进行一条一条的add。
1234567891011ArrayList<String> list = new ArrayList<String>(){{ add("A"); add("B"); add("C");}};// 和下面功能实现一样// ArrayList<String> list = new ArrayList<String>();// list.add("a");/ ...
第四章Netty第一节概述
1. 原生NIO存在的问题
NIO的类库和API繁杂,使用麻烦。需要熟练掌握Selector, ServerSocketChannel, SocketChannel, ByteBuffer等。
开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
2. Netty官方说明
Netty 是由JBOSS提供的一个Java开源框架,Netty提供异步的,基于事件驱动的网络应用程序框架,用以快速开发高性能,高可靠的网络IO程序。
Netty 可以帮助你快速、简单的开发出一个网络应用,相当于简化和流程化了 NIO 的开发过程。
Netty 是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。
3. Netty的优点
设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池. ...
第三章 第三节NIO零拷贝
1. NIO与零拷贝1.1 零拷贝基本介绍
零拷贝是网络编程的关键,很多性能优化都离不开
Java程序中,常用的零拷贝有mmap(内存映射)和sendFile。
传统的IO数据读写 需要三次用户态和内核态切换 4次内存的拷贝
mmap优化
mmap经过内存映射(userbuffer 和 kernelbuffer 共享),将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据(直接从内核空间buffer拷贝到内核空间socketbuffer)。这样,进行网络传输时,可以减少内核空间到用户空间的拷贝次数。
sendFile优化(DMA copy)
linux2.1 :数据不经过用户态,直接从内核缓冲区 => socketBuffer => protocal engin.,由于和用户态完全无关,就减少了一次上下文切换.
linux2.4: 直接从内核缓冲区 => 协议栈(拷贝到socketBuffer信息很少,忽略不计)
零拷贝再次理解
零拷贝:指的是没有CPU拷贝。通过DMA拷贝。(所谓DMA拷贝就是通过其他硬件负责 ...
第三章 第二节NIO网络编程应用实例-群聊系统
1. 案例需求编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)实现多人群聊服务器端:可以监测用户上线,离线,并实现消息转发功能客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)目的:进一步理解NIO非阻塞网络编程机制
2. 流程服务端
监听客户端连接
初始化工作,实例化selector,实例化serverSocketChannel.设置非阻塞。注册ACCEPT事件
监听客户端连接请求,将socketChannel注册到selector,注册为READ事件。
读取客户端信息,打印输出
读取socketChannel信息
将客户端信息转发到其他的客户端
获取所有的keys。如果channel instanceof socketChannel && 不是当前的客户端的channel,向其他客户端channel写入数据。
客户端
发送信息初始化工作,实例化selector,实例化SocketChannel,连接服务器.设置非阻塞。向socketChannel写 ...
第三章 第一节JavaNIO编程
1. Java NIO基本介绍
Java NIO(Non-blocking IO)指JDK提供新的API.从JDK1.4开始,java提供了一系列改进IO的新特性,被统称为NIO,是同步非阻塞的。
NIO相关类和接口都放在java.nio包及其子包下面,并且对java.io包中很多类进行了改写。
NIO有三大核心部分:Channel(通道), Buffer(缓冲区), Selector(选择器)
NIO是面向缓冲区的。数据读取到一个稍后处理的缓冲区中去,需要的时候可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用他可以提供非阻塞性的高伸缩性网络。
Java NIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果么有数据可读,就什么也不用处理,而不是保持线程阻塞,该线程可以做其他的事情。
NIO可以一个线程处理多个操作。1000个请求过来,分配50-100个线程处理就够了,不需要像NIO那样,非得分配1000个。
HTTP2.0 使用了多路复用技术,一个连接并发处理多个请求。
2. NIO和BIO的比较
BIO以流的方式处理数据,NI ...
第一章 Netty介绍
1. Netty介绍
是一个异步的、基于事件驱动的网络应用框架,用以开发高性能,高可靠性的网络io程序。
Netty主要针对在TCP协议下,面向clients端的高并发应用,或者peer-to-peer场景下大量数据持续传输的应用。
Netty本质上是一个NIO框架,适用于服务器通讯相关的多种应用场景。
2. 应用场景2.1 互联网行业
互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少。Netty作为异步高性能的通信框架,往往作为基础通信组件被这些RPC框架使用。
典型的引用: 阿里分布式服务框架Dubbo 的RPC框架使用Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各个节点之间的内部通信。
2.2 游戏行业
Netty作为高性能的基础通信组件,提高了TCP/UDP和HTTP协议,方便定制和开发私有协议栈,账号登录服务器。
地图服务器之间可以方便的通过Netty进行高性能的通信。
2.3 大数据行业
Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨节 ...
第二章 java BIO编程
1. I/O模型1.1 I/O模型的基本说明
I/O模型简单的理解:就是用什么样的数据通道进行数据的发送和接受,很大程度上决定了IO程序的性能
java支持三种IO模型:BIO, NIO, AIO
java BIO: 同步非阻塞模型(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有一个连接,服务器就新建一个线程进行处理,如果这个连接不释放,这个线程就会阻塞在那里造成不必要的线程开销。
java NIO:同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的请求连接会注册到多路复用器上,多路复用器轮询到连接有IO请求就会进行处理。
java AIO: 异步非阻塞,AIO引入了异步通道的概念,采用了Proactor模式,简化了程序编写,有效的请求才启动线程,他的特点是操作系统完成后才通知服务端程序启动线程去处理,一般使用于连接数量较多,连接时间较长的应用。
2. BIO,NIO,AIO使用场景分析
BIO适用于 连接数量少,架构固定的应用,对服务器资源要求高。程序简单容易理解.JDK 1.4以前的选择。
NI ...
剑指Offer52.两个链表的第一个公共节点
一、题目剑指 Offer 52. 两个链表的第一个公共节点题目描述输入两个链表,找出它们的第一个公共节点。
示例1:
12输入: A=[4,1,8,4,5] B=[5,0,1,8,4,5]输出: 8
示例2:
12输入: A=[4,1,8] B=[5,0,1]输出: NULL
二、分析1.方法1:消除差距法
两个链表相交之后,后面都是一样的,需要找第一个公共节点。
但是他们的第一个公共节点在哪儿呢。我们通过两个链表的长度之差,定位到长链表的遍历起始地方。
此举消除了起始位置差,保证了两个链表同时遍历后一定能同时到达第一个公共节点。
2.方法2:浪漫相遇法
该方法实质上也是一种消除差距的方法。方法1消除差距是利用长链表遍历的时候先走几步(先出发),直到达到长,短链表遍历能够同步。
浪漫相遇法两个指针遍历同时出发,都走长短链表之和的路程。虽然前面的路程不同,但是因为有公共节点。后面一截路程一定相同,也就一定会相遇。
如下图第一个相遇的节点就是所求结果
三、代码1.消除差距法12345678910111213141516171819202122232425262728 ...
什么是回调函数callback?
需求A,B两个小组开发一个功能。B小组开发制作油条模块:make_youtiao。A小组需要调用B小组开发的模块,然后执行后续的操作:sell()如下图:
上面的方式A小组必须等待B小组开发的模块make_youtiao执行完成后才能执行sell()。
上图代码的写法:
12make_youtiao(10000);sell();
存在的问题:A小组不知道啥时候B小组执行完,因此必须等待B小组执行完,再执行后续的操作sell(),效率不够高。
要是A能够告诉B小组,你执行完make_youtiao后自动执行sell()就好了!我把任务交给你之后就去做其他事情啦~
看懂了?回调函数就是上面的sell()函数,不过他要作为参数传递给B小组。
上面功能用回调函数实现
B小组开发的模块这样定义:
12345void make_youtiao(int num, func call_back) { // 制作油条 do_youtiao(); call_back(); //执行回调 }
A小组这样调用,将make_youtiao完成后和make_ ...
Servlet&HTTP&Reques&Response快速入门
servlet相关配置
URLPattern:servlet访问路径
一个servlet可以定义多个访问路径
1@WebServlet({"/d4","/dd4","/ddd4"})
路径规则:
/xxx:路径匹配
/xxx/xx:多层路径,目录结构
*.do:拓展名匹配
HTTP
概念
Hyper Text Transfer Protocol超文本传输协议。何谓协议?即定义了两个设备之间传输信息的格式。
特点
默认端口号是80
基于请求/响应模型的:一次请求对应一次响应
无状态的,每次请求之间相互独立,不能交互数据
3.版本
1.0:每一次请求相应都会建立新的连接
1.1:复用连接
请求消息数据格式
请求行
1GET /login.html HTTP/1.1
HTTP协议中有7种请求方法,常用的有2种
GET
请求参数在请求行中,在url后?连接
请求的url长度有限制
不太完全
POST
请求参数在请求体中
请求的url长 ...