java 面经

一、什么是Java虚拟机(JVM)?为何Java被称做是“平台无关的编程语言”?java

Java虚拟机是一个能够执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。程序员

java的跨平台不是java源程序的跨平台 ,若是是这样,那么因此语言都是跨平台的, java源程序先通过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,因此java所谓的跨平台就是在不一样平台上安装了不一样的jvm,而在不一样平台上生成的.class文件都是同样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。 最后解释下机器码和字节码的区别: 一,机器码,彻底依附硬件而存在~而且不一样硬件因为内嵌指令集不一样,即便相同的0 1代码 意思也多是不一样的~换句话说,根本不存在跨平台性~好比~不一样型号的CPU,你给他个指令10001101,他们可能会解析为不一样的结果~ 二,咱们知道JAVA是跨平台的,为何呢?由于他有一个jvm,不论哪一种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~web

 

 

 

 

 

 

 

 

 

 

二、JDK和JRE的区别是什么?算法

Java运行时环境(JRE)。它包括Java虚拟机、Java核心类库和支持文件。它不包含开发工具(JDK)--编译器、调试器和其余工具。
Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其余的工具(好比:JavaDoc,Java调试器),可让开发者开发、编译、执行Java应用程序。
 
三、”static”关键字是什么意思?Java中是否能够覆盖(override)一个private或者是sta“static”关键字代表一个成员变量或者是成员方法能够在没有所属的类的实例变量的状况下被访问。
Java中static方法不能被覆盖,由于方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,因此概念上不适用。
java中也不能够覆盖private的方法,由于private修饰的变量和方法只能在当前类中使用,若是是其余的类继承当前类是不能访问到private变量或方法的,固然也不能覆盖。
 
四、Java支持的数据类型有哪些?什么是自动拆装箱?
Java语言支持的8种基本数据类型是:
byte
short
int
long
float
double
boolean
char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间作的一个转化。好比:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。
 Java支持的数据类型包括两种:一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;另外一种是引用类型:如String等,实际上是对象的引用,JVM中虚拟栈中存的是对象的地址,建立的对象实质在堆中,经过地址来找到堆中的对象的过程,即为引用类型。自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程
 
五、接口和抽象类的区别是什么?
Java提供和支持建立抽象类和接口。它们的实现有共同点,不一样点在于:
接口中全部的方法隐含的都是抽象的。而抽象类则能够同时包含抽象和非抽象的方法。
类能够实现不少个接口,可是只能继承一个抽象类
类能够不实现抽象类和接口声明的全部方法,固然,在这种状况下,类也必须得声明成是抽象的。
抽象类能够在不提供接口方法实现的状况下实现接口。
Java接口中声明的变量默认都是final的。抽象类能够包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数能够是private,protected或者是public。
接口是绝对抽象的,不能够被实例化,抽象类也不能够被实例化。
也能够参考JDK8中抽象类和接口的区别
 
六、进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程能够有多个线程。线程又叫作轻量级进程。

线程与进程的区别概括:sql

a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。数据库

b.通讯:进程间通讯IPC,线程间能够直接读写进程数据段(如全局变量)来进行通讯——须要进程同步和互斥手段的辅助,以保证数据的一致性。编程

c.调度和切换:线程上下文切换比进程上下文切换要快得多。数组

d.在多线程OS中,进程不是一个可执行的实体。浏览器

 

七、建立线程有几种不一样的方式?你喜欢哪种?为何?安全

有4种方式能够用来建立线程:
继承Thread类
实现Runnable接口
应用程序可使用Executor框架来建立线程池

实现Callable接口

实现Runnable接口这种方式更受欢迎,由于这不须要继承Thread类。在应用设计中已经继承了别的对象的状况下,这须要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是很是高效的,很容易实现和使用。
 

八、归纳的解释下线程的几种可用状态。

