来自 编程 2019-10-05 06:19 的文章
当前位置: 澳门三合彩票 > 编程 > 正文

如何回复,协理只发送header消息

网络编程

网络编程

计算机网络

  • HTTP1.0和HTTP1.1的主要区别
    • 长连接和流水线
  • TCP和UDP的区别
  • 三次握手,两次可以吗

澳门三合彩票 1

  • 3次握手描述

    TCP三次握手详解及释放连接过程
    TCP协议中的三次握手和四次挥手(图解)
    SYN=1 ACK=0 seq=x
    SYN=1 ACK=1 seq=y ack=x+1
    ACK=1 seq=x+1 ack=y+1

    • ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
    • SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
    • FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
  • 为什么连接的时候是三次握手,关闭的时候却是四次握手?
    答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

  • 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    答:B向A发送 FIN = 1 的释放连接请求,但这个报文丢失了, A没有接到不会发送确认信息, B 超时会重传,这时A在 WAIT_TIME 还能够接收到这个请求,这时再回复一个确认就行了。(A收到 FIN = 1 的请求后 WAIT_TIME会重新记时)

  • TCP滑动窗口

    TCP 的那些事儿(下) http://coolshell.cn/articles/11609.html

是否了解针对3次握手的恶意攻击,如何应对

  1. OSI与TCP/IP各层的结构与功能,都有哪些协议。
  2. TCP与UDP的区别。
  3. TCP报文结构。
  4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。
  5. TCP拥塞控制。
  6. TCP滑动窗口与回退N针协议。
  7. Http的报文结构。
  8. Http的状态码含义。
  9. Http request的几种类型。
  10. Http1.1和Http1.0的区别
  11. Http怎么处理长连接。
  12. Cookie与Session的作用于原理。
  13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。
  14. Ping的整个过程。ICMP报文是什么。
  15. C/S模式下使用socket通信,几个关键函数。
  16. IP地址分类。
  17. 路由器与交换机区别。
  • 滑动窗口
  • epoll模型
  • socket
  • 完整访问一个域名的具体流程
  • RIP:距离向量路由算法
    • 路径较多时,收敛慢,广播路由信息时占用的带宽资源多,适用于网络拓扑结构相对简单且数据链路故障率低的小型网络(小于15跳)
    • RIP通过UDP数据包更新路由信息。每隔30s更新一次路由信息,如果在180s内没有收到相邻路由器的回应,则认为去往该路由器的路由不可用,该路由器不可到达。如果在240s后仍未收到该路由器的应答,则把有关该路由器的路由信息从路由表中删除。
    • 配置简单
  • OSPF:采用链路状态路由选择技术,开放最短路径优先算法
    • 每个 OSPF 路由器维护相同自治系统拓扑结构的数据库。从这个数据库里,构造出最短路径树来计算出路由表。当拓扑结构发生变化时, OSPF 能迅速重新计算出路径,而只产生少量的路由协议流量。
    • 收敛速度快;没有跳数限制; 支持服务类型选路; 提供负载均衡和身份认证;
    • OSPF支持通往相同目的的多重路径,支持费用相同的多条链路上的负载均衡。
    • OSPF使用路由标签区分不同的外部路由。
    • OSPF支持路由验证,只有互相通过路由验证的路由器之间才能交换路由信息;并且可以对不同的区域定义不同的验证方式,从而提高了网络的安全性。
    • 适用于规模庞大、环境复杂的互联网,支持大型异构网络的互联。
    • 通过IP报文传输路由信息
  • BGP:BGP必须依靠面向连接的TCP会话以提供连接状态
    • BGP通过携带AS路径信息,可以彻底的解决路由循环问题。
    • 为了控制路由的传播和路由的选择,为路由附带属性信息。
    • 使用TCP作为其传输层协议,提高了协议的可靠性。端口号179。
    • BGP-4支持CIDR(无类别域间选路),CIDR的引入简化了路由聚合,减化了路由表。
    • BGP更新时只发送增量路由,减少了BGP传播路由占用的带宽。
    • 提供了丰富的路由策略。

