一些面试题

网络

http header ,Cookie和Session的区别?分别是用于什么场景?优缺点?

一些面试题_第1张图片

session 在服务器端,cookie 在客户端(浏览器)

session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)

http1.0、1.1和http2.0区别

HTTP1.0和HTTP1.1的一些区别

1.缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

2.带宽优化及网络连接的使用,HTTP1.0中,不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

3.Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

4.长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

HTTP2.0和HTTP1.X相比的新特性

1.新的二进制格式(Binary Format)HTTP1.x的解析是基于文本存在缺陷,HTTP2.0的协议解析决定采用二进制格式。

2.header压缩,HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

3.多路复用(MultiPlexing),让所有数据流共用同一个连接,可以更有效地使用 TCP 连接。

4.服务端推送(server push),提前缓存可能需要的文件。

http协议  POST和GET的区别

GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。

POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。

PUT:PUT的英文含义是放置,也就是向服务器新添加数据,就是所谓的增。

DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。

get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制),而post无限制。GET的所有参数全部包装在URL中,明文显示,且服务器的访问日志会记录,非常不安全,GET方法是幂等、可缓存的(除非有 Cache-ControlHeader的约束),POST的URL中只有资源路径,不包含参数,参数封装在二进制的数据体中,服务器也不会记录参数,相对安全。所有涉及用户隐私的数据都要用POST传输,POST不幂等,(大部分实现)不可缓存。

TCP三次握手、四次挥手

建立连接协议(三次握手):

1.第一次握手:客户端发送syn包(syn=x)的数据包到服务器,并进入SYN_SEND状态,等待服务器确认;

2.第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

3.第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。

连接终止协议(四次握手)

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

1.第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。

2.第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号, SYN 和 FIN 都有seq序号)。

3.第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

4.第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

http keep alive http://a280606790.iteye.com/blog/1095085

1、什么是Keep-Alive模式?

我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。http 1.0中默认是关闭的,需要在http头加入"Connection:  Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection:  close  ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

2、启用Keep-Alive的优点

从上面的分析来看,启用Keep-Alive模式肯定更高效,性能更高。因为避免了建立/释放连接的开销。

3、回到我们的问题(即如何判断消息内容/长度的大小?)

Keep-Alive模式,客户端如何判断请求所得到的响应数据已经接收完成(或者说如何知道服务器已经发生完了数据)?我们已经知道 了,Keep-Alive模式发送玩数据HTTP服务器不会自动断开连接,所有不能再使用返回EOF(-1)来判断(当然你一定要这样使用也没有办法,可 以想象那效率是何等的低)!下面我介绍两种来判断方法。

3.1、使用消息首部字段Conent-Length

故名思意,Conent-Length表示实体内容长度,客户端(服务器)可以根据这个值来判断数据是否接收完成。但是如果消息中没有Conent-Length,那该如何来判断呢?又在什么情况下会没有Conent-Length呢?请继续往下看……

3.2、使用消息首部字段Transfer-Encoding

当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-length消息首部字段告诉客户端 需要接收多少数据。但是如果是动态页面等时,服务器是不可能预先知道内容大小,这时就可以使用Transfer-Encoding:chunk模式来传输 数据了。即如果要一边产生数据,一边发给客户端,服务器就需要使用"Transfer-Encoding:  chunked"这样的方式来代替Content-Length。

Linux

https://blog.csdn.net/xiaomingdetianxia/article/details/77894371

查看某一进程下面所有线程的性能指标(top -p 4361 -H)ps -eLf 查看所有所有进程的所有线程

一个文件中,id列/行 统计数值出现的次数并排序 http://blog.csdn.net/xunmengpiaoyun/article/details/27174501

cat datafile  | awk '{print $1}'  |  sort | uniq -c | sort -k 1 -n -r | wc -l > result.txt

使用sed,awk,acc等技术取出test.txt第二行第二列的字段,并追加到text.text的最后(不能用>>)

Java

https://blog.csdn.net/as6757uyy65uy75/article/details/79370686

什么是多态

方法要有继承,要有重写;对象要有父类引用指向子类对象

java类的成员初始化顺序和初始化块知识

属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序:
1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。

Volatile的作用?Synchronized修饰静态变量和普通变量的区别?java线程池的实现原理?

Java try里面有return语句,finally是否会执行,是在return前还是return后执行:finally语句是在try的return语句执行之后,return返回之前执行。

多线程的适用场景?实现方法?

线程或者说多线程,是我们处理多任务的强大工具。线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享;而线程是运行在进程内部的,每个正在运行的进程至少有一个线程,而且不同的线程之间可以在进程范围内共享数据。也就是说进程有自己独立的存储空间,而线程是和它所属的进程内的其他线程共享一个存储空间。线程的使用可以使我们能够并行地处理一些事情。线程通过并行的处理给用户带来更好的使用体验,比如你使用的邮件系统(outlook、Thunderbird、foxmail等),你当然不希望它们在收取新邮件的时候,导致你连已经收下来的邮件都无法阅读,而只能等待收取邮件操作执行完毕。这正是线程的意义所在。

实现线程的方式有四种:

https://www.cnblogs.com/itzyz/p/11077091.html

继承java.lang.Thread类,并重写它的run()方法,将线程的执行主体放入其中。

实现java.lang.Runnable接口,实现它的run()方法,并将线程的执行主体放入其中。

实现Callable接口通过FutureTask包装器来创建Thread线程

使用ExecutorService、Callable、Future实现有返回结果的线程

实际题目:有4000个任务,需要快速处理,怎么用多线程的知识进行处理?

方案一:Redis集群,将任务数据相关内容提前发布到redis,到了一定时间把流量打开,这时候缓存已经准备好了。使用servlet,springMVC,多开出一些节点来满足高并发的开销

