java初学者指南

笔者建议初学者学习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基础知识篇

  1. 重载和重写的区别
  2. 自动装箱与拆箱
  3. 成员变量与局部变量的区别有那些?
  4. 静态方法和实例方法有何不同?
  5. equals 和 == 的区别?

超详细的Java面试题总结(二)之Java基础知识篇

  1. 创建线程有几种不同的方式?你喜欢哪一种?为什么?
  2. 线程有哪些基本状态?这些状态是如何定义的?
  3. finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

超详细的Java面试题总结(三)之Java集合篇常见问题

  1. List,Set,Map三者的区别及总结
  2. Arraylist 与 LinkedList 区别
  3. ArrayList 与 Vector 区别(为什么要用Arraylist取代Vector呢?)
  4. HashMap 和 Hashtable 的区别
  5. HashSet 和 HashMap 区别
  6. HashMap 和 ConcurrentHashMap 的区别
  7. HashSet如何检查重复
  8. comparable 和 comparator的区别?
  9. 如何对Object的list排序?
  10. 如何实现数组与List的相互转换?
  11. 如何求ArrayList集合的交集 并集 差集 去重复并集
  12. HashMap 的工作原理及代码实现
  13. ConcurrentHashMap 的工作原理及代码实现
  14. 集合框架底层数据结构总结
  15. 集合的选用
  16. 集合的常用方法
  17. 集合的选用

超详细的Java面试题总结(四 )之JavaWeb基础知识总结

  1. 简述Servlet
  2. 阐述Servlet和CGI的区别?
  3. Servlet接口中有哪些方法及Servlet生命周期探秘
  4. get和post请求的区别?
  5. 转发(Forward)和重定向(Redirect)的区别?
  6. Servlet与线程安全
  7. JSP和Servlet是什么关系?
  8. JSP工作原理:
  9. JSP有哪些内置对象?作用分别是什么?
  10. Request对象的主要方法有哪些?
  11. request.getAttribute()和 request.getParameter()有何区别?
  12. JSP九大内置对象,七大动作,三大指令-
  13. 实现会话跟踪的技术有哪些?
  14. Cookie和Session的的区别?

作者:
链接:http://www.imooc.com/article/39146
来源:慕课网
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
作者:
链接:https://www.imooc.com/article/39012
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
第一阶段:等待数据 wait for data
作者:
链接:https://www.imooc.com/article/37093
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

下面都是以网络读数据为例

【2阶段网络IO】

第一阶段:等待数据 wait for data

第二阶段:从内核复制数据到用户 copy data from kernel to user

下面是5种网络IO模型

https://img2.mukewang.com/5b28d3da0001ea4e07560430.jpg

【阻塞blocking IO】

两阶段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

https://img.mukewang.com/5b28d3f6000184cc07740430.jpg

【非阻塞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

https://img4.mukewang.com/5b28d4040001cc5007650430.jpg

【多路复用IO multiplexing】

每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

https://img.mukewang.com/5b28d41600019b7e07560430.jpg

【信号驱动signal driven IO】

第一阶段构造一个信号处理器,第二阶段阻塞读取数据

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

https://img3.mukewang.com/5b28d4200001ffc707560430.jpg

【异步asynchronous IO】

两阶段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

https://img2.mukewang.com/5b28ce2300011fc009600720.jpg

5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。

阻塞IO编程简单,这种方式使用很广泛,但是效率较低。

非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。

多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。

异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。

https://img1.mukewang.com/5b28d43c00011d7406320177.jpg

【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模型

https://img2.mukewang.com/5b28d3da0001ea4e07560430.jpg

【阻塞blocking IO】

两阶段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

https://img.mukewang.com/5b28d3f6000184cc07740430.jpg

【非阻塞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

https://img4.mukewang.com/5b28d4040001cc5007650430.jpg

【多路复用IO multiplexing】

每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

https://img.mukewang.com/5b28d41600019b7e07560430.jpg

【信号驱动signal driven IO】

第一阶段构造一个信号处理器,第二阶段阻塞读取数据

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

https://img3.mukewang.com/5b28d4200001ffc707560430.jpg

【异步asynchronous IO】

两阶段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

https://img2.mukewang.com/5b28ce2300011fc009600720.jpg

5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。

阻塞IO编程简单,这种方式使用很广泛,但是效率较低。

非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。

多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。

异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。

https://img1.mukewang.com/5b28d43c00011d7406320177.jpg

【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模型

https://img2.mukewang.com/5b28d3da0001ea4e07560430.jpg

【阻塞blocking IO】

两阶段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

https://img.mukewang.com/5b28d3f6000184cc07740430.jpg

【非阻塞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

https://img4.mukewang.com/5b28d4040001cc5007650430.jpg

【多路复用IO multiplexing】

每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

https://img.mukewang.com/5b28d41600019b7e07560430.jpg

【信号驱动signal driven IO】

第一阶段构造一个信号处理器,第二阶段阻塞读取数据

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

https://img3.mukewang.com/5b28d4200001ffc707560430.jpg

【异步asynchronous IO】

两阶段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

https://img2.mukewang.com/5b28ce2300011fc009600720.jpg

5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。

阻塞IO编程简单,这种方式使用很广泛,但是效率较低。

非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。

多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。

异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。

https://img1.mukewang.com/5b28d43c00011d7406320177.jpg

【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模型

https://img2.mukewang.com/5b28d3da0001ea4e07560430.jpg

【阻塞blocking IO】

两阶段全程阻塞

recvfrom -> [syscall -> wait -> copy ->] return OK

https://img.mukewang.com/5b28d3f6000184cc07740430.jpg

【非阻塞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

https://img4.mukewang.com/5b28d4040001cc5007650430.jpg

【多路复用IO multiplexing】

每个IO都是非阻塞IO,第一阶段通过select/poll方法,一次性轮询多个IO句柄,检查是否有IO句柄准备好,第二阶段阻塞读取数据

select/pool -> [syscall -> wait ->] return readable

recvfrom -> [syscall -> copy ->] return OK

https://img.mukewang.com/5b28d41600019b7e07560430.jpg

【信号驱动signal driven IO】

第一阶段构造一个信号处理器,第二阶段阻塞读取数据

signal handle -> [syscall -> wait ->] return

[syscall ->] signal handle -> recvfrom -> [syscall -> copy ->] return OK

https://img3.mukewang.com/5b28d4200001ffc707560430.jpg

【异步asynchronous IO】

两阶段都是非阻塞

aio_read -> [syscall -> wait ->] return

[syscall -> copy ->] aio_read callback

https://img2.mukewang.com/5b28ce2300011fc009600720.jpg

5种网络IO对比,只有aio才是全程非阻塞,其它4种都是同步IO。

阻塞IO编程简单,这种方式使用很广泛,但是效率较低。

非阻塞IO效率较高,但是编程较复杂,有开发语言和代码库支持就简单多了。

多路复用非阻塞IO效率比非阻塞IO更高,在大规模的网络IO处理中尤其明显,支持的程序也越来越多。

异步IO效率很高,但是编程很复杂。node.js中使用的就是异步IO。

https://img1.mukewang.com/5b28d43c00011d7406320177.jpg

【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
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
展开阅读全文

没有更多推荐了,返回首页