ISO模型与协议

ISO模型与协议

操作系统

  • 分页、分段、段页
  • ps top 命令
  1. 进程和线程的区别。
  2. 死锁的必要条件,怎么处理死锁。
  3. Window内存管理方式:段存储,页存储,段页存储。
  4. 进程的几种状态。
  5. IPC几种通信方式。
  6. 什么是虚拟内存。
  7. 虚拟地址、逻辑地址、线性地址、物理地址的区别。

http1.0:需要使用keep-alive参数来告知服务器端要建立一个长连接

http1.0:需要使用keep-alive参数来告知服务器端要建立一个长连接

数据结构

  • took算法
  • 手写内存拷贝
  1. 链表与数组。
  2. 队列和栈,出栈与入栈。
  3. 链表的删除、插入、反向。
  4. 字符串操作。
  5. Hash表的hash函数,冲突解决方法有哪些。
  6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。
  7. 快排的partition函数与归并的Merge函数。
  8. 对冒泡与快排的改进。
  9. 二分查找,与变种二分查找。
  10. 二叉树、B+树、AVL树、红黑树、哈夫曼树。
  11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。
  12. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。
  13. KMP算法。
  14. 排列组合问题。
  15. 动态规划、贪心算法、分治算法。(一般不会问到)
  16. 大数据处理:类似10亿条数据找出最大的1000个数.........等等

http1.1:默认长连接。支持只发送header信息,可以用作权限请求。支持Host域。

http1.1:默认长连接。支持只发送header信息,可以用作权限请求。支持Host域。

数据库