方案二:分布式系统,MAS,reactive,eventsourcing,CQRS。并发意味着数据竞争+线程之间的时间上无序。VertX或者Akka

java 线程状态类型:

1. 新建状态(New):新创建了一个线程对象。

2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

死锁的四个必要条件?

程序中必须同时满足以下四个条件才会引发死锁:

互斥(Mutual exclusion):

线程所使用的资源中至少有一个是不能共享的,它在同一时刻只能由一个线程使用。

持有与等待(Hold and wait):

至少有一个线程已经持有了资源,并且正在等待获取其他的线程所持有的资源。

非抢占式(No pre-emption):

如果一个线程已经持有了某个资源,那么在这个线程释放这个资源之前,别的线程不能把它抢夺过去使用。

循环等待(Circular wait):

假设有N个线程在运行,第一个线程持有了一个资源,并且正在等待获取第二个线程持有的资源,而第二个线程正在等待获取第三个线程持有的资源,依此类推……第N个线程正在等待获取第一个线程持有的资源,由此形成一个循环等待。

wait和sleep的区别。哪一个会释放对象锁?

1、对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

2、在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)

  synchronized(x){

  x.notify()

  //或者wait()

  }

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

Java集合框架的基础接口有哪些?

Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。

List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。

Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。

一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

hashtable和hashmap区别,concurrenthashmap是如何保证线程安全的

HashMap的实现原理

HashMap在Map.Entry静态内部类实现中存储key-value对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值

hashmap的用法

==和equal的区别

==比较的是对象的地址,也就是是否是同一个对象;equal比较的是对象的值。

多线程死锁的原因及解决办法

http://www.jianshu.com/p/1b2f63a45476

JVM内存分配和优化方案。一个tomcat应用总是触发full GC,可能情况及如何改正

什么时候会触发GC?

>>当Eden区和From Survivor区满时;

>>调用System.gc时,系统建议执行Full GC,但是不必然执行

>>年老代空间不足

>>方法区空间不足

>>通过Minor GC后进入老年代的平均大小大于老年代的可用内存 >>由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

Java线程终止方法

在 Java 中有以下 3 种方法可以终止正在运行的线程:

1.使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。

2.控制循环条件和判断条件的标识符来结束掉线程

3.使用 interrupt 方法中断线程。

String、StringBuffer、StringBuilder

String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

String中的对象是不可变的,也就可以理解为常量,显然线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

Spring框架特点

Spring最根本的使命:简化Java开发。

控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。负责实例化,定位,配置应用程序中的对象以及建立这些对象间的依赖。get、set方式注入。

面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来。

Spring的DispatcherServlet作用

Spring接口的标签是什么?

Spring是如何调用到DAO层的

JVM 类加载顺序(内存划分、垃圾回收机制)
static 关键字 
设计模式用过哪些或者知道哪些

java assert断言

Java在默认条件下是不启用的,要启用就需要在编译、运行时加上相关的关键字

1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false

2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)

3.使用断言测试方法执行的前置条件和后置条件

4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

如何解析json

运维

nginx 的原理

memchached/redis的区别

移动端

移动app 碎片化即兼容性测试,cpu、内存、耗电、流量等如何测试

Android Fragment和Activity的区别?

Android 进程优先级 举例子

service 和activity交互的方法

自定义view 有哪些方法重写,分别干嘛

内存溢出 内存泄露举例

listview的优化(contentview,加载过程优化)与模式改变(上拉,下滑 右滑)

android四种加载模式

操作系统

堆和栈里分别存了什么?

MOCK是如何做的

其他

如何在Java中发送HTTP GET/POST请求

1.Java原生HttpURLConnection

2.Apache的HttpClient库

ioc如何解耦:

简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

解耦后能保障业务不相互干扰吗?

空指针出现的条件?

内存溢出出现的条件?

接口自动化框架的整体思路

hashmap如何遍历,如何传值

通过Map.keySet遍历key和value

通过Map.entrySet使用iterator遍历key和value

通过Map.entrySet遍历key和value

通过Map.values()遍历所有的value,但不能遍历key

压测如何准备数据,目标是什么?

spring框架的标签

@Repository、@Service、@Controller 和 @Component

java里面的锁 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读写锁 5.乐观锁 / 悲观锁 6.分段锁 7.偏向锁 / 轻量级锁 / 重量级锁 8.自旋锁

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

介绍一下springmvc

核心架构的具体流程步骤如下:

1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;

3、DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);

5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;

6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;

7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

数据库

数据库 task查询1GB的数据

登录中,密码如何加密传输

MySQL中存储引擎及区别

如何跨表查询

写一个sql语句,查询两个关联表中的信息,结果有多行,只输出一行

mysql的一些概念,如事物、实例、会话:事务(transaction):简单理解就是一个业务需求的最小处理单位。会话(session):可以包含N个事务。MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的,一个实例(instance)可以操作多个数据库,故一个会话(session,在操作系统概念里,会话即是线程)可以操作一个实例上的多个数据库。

数据库的四种连表方式

数据字典意义:数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容

宽表意义,怎么和代码结合

MySql的慢SQL:可以设置slow/long-time-query查看,原因可能是没有索引,两个表join时候产生笛卡尔积,锁或死锁,单次查询数据量过大。

数据库索引的类型 MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快

数据库的锁 简单的数据库锁的大致类型有三种: 共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。 排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。 更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

为什么要使用MQ?

MQ是一个互联网架构中常见的解耦利器。

什么时候不使用MQ?上游实时关注执行结果

什么时候使用MQ?

1)数据驱动的任务依赖

2)上游不关心多下游执行结果

3)异步返回执行时间长

你可能感兴趣的:(一些面试题)