1. 新建( new ):新建立了一个线程对象。
2. 可运行( runnable ):线程对象建立后,其余线程(好比 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
3. 运行( running ):可运行状态( runnable )的线程得到了 cpu 时间片( timeslice ) ,执行程序代码。
4. 阻塞( block ):阻塞状态是指线程由于某种缘由放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时中止运行。直到线程进入可运行( runnable )状态,才有 机会再次得到 cpu timeslice 转到运行( running )状态。阻塞的状况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。
(三). 其余阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程从新转入可运行( runnable )状态。
5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。
 
 
九、同步方法和同步代码块的区别是什么?
区别:
同步方法默认用this或者当前类class对象做为锁;
同步代码块能够选择以什么来加锁,比同步方法要更细颗粒度,咱们能够选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰须要进行同步的代码,用   synchronized(object){代码内容}进行修饰;
 
十、在监视器(Monitor)内部,是如何作线程同步的?程序应该作哪一种级别的同步?
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每个监视器都和一个对象引用相关联。线程在获取锁以前不容许执行同步代码。
 
十一、什么是死锁(deadlock)?
死锁 :是指两个或两个以上的进程在执行过程当中,因争夺资源而形成的一种 互相等待的现象,若无 外力做用,它们都将没法推动下去
(1) 由于系统资源不足。
(2) 进程运行推动顺序不合适。
(3) 资源分配不当等。
若是系统资源充足,进程的资源请求都可以获得知足,死锁出现的可能性就很低,不然
就会因争夺有限的资源而陷入死锁。其次,进程运行推动顺序与速度不一样,也可能产生死锁。
 
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已得到的资源保持不放。
(3) 不剥夺条件:进程已得到的资源,在末使用完以前,不能强行剥夺。
(4) 循环等待条件:若干进程之间造成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不知足,就不会发生死锁。
死锁的解除与预防:
理解了死锁的缘由,尤为是产生死锁的四个必要条件,就能够最大可能地避免、预防和
解除死锁。因此,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
的状况下占用资源。所以,对资源的分配要给予合理的规划。

 

十二、如何确保N个线程能够访问N个资源同时又不致使死锁?

使用多线程的时候,一种很是简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。所以,若是全部的线程都是以一样的顺序加锁和释放锁,就不会出现死锁了。

 

1三、Java集合类框架的基本接口有哪些?

集合类接口指定了一组叫作元素的对象。集合类接口的每一种具体的实现类均可以选择以它本身的方式对元素进行保存和排序。有的集合类容许重复的键,有些不容许。
Java集合类提供了一套设计良好的支持对一组对象进行操做的接口和类。Java集合类里面最基本的接口有:
Collection:表明一组对象,每个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,而且能够包含重复元素。
Map:能够把键(key)映射到值(value)的对象,键不能重复。

 

1四、什么是迭代器(Iterator)?

Iterator接口提供了不少对集合元素进行迭代的方法。每个集合类都包含了能够返回迭代器实例的

迭代方法。迭代器能够在迭代的过程当中删除底层集合的元素,可是不能够直接调用集合的
remove(Object Obj)删除,能够经过迭代器的remove()方法删除。
 
 
1五、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

一:快速失败(fail—fast)

          在用迭代器遍历一个集合对象时,若是遍历过程当中对集合对象的结构进行了修改(增长、删除),则会抛出Concurrent Modification Exception。

          原理:迭代器在遍历时直接访问集合中的内容,而且在遍历过程当中使用一个 modCount 变量。集合在被遍历期间若是结构发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素以前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;不然抛出异常,终止遍历。

      注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。若是集合发生变化时修改modCount值恰好又设置为了expectedmodCount值,则异常不会抛出。所以,不能依赖于这个异常是否抛出而进行并发操做的编程,这个异常只建议用于检测并发修改的bug。

      场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程当中被修改)。

    二:安全失败(fail—safe)

      采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

      原理:因为迭代时是对原集合的拷贝进行遍历,因此在遍历过程当中对原集合所做的修改并不能被迭代器检测到,因此不会触发Concurrent Modification Exception。

      缺点:基于拷贝内容的优势是避免了Concurrent Modification Exception,但一样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

          场景:java.util.concurrent包下的容器都是安全失败,能够在多线程下并发使用,并发修改。

 