> 运维角度浅谈MySQL数据库优化 http://blog.jobbole.com/87450/
  • 范式

  • 存储过程

  • 事务

  • 索引

    数据库中聚簇索引与非聚簇索引的区别(不错)
    http://www.jb51.net/article/29693.htm
    http://blog.jobbole.com/86594/

  • 索引块与数据块的区别
    大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录在磁盘上占用
    1000字节的话,我们对其中10字节的一个字段建立索引,那么该记录对应的索引块的大小只有10字节。我们知道,SQL
    Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我
    们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页面才能
    够找到结果。如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块,然后根据索引块上
    的指针逐一找到结果数据块,这样IO访问量要少的多。

  • 聚簇索引与非聚簇索引的本质区别
    聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。

    还是通过一道数学题来看看它们的区别吧:假设有一8000条记录的表,表中每条记录在磁盘上占用1000字节,如果在一个10字节长的字段上建立非 聚簇索引主键,需要二叉树节点16000个(这16000个节点中有8000个叶节点,每个页节点都指向一个数据记录),这样数据将占用8000条 ×1000字节/8K字节=1000个页面;索引将占用16000个节点×10字节/8K字节=20个页面,共计1020个页面。

    同样一张表,如果我们在对应字段上建立聚簇索引主键,由于聚簇索引的页节点就是数据节点,所以索引节点仅有8000个,占用10个页面,数据仍然占有1000个页面。
    下面我们看看在执行插入操作时,非聚簇索引的主键为什么比聚簇索引主键要快。主键约束要求主键不能出现重复,那么SQL Server是怎么知道不出现重复的呢?唯一的方法就是检索。对于非聚簇索引,只需要检索20个页面中的16000个节点就知道是否有重复,因为所有主键 键值在这16000个索引节点中都包含了。但对于聚簇索引,索引节点仅仅包含了8000个中间节点,至于会不会出现重复必须检索另外1000个页数据节点 才知道,那么相当于检索10+1000=1010个页面才知道是否有重复。所以聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。

    让我们再来看看数据检索的效率,如果对上述两表进行检索,在使用索引的情况下(有些时候SQL Server执行计划会选择不使用索引,不过我们这里姑且假设一定使用索引),对于聚簇索引检索,我们可能会访问10个索引页面外加1000个数据页面得 到结果(实际情况要比这个好),而对于非聚簇索引,系统会从20个页面中找到符合条件的节点,再映射到1000个数据页面上(这也是最糟糕的情况),比较 一下,一个访问了1010个页面而另一个访问了1020个页面,可见检索效率差异并不是很大。所以不管非聚簇索引也好还是聚簇索引也好,都适合排序,聚簇 索引仅仅比非聚簇索引快一点。

  • MySQL中有哪些索引,怎么实现的(B树)

    • 普通索引
    • 唯一索引(主键)
    • 全文索引
    • 多列索引 ALTER TABLE tableName ADD INDEX indexName(col, col...);
      • 优点:最左前缀:创建多列索引,相当于创建了多组索引
  • 选择索引列:在where和join子句中出现的列上创建索引,MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE ‘Mich%’;”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE ‘%ike’;”这个查询不会使用索引。

  • 分析索引效率:EXPLAIN sql 以及 profile工具
    索引为什么会提高效率

  • 索引为什么不是越多越好

    • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    • 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度
  • MySQL存储过程:Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命令

    http://www.cnblogs.com/findumars/archive/2013/05/20/3089861.html

    • 优点
      • 可以使用流控制语句编写,灵活性强,可以完成较复杂的判断和运算
      • 允许标准组件式编程,封装与抽象
      • 编译优化,实现较快的执行速度
      • 减少网络流量,只需传输调用语句
      • 可以作为一种安全机制,系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
    • 修改DELIMITER
    • 存储过程只有三种类型参数 IN,OUT,INOUT调用过程时过程有几个参数传几个参数,只是IN型的参数可以传的是变量,可以是常量,而OUT和INOUT型的参数传的必须是变量传给out,inout参数的变量值会随着在过程中改变在外部也改变,而给in参数的变量外部值则不受过程内变量值改变的影响
    • 存储过程如果只有一个语句则语句不用 begin...end包围存储过程中可以直接使用外部定义的变量存储过程中用set和select定义的变量就是全局的,执行该过程后内部用set和select定义的变量外部可以访问,其他过程也可以直接使用
  • 游标
    在Java中调用存储过程的方法
    数据库中的范式

  • MySQL锁

    http://www.jb51.net/article/50047.htm

    • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
    • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
  • MySQL的事务操作:ACID

    http://blog.csdn.net/chosen0ne/article/details/10036775

    • Atomicity
    • Consistency
    • Isolation
    • 脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
    • 不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
    • 幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。
    • Durability
  • 事务隔离级别

    • Read Uncommitted(读取未提交内容)

    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

    • Read Committed(读取提交内容)

    这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

    • Repeatable Read(可重读)

    这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

    • Serializable(可串行化)

    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

    • 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
      • 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
      • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
      • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
  • MyISAM和innoDB的区别

    • MySQL默认采取MyISAM
    • MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。
    • InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
    • InnoDB支持外键,MyISAM不支持。
    • InnoDB的主键范围更大,最大是MyISAM的2倍。
    • InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。
    • MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。
    • 没有where的count()使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count()时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count()的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。
    • 如果执行大量的select,选择MyISAM;如果执行大量的insert、update操作,选择innoDB

http2.0:多路复用的技术,做到同一个连接并发处理多个请求。HTTP2.0使用HPACK算法对header的数据进行压缩。支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。

http2.0:多路复用的技术,做到同一个连接并发处理多个请求。HTTP2.0使用HPACK算法对header的数据进行压缩。支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。

算法和数据结构

  • 红黑树底层实现
  • B+、B树

会话层:负责管理主机之间的会话进程,负责建立、管理、终止进程之间的会话。

会话层:负责管理主机之间的会话进程,负责建立、管理、终止进程之间的会话。

Java

122个Java面试题:http://www.importnew.com/17232.html
volatile和Synchronized区别

  • Thread和Runnable区别
    • Thread编写简单,获取线程,无需使用Thread.currentThread(),this就可以
    • Runnable避免了Java单继承带来的局限
    • Runnable有利于实现多个线程共享资源
      澳门三合彩票,原子性、可见性的概念
      equals hashcode
      几个项目技术点提问
      线程池的概念、好处、常见的线程池举例
      Java用过哪些数据结构
  • stringbuffer与stringbuilder的区别
    • string是字符串常量
    • stringbuffer是字符串变量,线程安全
    • stringbuilder是字符串变量,非线程安全
      Callable和Runnable的区别
      hashmap的实现原理
      treemap的实现原理
      手写代码,一组字符串按字典顺序排序
      复杂度分析,有没有更快点的
      手写代码,一组字符串按出现次数排序
      comparable与comparator的区别
      iterator迭代器用法
      手写代码,写一个线程安全的单例模式
  • 生产者和消费者模式
