笔者建议初学者学习Java的方式:看书+视频+实践(初学最难的问题其实还是在环境)
Java学习书籍推荐
《Head First Java.第二版》:
可以说是我的Java启蒙书籍了,特别适合新手读当然也适合我们用来温故Java知识点。
《Java核心技术卷1+卷2》:
很棒的两本书,建议有点Java基础之后再读,介绍的还是比较深入的,非常推荐。
《Java编程思想(第4版)》:
这本书要常读,初学者可以快速概览,中等程序员可以深入看看java,老鸟还可以用之回顾java的体系。这本书之所以厉害,因为它在无形中整合了设计模式,这本书之所以难读,也恰恰在于他对设计模式的整合是无形的。
一些Java方向学习书籍汇总(PDF仅为预览版本,建议购买正版):
链接:https://pan.baidu.com/s/1g0mjyJX5ZWU706IKjDSzeg 密码:b88d
Java学习视频推荐
以下视频整理自慕课网Java工程师路径相关免费课程。
- 语法基础: 《Java入门第一季》
- 面向对象: 《Java入门第二季》
- 常用工具类: 《Java入门第三季》
- 文件操作: 《二进制基础》 -> 《文件传输基础——Java IO流》 -> 《Java眼中的XML---文件读取》 ->《Java眼中的XML 文件写入》
- 网路Socket编程: 《Java Socket应用---通信是这样练成的》
- Java进阶之反射与注解: 《反射——Java高级开发必须懂的》 -> 《全面解析Java注解》
Java基础面试常见问题汇总
- 重载和重写的区别
- 自动装箱与拆箱
- 成员变量与局部变量的区别有那些?
- 静态方法和实例方法有何不同?
- equals 和 == 的区别?
- 创建线程有几种不同的方式?你喜欢哪一种?为什么?
- 线程有哪些基本状态?这些状态是如何定义的?
- finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
- List,Set,Map三者的区别及总结
- Arraylist 与 LinkedList 区别
- ArrayList 与 Vector 区别(为什么要用Arraylist取代Vector呢?)
- HashMap 和 Hashtable 的区别
- HashSet 和 HashMap 区别
- HashMap 和 ConcurrentHashMap 的区别
- HashSet如何检查重复
- comparable 和 comparator的区别?
- 如何对Object的list排序?
- 如何实现数组与List的相互转换?
- 如何求ArrayList集合的交集 并集 差集 去重复并集
- HashMap 的工作原理及代码实现
- ConcurrentHashMap 的工作原理及代码实现
- 集合框架底层数据结构总结
- 集合的选用
- 集合的常用方法
- 集合的选用
超详细的Java面试题总结(四 )之JavaWeb基础知识总结
- 简述Servlet
- 阐述Servlet和CGI的区别?
- Servlet接口中有哪些方法及Servlet生命周期探秘
- get和post请求的区别?
- 转发(Forward)和重定向(Redirect)的区别?
- Servlet与线程安全
- JSP和Servlet是什么关系?
- JSP工作原理:
- JSP有哪些内置对象?作用分别是什么?
- Request对象的主要方法有哪些?
- request.getAttribute()和 request.getParameter()有何区别?
- JSP九大内置对象,七大动作,三大指令-
- 实现会话跟踪的技术有哪些?
- Cookie和Session的的区别?
作者:
链接:http://www.imooc.com/article/39146
来源:慕课网
作者:
链接:https://www.imooc.com/article/39012
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
作者:
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很广泛,但是效率较低。
非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。
异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把全部IO句柄复制到内核
2 内核每次都要遍历全部IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能下降明显
epoll的特点
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,然后去读取数据
只需要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不需要多次复制所有的IO句柄。因此,可以同时支持的IO句柄数轻松过百万。
网络编程,一定要非常了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
作者:
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很广泛,但是效率较低。
非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。
异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把全部IO句柄复制到内核
2 内核每次都要遍历全部IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能下降明显
epoll的特点
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,然后去读取数据
只需要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不需要多次复制所有的IO句柄。因此,可以同时支持的IO句柄数轻松过百万。
网络编程,一定要非常了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
作者:
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很广泛,但是效率较低。
非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。
异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把全部IO句柄复制到内核
2 内核每次都要遍历全部IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能下降明显
epoll的特点
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,然后去读取数据
只需要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不需要多次复制所有的IO句柄。因此,可以同时支持的IO句柄数轻松过百万。
网络编程,一定要非常了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
作者:
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
下面都是以网络读数据为例
【2阶段网络IO】
第一阶段:等待数据 wait for data
第二阶段:从内核复制数据到用户 copy data from kernel to user
下面是5种网络IO模型
【阻塞blocking IO】
两阶段全程阻塞
recvfrom -> [syscall -> wait -> copy ->] return OK
【非阻塞nonblocking IO】
第一阶段是非阻塞的不断检查是否数据准备好,第二阶段阻塞读取数据
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return no data ready
recvfrom -> [syscall -> wait ->] return ready
recvfrom -> [syscall -> copy ->] return OK
【多路复用IO multiplexing】
每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据
select/pool -> [syscall -> wait ->] return readable
recvfrom -> [syscall -> copy ->] return OK
【信号驱动signal driven IO】
第一阶段构造一个信号处理器,第二阶段阻塞读取数据
signal handle -> [syscall -> wait ->] return
[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK
【异步asynchronous IO】
两阶段都是非阻塞
aio_read -> [syscall -> wait ->] return
[syscall -> copy ->] aio_read callback
5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。
阻塞IO编程简单,这种方式使用很广泛,但是效率较低。
非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。
多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。
异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。
【select / epoll 对比】
select不足的地方:
1 每次select都要把全部IO句柄复制到内核
2 内核每次都要遍历全部IO句柄,以判断是否数据准备好
3 select模式最大IO句柄数是1024,太多了性能下降明显
epoll的特点
1 每次新建IO句柄(epoll_create)才复制并注册(epoll_ctl)到内核
2 内核根据IO事件,把准备好的IO句柄放到就绪队列
3 应用只要轮询(epoll_wait)就绪队列,然后去读取数据
只需要轮询就绪队列(数量少),不存在select的轮询,也没有内核的轮询,不需要多次复制所有的IO句柄。因此,可以同时支持的IO句柄数轻松过百万。
网络编程,一定要非常了解网络IO模型,对系统设计和架构选型才能有更好的选择和把握。
作者:
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作