1六、Java中的HashMap的工做原理是什么?

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap须要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,而后把键值对存储在集合中合适的索引上。若是key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

 

1六、HashMap和Hashtable有什么区别?

HashMap和Hashtable都实现了Map接口,所以不少特性很是类似。可是,他们有如下不一样点:
HashMap容许键和值是null,而Hashtable不容许键或者值是null。
Hashtable是同步的,而HashMap不是。所以,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,所以,HashMap是快速失败的。另外一方面,Hashtable提供了对键的列举(Enumeration)。
通常认为Hashtable是一个遗留的类。

 

1七、数组(Array)和列表(ArrayList)有什么区别?何时应该使用Array而不是ArrayList?

下面列出了Array和ArrayList的不一样点:
Array能够包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,好比:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减小编码工做量。可是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

 

1八、ArrayList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口,他们有如下的不一样点:
ArrayList是基于索引的数据接口,它的底层是数组。它能够以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每个元素都和它的前一个和后一个元素连接在一块儿,在这种状况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操做速度更快,由于当元素被添加到集合任意位置的时候,不须要像数组那样从新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,由于LinkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
也能够参考ArrayList vs. LinkedList。

 

1九、Comparable和Comparator接口是干什么的?列出它们的区别。

Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,因此,如想实现排序,就须要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 Comparator位于包java.util下,而Comparable位于包 java.lang下 Comparable 是一个对象自己就已经支持自比较所须要实现的接口(如 String、Integer 本身就能够完成比较大小操做,已经实现了Comparable接口) 自定义的类要在加入list容器中后可以排序,能够实现Comparable接口,在用Collections类的sort方法排序时,若是不指定Comparator,那么就以天然顺序排序, 这里的天然顺序就是实现Comparable接口设定的排序方式。 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能知足你的要求时,你能够写一个比较器来完成两个对象之间大小的比较。 能够说一个是自已完成比较,一个是外部程序实现比较的差异而已。 用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 好比:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不须要去修改 Integer 类(实际上你也不能这么作)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就好了
 
20、什么是Java优先级队列(Priority Queue)?
PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照天然顺序(natural order)排序的。在建立的时候,咱们能够给它提供一个负责给元素排序的比较器。PriorityQueue不容许null值,由于他们没有天然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。
 
2一、Enumeration接口和Iterator接口的区别有哪些?
Enumeration速度是Iterator的2倍,同时占用更少的内存。可是,Iterator远远比Enumeration安全,由于其余线程不可以修改正在被iterator遍历的集合里面的对象。同时,Iterator容许调用者删除底层集合里面的元素,这对Enumeration来讲是不可能的。
 
2二、HashSet和TreeSet有什么区别?
HashSet是由一个hash表来实现的,所以,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另外一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。所以,add(),remove(),contains()方法的时间复杂度是O(logn)。
 
2三、Java中垃圾回收有什么目的?何时进行垃圾回收?
垃圾回收是在内存中存在没有引用的对象或超过做用域的对象时进行。
垃圾回收的目的是识别而且丢弃应用再也不使用的对象来释放和重用资源。
 
2四、System.gc()和Runtime.gc()会作什么事情?
这两个方法用来提示JVM要进行垃圾回收。可是,当即开始仍是延迟进行垃圾回收是取决于JVM的。
 
2五、inalize()方法何时被调用?析构函数(finalization)的目的是什么?
垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法 可是在Java中很不幸,若是内存老是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然期望它作收尾工做是靠不住的。 那么finalize()到底是作什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,因此通常状况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工做就是回收这部分的内存。
 
2六、若是对象的引用被置为null,垃圾收集器是否会当即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。
 
2六、Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
JVM的堆是运行时数据区,全部类的实例和数组都是在堆上分配内存。它在JVM启动的时候被建立。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用能够访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且尚未被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉以前,他们会一直占据堆内存空间。
 
永久代是用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候须要设置一个比较大的持久代空间来存放这些运行过程当中新增的类,永久代中通常包含:

类的方法(字节码...)

类名(Sring对象)

.class文件读到的常量信息

class对象相关的对象列表和类型列表 (e.g., 方法对象的array).

JVM建立的内部对象

JIT编译器优化用的信息

 

 

2七、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上须要大概100M左右的内存)就足够了。

 

2八、在Java中,对象何时能够被垃圾回收?

当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就能够被回收了。

 

2九、Java中的两种异常类型是什么?他们有什么区别?

Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不须要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,而且不受检查的异常能够传播到方法或者是构造函数的外面。相反,受检查的异常必需要用throws语句在方法或者是构造函数上声明。这里有Java异常处理的一些小建议。

 

30、Java中Exception和Error有什么区别?

Exception和Error都是Throwable的子类。Exception用于用户程序能够捕获的异常状况。Error定义了不指望被用户程序捕获的异常。

 

3一、throw和throws有什么区别?

一、Throw用于方法内部,Throws用于方法声明上
二、Throw后跟异常对象,Throws后跟异常类型
三、Throw后只能跟一个异常对象,Throws后能够一次声明多种异常类型
 
 
3二、异常处理完成之后,Exception对象会发生什么变化?
Exception对象会在下一个垃圾回收过程当中被回收掉。
 
3三、finally代码块和finalize()方法有什么区别?
不管是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收以前由Java虚拟机来调用的。
 
3四、什么是JDBC?
JDBC(Java DataBase Connectivity),是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准的实现。经过JDBC技术,开发人员能够用纯Java语言和标准的SQL语句编写完整的数据库应用程序,而且真正地实现了软件的跨平台性。
一般状况下使用JDBC完成如下操做:
1.同数据库创建链接;
2.向数据库发送SQL语句;
3.处理从数据库返回的结果;
JDBC具备下列优势:
1.JDBC与ODBC(Open Database Connectivity,即开放数据库互连)十分类似,便于软件开发人员理解;
2.JDBC使软件开发人员从复杂的驱动程序编写工做中解脱出来,能够彻底专一于业务逻辑开发;
3.JDBC支持多种关系型数据库,大大增长了软件的可移植性;
4.JDBC API是面向对象的,软件开发人员能够将经常使用的方法进行二次封装,从而提升代码的重用性;
 
3五、解释下驱动(Driver)在JDBC中的角色。
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必需要提供java.sql包下面这些类的实现:Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。
在使用jdbc前,应该保证相应的Driver类已经被加载到jvm中,而且完成了类的初始化工做就好了
 
 
3六、Class.forName()方法有什么做用?

 初始化参数指定的类,而且返回此类对应的Class 对象

 

3七、数据库链接池是什么意思?

数据库链接的创建、关闭资源消耗巨大。 传统数据库访问方式:一次数据访问对应一个物理链接,每次操做数据库都要打开关闭该物理链接,系统性能严重受损。 解决方案:数据库链接池。系统初始运行时,主动创建足够足够的链接,组成一个池,每次应用程序请求数据库链接时,无需从新打开链接,而是从池中取出已有的链接,使用完后,再也不关闭,而是归还。

 

3八、什么是Servlet?

Servlet是用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

 

3九、说一下Servlet的体系结构。

全部的Servlet都必需要实现的核心的接口是javax.servlet.Servlet。每个Servlet都必需要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多线程能够并行的为多个请求服务。

 

40、解释下Servlet的生命周期。

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并建立了该Servlet的实例对象。若是是,则直接执行第④步,不然,执行第②步。
②装载并建立该Servlet的一个实例对象。 
③调用Servlet实例对象的init()方法。
④建立一个用于封装HTTP请求消息的HttpServletRequest对象和一个表明HTTP响应消息的HttpServletResponse对象,而后调用Servlet的service()方法并将请求和响应对象做为参数传递进去。
⑤WEB应用程序被中止或从新启动以前,Servlet引擎将卸载Servlet,并在卸载以前调用Servlet的destroy()方法。

 

4一、如何知道是哪个客户端的机器正在请求你的Servlet?

ServletRequest类能够找出客户端机器的IP地址或者是主机名。getRemoteAddr()方法获取客户端主机的IP地址,getRemoteHost()能够获取主机名。

 

4二、HTTP响应的结构是怎么样的?

HTTP响应由三个部分组成:
状态码(Status Code):描述了响应的状态。能够用来检查是否成功的完成了请求。请求失败的状况下,状态码可用来找出失败的缘由。若是Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。
HTTP头部(HTTP Header):它们包含了更多关于响应的信息。好比:头部能够指定认为响应过时的过时日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在Serlet中检索HTTP的头部看这里。
主体(Body):它包含了响应的内容。它能够包含HTML代码,图片,等等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。

 

4三、什么是cookie?session和cookie有什么区别?

cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再次请求该网站时,浏览器就会把请求地址和cookie一同给服务器。服务器检查该cookie,从而判断用户的状态。服务器还能够根据须要修改cookie的内容。 session是另外一种记录客户状态的机制。不一样的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只须要从该session中查找该客户的状态就能够了。 若是说cookie机制是经过检查客户身上的“通讯证”,那么session机制就是经过检查服务器上的“客户明细表”来确认客户身份。

 

4四、什么是HTTP隧道?

HTTP隧道是一种利用HTTP或者是HTTPS把多种网络协议封装起来进行通讯的技术。所以,HTTP协议扮演了一个打通用于通讯的网络协议的管道的包装器的角色。把其余协议的请求掩盖成HTTP的请求就是HTTP隧道。

 

4五、sendRedirect()和forward()方法有什么区别?
forward是服务器内部的跳转,浏览器的地址栏不会发生变化,同时能够把request和response传递给后一个请求。sendRedirect()是浏览器方面的跳转,要发送两次请求,地址栏也会发生变化,同时request和response也会发生变化,从新生成新的对象。

 

4六、什么是URL编码和URL解码?

URL编码是负责把URL里面的空格和其余的特殊字符替换成对应的十六进制表示,反之就是解码。

 

4七、面向对象软件开发的优势有哪些?

代码开发模块化,更易维护和修改。
代码复用。
加强代码的可靠性和灵活性。
增长代码的可理解性。
面向对象编程有不少重要的特性,好比:封装,继承,多态和抽象。

 

4八、封装的定义和好处有哪些?

一是用private把类的细节与外界隔离起来,从而实现数据项和方法的隐藏,而要访问这些数据项和方法惟一的途径就是经过类自己,类才有资格调用它所拥有的资源(方法,数据项属性等等)。因此第一个好处就是数据的安全性提升了。

二是经过隐藏隔离,只容许外部对类作有限的访问,开发者能够自由的改变类的内部实现,而无需修改使用该类的那些程序。只要那些在类外部就能被调用的方法保持其外部特征不变,内部代码就能够自由改变,各取所需,利于分工。

三就是提升了代码的重用性,封装成工具类之后可以减小不少繁琐的步骤。
 
 
4九、多态的定义?
多态:相同类型的引用变量,调用同一个方法时呈现出多种不一样的行为特征。
对象的实例变量不具有多态性。
Java引用变量有两个类型:编译时类型,运行时类型
编译时类型由声明该变量时使用的类型决定
运行时类型由实际赋给该变量的对象决定
若是编译时类型和运行时类型不一致,就可能出现多态(Polymorphism)
 
 
50、抽象的定义?抽象和封装的不一样点?
抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,咱们一般叫作类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。
封装:把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。
相关文章
相关标签/搜索