//使用阻塞队列
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ProducerConsumerPattern {

    public static void main(String args[]){

     //Creating shared object
     BlockingQueue sharedQueue = new LinkedBlockingQueue();

     //Creating Producer and Consumer Thread
     Thread prodThread = new Thread(new Producer(sharedQueue));
     Thread consThread = new Thread(new Consumer(sharedQueue));

     //Starting producer and Consumer thread
     prodThread.start();
     consThread.start();
    }

}

//Producer Class in java
class Producer implements Runnable {

    private final BlockingQueue sharedQueue;

    public Producer(BlockingQueue sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    @Override
    public void run() {
        for(int i=0; i<10; i++){
            try {
                System.out.println("Produced: " + i);
                sharedQueue.put(i);
            } catch (InterruptedException ex) {
                Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

//Consumer Class in Java
class Consumer implements Runnable{

    private final BlockingQueue sharedQueue;

    public Consumer (BlockingQueue sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    @Override
    public void run() {
        while(true){
            try {
                System.out.println("Consumed: "+ sharedQueue.take());
            } catch (InterruptedException ex) {
                Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

//非阻塞队列

public class BlockQueue(){
    private List queue = new LinkedList();
    private int limit = 10;

    public BlockQueue(int limit){
        this.limit = limit;
    }

    public synchronized void enqueue(Object obj){
        if(this.limit == this.queue.size()){
            wait();
        }

        if(this.queue.size() == 0){
            notifyAll();
        }

        this.queue.add(obj);
    }

        public synchronized void dequeue(Object obj){
        if(this.limit == 0){
            wait();
        }

        if(this.queue.size() == this.limit){
            notifyAll();
        }

        this.queue.remove(obj);
    }
}
  • 饱汉与饿汉的区别
//饱汉模式,面临多线程访问的安全问题,需要做双重锁定才能保证安全
public class Singleton{
    private static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null){
                    instance = new Singleton();  //创建和赋值是分两步进行的,JVM并不保证这两者发生的顺序,因此可能先创建了一个对象,直接赋值给instance,然后初始化,引起错误;由此改进方法必须确保初始化在赋值之前发生
                }
            }

        }

        return instance;

    }
}
// 改进版
public class Singleton{
    private Singleton(){}

    private static class SingletonFactory{
        private static Singleton instance = new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonFactory.instance;
    }
}

//饿汉模式,类加载就实例化对象,不管是否使用
pubilc class Singleton{
    private static Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}
  • 方法重载(overload):实现的是编译时的多态性,也称为前绑定
  • 方法重写(overwrite):实现的是运行时的多态性,也称为后绑定
  • 面向对象开发基本原则
    • 单一职责:
    • 开放封闭:对扩展开放,对修改关闭
    • 里氏替换:子类可以替换掉父类
    • 依赖倒置:面向接口编程(方法的返回值、引用类型等最好是抽象类型而不是具体类型)
    • 合成聚合复用:优先使用聚合和合成复用代码
    • 接口隔离:接口应该小而专,而不是大而全,接口应该是高内聚的
    • 迪米特法则:一个对象对其他对象应当尽可能少的了解
      string类有哪些方法
      hashmap的实现原理
      容量超了怎么办
      concurrenthashmap的实现原理
      深拷贝与浅拷贝描述
      线程之间通信的方法
      怎么用信号量实现资源共享
      深拷贝与浅拷贝描述
      comparable与comparator的区别
      iterator迭代器用法
      手写代码,写一个线程安全的单例模式
  • 强、软、弱、虚
    • 任何一个强引用对象都不能被垃圾回收器回收
    • 对于软引用指向的对象,只有在JVM需要内存时,才进行回收,适合用来实现高速缓存
    • 对于弱引用的对象,当没有强引用时,可以立即回收。使用于存储元数据,另外WeakHashMap的键值采用的是弱引用
    • 拥有虚引用的对象,可以在任何时候被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收的活动。虚引用必须和引用队列(ReferenceQueue)配合使用,当垃圾回收器准备回收一个对象时,如果该对象还有虚引用,则把这个虚引用加入到与之关联的引用队列中。
  1. 九种基本数据类型的大小,以及他们的封装类。

  2. Switch能否用string做参数?

  3. equals与==的区别。

  4. Object有哪些公用方法?

  5. Java的四种引用,强弱软虚,用到的场景。

  6. Hashcode的作用。

  7. ArrayList、LinkedList、Vector的区别。

  8. String、StringBuffer与StringBuilder的区别。

  9. Map、Set、List、Queue、Stack的特点与用法。

  10. HashMap和HashTable的区别。

  11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。

  12. TreeMap、HashMap、LindedHashMap的区别。

  13. Collection包结构,与Collections的区别。

  14. try catch finally,try里有return,finally还执行么?

  15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。

  16. Java面向对象的三个特征与含义。

  17. Override和Overload的含义去区别。

  18. Interface与abstract类的区别。

  19. Static class 与non static class的区别。

  20. java多态的实现原理。

  21. 实现多线程的两种方法:Thread与Runable。

  22. 线程同步的方法:sychronized、lock、reentrantLock等。

  23. 锁的等级:方法锁、对象锁、类锁。

  24. 写出生产者消费者模式。

  25. ThreadLocal的设计理念与作用。

  26. ThreadPool用法与优势。

  27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。

  28. wait()和sleep()的区别。

  29. foreach与正常for循环效率对比。

  30. Java IO与NIO。

  31. 反射的作用于原理。

  32. 泛型常用特点,List<String>能否转为List<Object>。

  33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

  34. Java与C++对比。

  35. Java1.7与1.8新特性。

  36. 设计模式:单例、工厂、适配器、责任链、观察者等等。

  37. JNI的使用。

  38. 内存模型以及分区,需要详细到每个区放什么。

  39. 堆里面的分区:Eden,survival from to,老年代,各自的特点。

  40. 对象创建方法,对象的内存分配,对象的访问定位。

  41. GC的两种判定方法:引用计数与引用链。

  42. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

  43. GC收集器有哪些?CMS收集器与G1收集器的特点。

  44. Minor GC与Full GC分别在什么时候发生?

  45. 几种常用的内存调试工具:jmap、jstack、jconsole。

  46. 类加载的五个过程:加载、验证、准备、解析、初始化。

  47. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。

  48. 分派:静态分派与动态分派。

传输层:将上层数据分段并提供端到端的、可靠的或不可靠的传输,还要处理端到端的差错控制和流量控制问题。协议TCP、UDP、SPX

传输层:将上层数据分段并提供端到端的、可靠的或不可靠的传输,还要处理端到端的差错控制和流量控制问题。协议TCP、UDP、SPX

网络层:对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。协议IP、IPX、RIP、OSPF

网络层:对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。协议IP、IPX、RIP、OSPF

数据链路层:在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。协议SDLC、HDLC、PPP、STP、帧中继

数据链路层:在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。协议SDLC、HDLC、PPP、STP、帧中继

TCPIP模型与协议

TCPIP模型与协议

应用层:单位是数据段,协议有FTP、TELNET、HTTP、SMTP、SNMP、TFTP、NTP、DNS

应用层:单位是数据段,协议有FTP、TELNET、HTTP、SMTP、SNMP、TFTP、NTP、DNS

运输层:单位是数据包,协议有TCP、UDP

运输层:单位是数据包,协议有TCP、UDP

网络层:单位是数据帧,协议有IP

网络层:单位是数据帧,协议有IP

网络接口层:单位是比特,ARP、RARP

网络接口层:单位是比特,ARP、RARP

三次握手与四次挥手

三次握手与四次挥手

BIO NIO AIO

BIO NIO AIO

BIO:同步阻塞IO,每个请求都要一个线程来处理。

BIO:同步阻塞IO,每个请求都要一个线程来处理。

NIO:同步非阻塞IO,一个线程可以处理多个请求,适用于短连接、小数据。

NIO:同步非阻塞IO,一个线程可以处理多个请求,适用于短连接、小数据。

AIO:异步非阻塞IO,一个线程处理多个请求,使用回调函数实现,适用于长连接、大数据。

AIO:异步非阻塞IO,一个线程处理多个请求,使用回调函数实现,适用于长连接、大数据。

DDOS攻击原理与防御方式

DDOS攻击原理与防御方式

HTTP Get Flood:发送大量会产生sql查询的连接,使得数据库负载很高。

HTTP Get Flood:发送大量会产生sql查询的连接,使得数据库负载很高。

CSRF跨站请求伪造原理攻击者盗用了你的身份,以你的名义发送恶意请求。

CSRF跨站请求伪造原理攻击者盗用了你的身份,以你的名义发送恶意请求。

CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

防御方式:1.验证码;2. 后台生成token,让前端请求携带。3.使用对称加密,后端随机给前端一个密钥,前端进行加密,后端解密。

防御方式:1.验证码;2. 后台生成token,让前端请求携带。3.使用对称加密,后端随机给前端一个密钥,前端进行加密,后端解密。

会话劫持通过暴力破解、 预测、窃取等方式获取到用户session

会话劫持通过暴力破解、 预测、窃取等方式获取到用户session

XSS攻击XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

XSS攻击XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。

XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。

解决方法

解决方法

在表单提交或者url参数传递前,对需要的参数进行过滤

在表单提交或者url参数传递前,对需要的参数进行过滤

过滤用户输入。检查用户输入的内容中是否有非法内容。如<>、”、 ‘、%、;、&、+等

过滤用户输入。检查用户输入的内容中是否有非法内容。如<>、”、 ‘、%、;、&、+等

28.RPC与HTTP服务的区别

28.RPC与HTTP服务的区别

数据库原理

数据库原理

MYISAM与innodb搜索引擎原理MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。其采用索引文件与数据文件,索引文件只存放索引,叶子节点存放数据的物理地址。数据文件存放数据。其索引方式是非聚集的。

MYISAM与innodb搜索引擎原理MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。其采用索引文件与数据文件,索引文件只存放索引,叶子节点存放数据的物理地址。数据文件存放数据。其索引方式是非聚集的。

InnoDB也使用B+Tree作为索引结构。但是它的主索引与数据都放在一个文件中。这种索引叫做聚集索引,因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

InnoDB也使用B+Tree作为索引结构。但是它的主索引与数据都放在一个文件中。这种索引叫做聚集索引,因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

区别一:InnoDB的主索引与数据都放在一个文件中。而MYISAM是分开存放的。

区别一:InnoDB的主索引与数据都放在一个文件中。而MYISAM是分开存放的。

区别二:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。

区别二:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。

区别三:InnoDB的主键索引是聚集索引,而MYISAM不是聚集索引。

区别三:InnoDB的主键索引是聚集索引,而MYISAM不是聚集索引。

3.索引,聚簇索引和二级索引的加锁区别

3.索引,聚簇索引和二级索引的加锁区别

聚集(clustered)索引,也叫聚簇索引。数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

聚集(clustered)索引,也叫聚簇索引。数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

非聚集(unclustered)索引。该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。会发生二次查询。

非聚集(unclustered)索引。该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。会发生二次查询。

稠密索引:稠密索引文件中的索引块保持键的顺序与文件中的排序顺序一致。

稠密索引:稠密索引文件中的索引块保持键的顺序与文件中的排序顺序一致。

稀疏索引:稀疏索引没有为每个数据都创建一个索引,它比稠密索引节省了更多的存储空间,但查找给定值的记录需更多的时间。只有当数据文件是按照某个查找键排序时,在该查找键上建立的稀疏索引才能被使用,而稠密索引则可以应用在任何的查找键。

稀疏索引:稀疏索引没有为每个数据都创建一个索引,它比稠密索引节省了更多的存储空间,但查找给定值的记录需更多的时间。只有当数据文件是按照某个查找键排序时,在该查找键上建立的稀疏索引才能被使用,而稠密索引则可以应用在任何的查找键。

联合索引:将一张表中多个列组成联合索引(col1,col2,col3),其生效方式满足最左前缀原则。

联合索引:将一张表中多个列组成联合索引(col1,col2,col3),其生效方式满足最左前缀原则。

覆盖索引:对于二级索引而言,在innodb中一般是需要先根据二级索引查询到主键,然后在根据一级索引查询到数据。但是如果select的列都在索引中,就避免进行一级查询。

覆盖索引:对于二级索引而言,在innodb中一般是需要先根据二级索引查询到主键,然后在根据一级索引查询到数据。但是如果select的列都在索引中,就避免进行一级查询。

4.主键选择

4.主键选择

在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。

在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。

where 1 = 1:能够方便我们拼sql,但是使用了之后就无法使用索引优化策略,因此会进行全表扫描,影响效率。

where 1 = 1:能够方便我们拼sql,但是使用了之后就无法使用索引优化策略,因此会进行全表扫描,影响效率。

5.分表分库

5.分表分库

水平拆分:依据表中的数据的逻辑关系,将同一个表中的数据依照某种条件拆分到多台数据库上面。按照1个或多个字段以及相应的规则,将一张表重的数据分到多张表中去。比如按照id%5的规则,将一张大表拆分成5张小表。适合具有超大表的系统。

水平拆分:依据表中的数据的逻辑关系,将同一个表中的数据依照某种条件拆分到多台数据库上面。按照1个或多个字段以及相应的规则,将一张表重的数据分到多张表中去。比如按照id%5的规则,将一张大表拆分成5张小表。适合具有超大表的系统。

垂直拆分:依照不同的表来切分到不同的数据库之上。一般按照模块来分库。适合各业务之间耦合度非常低的系统。

垂直拆分:依照不同的表来切分到不同的数据库之上。一般按照模块来分库。适合各业务之间耦合度非常低的系统。

6.隔离级别

6.隔离级别

read uncommit:读不加锁,写加共享锁。会产生脏读、幻读。

read uncommit:读不加锁,写加共享锁。会产生脏读、幻读。

read commit:读加共享锁,写加排它锁,但不加间隙锁。间隙锁的主要作用是防止不可重复读,但会加大锁的范围。

read commit:读加共享锁,写加排它锁,但不加间隙锁。间隙锁的主要作用是防止不可重复读,但会加大锁的范围。

repeatable read:读加共享锁,写加间隙排它锁。注意,Innodb对这个级别进行了特殊处理,使得这个级别能够避免幻读,但不是所有引擎都能够防止幻读!

repeatable read:读加共享锁,写加间隙排它锁。注意,Innodb对这个级别进行了特殊处理,使得这个级别能够避免幻读,但不是所有引擎都能够防止幻读!

serialization:会给整张表加锁,强一致,但是效率低。

serialization:会给整张表加锁,强一致,但是效率低。

7.innodb中的锁

7.innodb中的锁

MVCC(multi-Version Concurrency Control):读不加锁,读写不冲突。适合写少读多的场景。读操作分为:快照读(返回记录的可见版本,不加锁)、当前读(记录的最新版本,加锁,保证其它记录不修改)。

MVCC(multi-Version Concurrency Control):读不加锁,读写不冲突。适合写少读多的场景。读操作分为:快照读(返回记录的可见版本,不加锁)、当前读(记录的最新版本,加锁,保证其它记录不修改)。

LBCC(Lock-Based Concurrency Control):

LBCC(Lock-Based Concurrency Control):

join原理Simple Nested-Loop Join:效率最低,按照join的次序,在join的属性上一个个扫描,并合并结果。

join原理Simple Nested-Loop Join:效率最低,按照join的次序,在join的属性上一个个扫描,并合并结果。

Index Nested-Loop Join:效率最高,join的属性上面有索引,根据索引来匹配。

Index Nested-Loop Join:效率最高,join的属性上面有索引,根据索引来匹配。

Block Nested-Loop Join:用于没有索引的列。它会采用join buffer,将外表的值缓存到join buffer中,然后与内表进行批量比较,这样可以降低对外表的访问频率

Block Nested-Loop Join:用于没有索引的列。它会采用join buffer,将外表的值缓存到join buffer中,然后与内表进行批量比较,这样可以降低对外表的访问频率

8.galera

8.galera

多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。

多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。

同步复制,各节点间无延迟且节点宕机不会导致数据丢失。

同步复制,各节点间无延迟且节点宕机不会导致数据丢失。

紧密耦合,所有节点均保持相同状态,节点间无不同数据。

紧密耦合,所有节点均保持相同状态,节点间无不同数据。

无需主从切换操作。

无需主从切换操作。

无需进行读写分离。

无需进行读写分离。

并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现。

并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现。

故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易。

故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易。

热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小。

热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小。

自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致。

自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致。

对应用透明:集群的维护,对应用程序是透明的,几乎感觉不到。

对应用透明:集群的维护,对应用程序是透明的,几乎感觉不到。

9.LSM Tree,主要应用于nessDB、leveldb、hbase

9.LSM Tree,主要应用于nessDB、leveldb、hbase

核心思想的核心就是放弃部分读能力,换取写入的最大化能力。它假设假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾。(使用归并排序是要因为带排序树都是有序树)

核心思想的核心就是放弃部分读能力,换取写入的最大化能力。它假设假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾。(使用归并排序是要因为带排序树都是有序树)

LSM具有批量特性,存储延迟。B树在insert的时候可能会造成分裂,可能会造成随机读写。而LSM将多次单页随机写,变成一次多页随机写,复用了磁盘寻道时间,极大提升效率。

LSM具有批量特性,存储延迟。B树在insert的时候可能会造成分裂,可能会造成随机读写。而LSM将多次单页随机写,变成一次多页随机写,复用了磁盘寻道时间,极大提升效率。

LSM Tree放弃磁盘读性能来换取写的顺序性。

LSM Tree放弃磁盘读性能来换取写的顺序性。

一般会使用Bloom Filter来优化LSM。当将内存中的数据与磁盘数据合并的时候,先要判断数据是否有重复,如果不用Bloom Filter就需要在磁盘上一层层地找,而使用了之后就会降低搜索代价。

一般会使用Bloom Filter来优化LSM。当将内存中的数据与磁盘数据合并的时候,先要判断数据是否有重复,如果不用Bloom Filter就需要在磁盘上一层层地找,而使用了之后就会降低搜索代价。

多线程

多线程

synchronized、CAS

synchronized、CAS

Collections

Collections

支持高并发的数据结构,如ConcurrentHashMap

支持高并发的数据结构,如ConcurrentHashMap

基于AQS实现的锁、信号量、计数器原理

基于AQS实现的锁、信号量、计数器原理

Runnable与Callable的区别

Runnable与Callable的区别

线程池

线程池

作用

作用

减少在创建和销毁线程上所花的时间以及系统资源的开销 。

减少在创建和销毁线程上所花的时间以及系统资源的开销 。

当前任务与主线程隔离,能实现和主线程的异步执行,特别是很多可以分开重复执行的任务。

当前任务与主线程隔离,能实现和主线程的异步执行,特别是很多可以分开重复执行的任务。

8.阻塞队列

8.阻塞队列

9.threadlocal

9.threadlocal

Spring框架

Spring框架

IOC/DI

IOC/DI

Core、Beans、Context、Expression Language

Core、Beans、Context、Expression Language

JDBC、ORM、OXM、JMS、Transaction

JDBC、ORM、OXM、JMS、Transaction

AOP

AOP

Web

Web

本文由澳门三合彩票发布于编程,转载请注明出处:如何回复,协理只发送header消息

关键词: