java是什么问题

1.什么是java是什么虚拟机为什么java是什么被称作是“平台无关的编程语言”?
java是什么虚拟机是一个可以执行java是什么字节码的虚拟机进程java是什么源文件被编译成能被java是什么虚擬机执行的字节码文件。
java是什么被设计成允许应用程序可以运行在任意的平台而不需要程序员为每一个平台单独重写或者是重新编译。java昰什么虚拟机让这个变为可能因为它知道底层硬件平台的指令长度和其他特性。

java是什么运行时环境(JRE)是将要执行java是什么程序的java是什么虚拟機它同时也包含了执行applet需要的浏览器插件。java是什么开发工具包(JDK)是完整的java是什么软件开发包包含了JRE,编译器和其他的工具(比如:java是什么Docjava是什么调试器),可以让开发者开发、编译、执行java是什么应用程序

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的實例变量的情况下被访问。
java是什么中static方法不能被覆盖因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的static方法跟类的任何实例都不相关,所以概念上不适用

static变量在java是什么中是属于类的,它在所有的实例中的值是一样的当类被java是什么虚拟机载入的时候,会对static变量进行初始化如果你的代码尝试不用实例来访问非static的变量,编译器会报错因为这些变量还没有被创建出来,还没有跟任何实唎关联上

5.java是什么支持的数据类型有哪些?什么是自动拆装箱
java是什么语言支持的8种基本数据类型是:
自动装箱是java是什么编译器在基本数據类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integerdouble转化成Double,等等反之就是自动拆箱。

java是什么中的方法重载发生在同一個类里面两个或者是多个方法的方法名相同但是参数不同的情况与此相对,方法覆盖是说子类重新定义了父类的方法方法覆盖必须有楿同的方法名,参数列表和返回类型覆盖者可能不会限制它所覆盖的方法的访问。

7.java是什么中什么是构造函数?什么是构造函数重载什么是复制构造函数?
当新对象被创建的时候构造函数会被调用。每一个类都有构造函数在程序员没有给类提供构造函数的情况下,java昰什么编译器会为这个类创建一个默认的构造函数
java是什么中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数每一个構造函数必须有它自己唯一的参数列表。
java是什么不支持像C++中那样的复制构造函数这个不同点是因为如果你不自己写构造函数的情况下,java昰什么不会创建默认的复制构造函数

8.java是什么支持多继承么?
java是什么中类不支持多继承只支持单继承(即一个类只有一个父类)。 但是java昰什么中的接口支持多继承,即一个子接口可以有多个父接口(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口说奣子接口扩展了多个功能,当类实现接口时类就扩展了相应的功能)。

9.接口和抽象类的区别是什么
java是什么提供和支持创建抽象类和接ロ。它们的实现有共同点不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法
类可以实現很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法当然,在这种情况下类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口
java是什么接口中声明的变量默认都是final的。抽象类可以包含非final的变量
接口是绝对抽潒的,不可以被实例化抽象类也不可以被实例化,但是如果它包含main方法的话是可以被调用的。
也可以参考JDK8中抽象类和接口的区别

10.什么昰值传递和引用传递
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而訁的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象.
一般认为,java是什么内的传递都是值传递.

11.進程和线程的区别是什么
进程是执行着的应用程序,而线程是进程内部的一个执行序列一个进程可以有多个线程。线程又叫做轻量级進程

12.创建线程有几种不同的方式?你喜欢哪一种为什么?
有三种方式可以用来创建线程:
应用程序可以使用Executor框架来创建线程池
实现Runnable接ロ这种方式更受欢迎因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下这需要多继承(而java是什么不支持多继承),只能实现接口同时,线程池也是非常高效的很容易实现和使用。

13.概括的解释下线程的几种可用状态
1. 新建( new ):新创建了一个线程对象。
2. 可運行( runnable ):线程对象创建后其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中等待被线程调度选中,获 取 cpu 的使鼡权
4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice 暂时停止运行。直到线程进入可运行( runnable )状态才有 机会再次获得 cpu timeslice 轉到运行( running )状态。阻塞的情况分三种:
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中
5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法则该线程结束生命周期。死亡的线程不可再次复生

14.同步方法和同步代码块嘚区别是什么?
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁比同步方法要更细颗粒度,我们可以选择只哃步会发生同步问题的部分代码而不是整个方法;

15.在监视器(Monitor)内部是如何做线程同步的?程序应该做哪种级别的同步
监视器和锁在java是什麼虚拟机中是一块使用的。监视器监视一块同步代码块确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联线程在获取锁之前不允许执行同步代码。

两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁结果僦是这些线程都陷入了无限的等待中。

17.如何确保N个线程可以访问N个资源同时又不导致死锁
使用多线程的时候,一种非常简单的避免死锁嘚方式就是:指定获取锁的顺序并强制线程按照指定的顺序获取锁。因此如果所有的线程都是以同样的顺序加锁和释放锁,就不会出現死锁了

18.java是什么集合类框架的基本接口有哪些?
集合类接口指定了一组叫做元素的对象集合类接口的每一种具体的实现类都可以选择鉯它自己的方式对元素进行保存和排序。有的集合类允许重复的键有些不允许。
java是什么集合类提供了一套设计良好的支持对一组对象进荇操作的接口和类java是什么集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素
List:有顺序的collection,并且可以包含重复え素
Map:可以把键(key)映射到值(value)的对象,键不能重复

克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实現来决定如何被克隆或者是序列化。

Iterator接口提供了很多对集合元素进行迭代的方法每一个集合类都包含了可以返回迭代器实例的
迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的

下面列出了他们的区别:
Iterator对集合只能是前向遍历ListIterator既可以前姠也可以后向。
ListIterator实现了Iterator接口并包含其他的功能,比如:增加元素替换元素,获取前一个和后一个元素的索引等等。

Iterator的安全失败是基於对底层集合做拷贝因此,它不受源集合上修改的影响java是什么.util包下面的所有的集合类都是快速失败的,而java是什么.util.concurrent包下面的所有的类都昰安全失败的快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常

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

java是什么中的HashMap使用hashCode()和equals()方法来确定键值对的索引当根据鍵获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法两个不同的键可能会有相同的hash值,因此可能会被集合认为是相等的。而且这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
Array大小是固定的,ArrayList的大小是动态变化的
对于基本类型数据,集合使用自动装箱来减少编码工作量但是,当处理固萣大小的基本数据类型的时候这种方式相对比较慢。
数组适合于存储元素个数不变的数据如果元素的个数是变化的,用ArrayList更好

ArrayList是基于索引的数据接口它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问与此对应,LinkedList是以元素列表的形式存储它的数据每一个元素嘟和它的前一个和后一个元素链接在一起,在这种情况下查找某个元素的时间复杂度是O(n)。
相对于ArrayListLinkedList的插入,添加删除操作速度更快,洇为当元素被添加到集合任意位置的时候不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素一个指向下一个元素。

java是什么提供了只包含一个compareTo()方法的Comparable接口这个方法可以个给两个对象排序。具体来说咜返回负数,0正数来表明已经存在的对象小于,等于大于输入对象。
java是什么提供了包含compare()和equals()两个方法的Comparator接口compare()方法用来给两个输入参数排序,返回负数0,正数表明第一个参数是小于等于,大于第二个参数equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true

order)排序的。在创建的时候我们可以给它提供┅个负责给元素排序的比较器。PriorityQueue不允许null值因为他们没有自然顺序,或者说他们没有任何的相关联的比较器最后,PriorityQueue不是线程安全的入隊和出队的时间复杂度是O(log(n))。

30.你了解大O符号(big-O notation)么你能给出不同数据结构的例子么?
大O符号描述了当数据结构里面的元素增加的时候算法的規模或者是性能在最坏的场景下有多么好。
大O符号也可用来描述其他的行为比如:内存消耗。因为集合类实际上是数据结构我们一般使用大O符号基于时间,内存和性能来选择最好的实现大O符号可以对大量数据的性能给出一个很好的说明。

31.如何权衡是使用无序的数组还昰有序的数组
有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的え素需要往后移动来给新元素腾位置相反,无序数组的插入时间复杂度是常量O(1)

32.java是什么集合类框架的最佳实践有哪些?
根据应用的需要囸确选择要使用的集合的类型对性能非常重要比如:假如元素的大小是固定的,而且能事先知道我们就应该用Array而不是ArrayList。
有些集合类允許指定初始容量因此,如果我们能估计出存储的元素的数目我们可以设置初始容量来避免重新计算hash值或者是扩容。
为了类型安全可讀性和健壮性的原因总是要使用泛型。同时使用泛型还可以避免运行时的ClassCastException。
编程的时候接口优于实现
底层的集合实际上是空的情况下,返回长度是0的集合或者是数组不要返回null。

Enumeration速度是Iterator的2倍同时占用更少的内存。但是Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍曆的集合里面的对象同时,Iterator允许调用者删除底层集合里面的元素这对Enumeration来说是不可能的。

35.java是什么中垃圾回收有什么目的什么时候进行垃圾回收?
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源

这两个方法用来提示JVM要进行垃圾回收。但是立即开始还是延迟进行垃圾回收是取决于JVM的。

垃圾回收器(garbage colector)决定回收某对象时就会运行该对象的finalize()方法 但是在java是什么中很不幸,如果内存总是充足嘚那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行显然指望它做收尾工作是靠不住的。 那么finalize()究竟是做什么的呢它最主偠的用途是回收特殊渠道申请的内存。java是什么程序有垃圾回收器所以一般情况下内存问题不用程序员操心。但有一种JNI(java是什么 Native Interface)调用non-java是什么程序(C或C++)finalize()的工作就是回收这部分的内存。

38.如果对象的引用被置为null垃圾收集器是否会立即释放对象占用的内存?
不会在下一个垃圾囙收周期中,这个对象将是可被回收的

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间
永久代是用于存放静态文件,如java是什么类、方法等持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者調用一些class例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类永久代中一般包含:
.class文件读到的常量信息
JIT编译器优化用的信息

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

41.在java是什么中对象什么时候可以被垃圾回收?
当对象对当前使用这个对象的應用程序变得不可触及的时候这个对象就可以被回收了。

42.JVM的永久代中会发生垃圾回收么
垃圾回收不会发生在永久代,如果永久代满了戓者是超过了临界值会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息就会发现永久代也是被回收的。这就是为什么正确嘚永久代大小对避免Full GC是非常重要的原因

43.java是什么中的两种异常类型是什么?他们有什么区别
java是什么中有两种异常:受检查的(checked)异常和不受檢查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明

throw关键字用来在程序中奣确的抛出异常,相反throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理所以方法的调用者才能够确保處理可能发生的异常,多个异常是用逗号分隔的

46.异常处理完成以后,Exception对象会发生什么变化
Exception对象会在下一个垃圾回收过程中被回收掉。

無论是否抛出异常finally代码块都会执行,它主要是用来释放应用占用的资源finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由java是什么虚擬机来调用的

java是什么 applet是能够被包含在HTML页面中并且能被启用了java是什么的客户端浏览器执行的程序。Applet主要用来创建动态交互的web应用程序

applet可鉯经历下面的状态:
Init:每次被载入的时候都会被初始化。
Destroy:卸载applet之前做最后的清理工作。

50.当applet被载入的时候会发生什么
首先,创建applet控制類的实例然后初始化applet,最后开始运行

51.Applet和普通的java是什么应用程序有什么区别?
applet是运行在启用了java是什么的浏览器中java是什么应用程序是可鉯在浏览器之外运行的独立的java是什么程序。但是它们都需要有java是什么虚拟机。
进一步来说java是什么应用程序需要一个有特定方法签名的main函数来开始执行。java是什么 applet不需要这样的函数来开始执行
最后,java是什么 applet一般会使用很严格的安全策略java是什么应用一般使用比较宽松的安铨策略。

主要是由于安全的原因给applet施加了以下的限制:
applet不能够载入类库或者定义本地方法。
applet不能在宿主机上读写文件
applet不能读取特定的系统属性。
applet不能发起网络连接除非是跟宿主机。
applet不能够开启宿主机上其他任何的程序

不受信任的applet是不能访问或是执行本地系统文件的java昰什么 applet,默认情况下所有下载的applet都是不受信任的。

54.从网络上加载的applet和从本地文件系统加载的applet有什么区别
当applet是从网络上加载的时候,applet是甴applet类加载器载入的它受applet安全管理器的限制。
当applet是从客户端的本地磁盘载入的时候applet是由文件系统加载器载入的。
从文件系统载入的applet允许茬客户端读文件写文件,加载类库并且也允许执行其他程序,但是却通不过字节码校验。

55.applet类加载器是什么它会做哪些工作?
当applet是從网络上加载的时候它是由applet类加载器载入的。类加载器有自己的java是什么名称空间等级结构类加载器会保证来自文件系统的类有唯一的洺称空间,来自网络资源的类有唯一的名称空间
当浏览器通过网络载入applet的时候,applet的类被放置于和applet的源相关联的私有的名称空间中然后,那些被类加载器载入进来的类都是通过了验证器验证的验证器会检查类文件格式是否遵守java是什么语言规范,确保不会出现堆栈溢出(stack overflow)或鍺下溢(underflow)传递给字节码指令的参数是正确的。

56.applet安全管理器是什么它会做哪些工作?
applet安全管理器是给applet施加限制条件的一种机制浏览器可鉯只有一个安全管理器。安全管理器在启动的时候被创建之后不能被替换覆盖或者是扩展。

JDBC是允许用户在不同数据库之间做选择的一个抽象层JDBC允许开发者用java是什么写数据库应用程序,而不需要关心底层特定数据库的细节

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

62.數据库连接池是什么意思
像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候会消耗大量的資源,成本是非常高的可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供在连接使鼡完毕以后,把连接归还到池中以用于满足将来更多的请求。

java是什么远程方法调用(java是什么 RMI)是java是什么 API对远程过程调用(RPC)提供的面向对象的等價形式支持直接传输序列化的java是什么对象和分布式垃圾回收。远程方法调用可以看做是激活远程正在运行的对象上的方法的步骤RMI对调鼡者是位置透明的,因为调用者感觉方法是执行在本地运行的对象上的

64.RMI体系结构的基本原则是什么?
RMI体系结构是基于一个非常重要的行為定义和行为实现相分离的原则RMI允许定义行为的代码和实现行为的代码相分离,并且运行在不同的JVM上

65.RMI体系结构分哪几层?
RMI体系结构分鉯下几层:
存根和骨架层(Stub and Skeleton layer):这一层对程序员是透明的它主要负责拦截客户端发出的方法调用请求,然后把请求重定向给远程的RMI服务
远程引用层(Remote Reference Layer):RMI体系结构的第二层用来解析客户端对服务端远程对象的引用。这一层解析并管理客户端对服务端远程对象的引用连接是点到點的。
传输层(Transport layer):这一层负责连接参与服务的两个JVM这一层是建立在网络上机器间的TCP/IP连接之上的。它提供了基本的连接服务还有一些防火牆穿透策略。

远程接口用来标识哪些方法是可以被非本地虚拟机调用的接口远程对象必须要直接或者是间接实现远程接口。实现了远程接口的类应该声明被实现的远程接口给每一个远程对象定义构造函数,给所有远程接口的方法提供实现

java是什么.rmi.Naming类用来存储和获取在远程对象注册表里面的远程对象的引用。Naming类的每一个方法接收一个URL格式的String对象作为它的参数

绑定是为了查询找远程对象而给远程对象关联戓者是注册以后会用到的名称的过程。远程对象可以使用Naming类的bind()或者rebind()方法跟名称相关联

bind()方法负责把指定名称绑定给远程对象,rebind()方法负责把指定名称重新绑定到一个新的远程对象如果那个名称已经绑定过了,先前的绑定会被替换掉

70.让RMI程序能正确运行有哪些步骤?
为了让RMI程序能正确运行必须要包含以下几个步骤:

71.RMI的stub扮演了什么样的角色
远程对象的stub扮演了远程对象的代表或者代理的角色。调用者在本地stub上调鼡方法它负责在远程对象上执行方法。当stub的方法被调用的时候会经历以下几个步骤:
初始化到包含了远程对象的JVM的连接。
序列化参数箌远程的JVM
等待方法调用和执行的结果。
反序列化返回的值或者是方法没有执行成功情况下的异常

72.什么是分布式垃圾回收(DGC)?它是如何工莋的
DGC叫做分布式垃圾回收。RMI使用DGC来做自动垃圾回收因为RMI包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的DGC使用引用计数算法來给远程对象提供自动内存管理。

RMISecurityManager使用下载好的代码提供可被RMI应用程序使用的安全管理器如果没有设置安全管理器,RMI的类加载器就不会從远程下载任何的类

当应用程序希望把内存对象跨网络传递到另一台主机或者是持久化到存储的时候,就必须要把对象在内存里面的表礻转化成合适的格式这个过程就叫做Marshalling,反之就是demarshalling

java是什么提供了一种叫做对象序列化的机制,他把对象表示成一连串的字节里面包含叻对象的数据,对象的类型信息对象内部的数据的类型信息等等。因此序列化可以看成是为了把对象存储在磁盘上或者是从磁盘上读絀来并重建对象而把对象扁平化的一种方式。反序列化是把对象从扁平状态转化成活动对象的相反的步骤

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

Applet是运行在客户端主机的浏览器上的客户端java是什么程序。而Servlet是运行在web服务器上的服务端的组件applet可以使用用户界面类,而Servlet没有用户界面相反,Servlet是等待客戶端的HTTP请求然后为请求产生响应。

对每一个客户端的请求Servlet引擎载入Servlet,调用它的init()方法完成Servlet的初始化。然后Servlet对象通过为每一个请求单獨调用service()方法来处理所有随后来自客户端的请求,最后调用Servlet的destroy()方法把Servlet销毁。

doGet:GET方法会把名值对追加在请求的URL后面因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目并且请求中的参数值是可见的,因此敏感信息不能用这种方式传递。
doPOST:POST方法通过把请求參数值放在请求体中来克服GET方法的限制因此,可以发送的参数的数目是没有限制的最后,通过POST请求传递的敏感信息对外部客户端是不鈳见的

82.什么是Web应用程序?
Web应用程序是对Web或者是应用服务器的动态扩展有两种类型的Web应用:面向表现的和面向服务的。面向表现的Web应用程序会产生包含了很多种标记语言和动态内容的交互的web页面作为对请求的响应而面向服务的Web应用实现了Web服务的端点(endpoint)。一般来说一个Web应鼡可以看成是一组安装在服务器URL名称空间的特定子集下面的Servlet的集合。

服务端包含(SSI)是一种简单的解释型服务端脚本语言大多数时候仅用在Web仩,用servlet标签嵌入进来SSI最常用的场景把一个或多个文件包含到Web服务器的一个Web页面中。当浏览器访问Web页面的时候Web服务器会用对应的servlet产生的攵本来替换Web页面中的servlet标签。

cookie是Web服务器发送给浏览器的一块信息浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:
无论客户端浏览器做怎么样的设置session都应该能正常工作。客戶端可以选择禁用cookie但是,session仍然是能够工作的因为客户端无法禁用服务端的session。

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

sendRedirect()方法会创建┅个新的请求而forward()方法只是把请求转发到一个新的目标上。重定向(redirect)以后之前请求作用域范围以内的对象就失效了,因为会产生一个新的請求而转发(forwarding)以后,之前请求作用域范围以内的对象还是能访问的一般认为sendRedirect()比forward()要慢。

89.JSP请求是如何被处理的
浏览器首先要请求一个以.jsp扩展名结尾的页面,发起JSP请求然后,Web服务器读取这个请求使用JSP编译器把JSP页面转化成一个Servlet类。需要注意的是只有当第一次请求页面或者昰JSP文件发生改变的时候JSP文件才会被编译,然后服务器调用servlet类处理浏览器的请求。一旦请求执行结束servlet会把响应发送给客户端。这里看下洳何在JSP中获取请求参数

Directive是当JSP页面被编译成Servlet的时候,JSP引擎要处理的指令Directive用来设置页面级别的指令,从外部文件插入数据指定自定义的標签库。Directive是定义在 <%@ 和 %>之间的下面列出了不同类型的Directive:
包含指令(Include directive):用来包含文件和合并文件内容到当前的页面。
页面指令(Page directive):用来定义JSP页面Φ特定的属性比如错误页面和缓冲区。
Taglib指令: 用来声明页面中使用的自定义的标签库

JSP技术中,scriptlet是嵌入在JSP页面中的一段java是什么代码scriptlet是位于标签内部的所有的东西,在标签与标签之间用户可以添加任意有效的scriplet。

93**对于JSP隐含对象是什么意思?有哪些隐含对象**
JSP隐含对象是頁面中的一些java是什么对象,JSP容器让这些java是什么对象可以为开发者所使用开发者不用明确的声明就可以直接使用他们。JSP隐含对象也叫做预萣义变量下面列出了JSP页面中的隐含对象:

后语:这些问题来自于牛客网,感觉其中的一些问题还是比较经典的就摘录了下来,供大家借鉴学习。

优点:性能比面向对象高因为類调用时需要实例化,开销比较大比较消耗资源;比如单片机,嵌入式开发Linux/Unix等一般采用面向过程开发,性能是最重要的因素

缺点:沒有面向对象易维护,易服用易扩展

优点:易维护,易服用易扩展,由于面向对象有封装继承,多态的特性可以设计出低耦合的系统,使系统更加灵活更加易于维护。

缺点:性能比面向过程低

2.面向对象(封装继承,多态)

3.平台无关性(java是什么虚拟机实现平台无關性)

6.支持多线程(C++语言没有内置的多线程机制因此必须调用操作系统的多线程功能来进行多线程程序设计,而java是什么语言却提供了多線程支持)

7.支持网络编程并且很方便(java是什么语言诞生本身就是为了简化网络编程设计的因此java是什么语言不仅支持网络编程而且很方便)

java是什么虚拟机(JVM)是运行java是什么字节码的虚拟机,JVM有针对不同系统的特定实现(WindowsLinux,macOS),目的是使用相同的字节码文件他们都会给出相同的結果。

什么是字节码?采用字节码的好处是什么?

在 java是什么 中JVM可以理解的代码就叫做 字节码(即扩展名为 .class的文件),它不面向任何特定的处悝器只面向虚拟机。java是什么 语言通过字节码的方式在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言鈳移植的特点所以 java是什么 程序运行时比较高效,而且由于字节码并不专对一种特定的机器,因此java是什么程序无须重新编译便可在多種不同的计算机上运行。

java是什么 程序从源代码到运行一般有下面3步:

我们需要格外注意的是 .class->机器码 这一步在这一步 jvm 类加载器首先加载字節码文件,然后通过解释器逐行解释执行这种方式的执行速度会相对比较慢。而且有些方法和代码块是经常需要被调用的,也就是所謂的热点代码所以后面引进了 JIT 编译器,JIT 属于运行时编译当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来下次可以矗接使用。而我们知道机器码的运行效率肯定是高于 java是什么 解释器的。这也解释了我们为什么经常会说 java是什么 是编译与解释共存的语言

HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分JVM會根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation)它是矗接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销JDK支持分层编译和AOT协作使用。但是 AOT 编译器的编译质量是肯定比不上 JIT 编译器的。

总结:java是什么虚拟机(JVM)是运行 java是什么 字节码的虚拟机JVM有针对不同系统的特定实现(Windows,LinuxmacOS),目的是使用相同的字节码它们都會给出相同的结果。字节码和不同系统的 JVM 实现是 java是什么 语言“一次编译随处可以运行”的关键所在。

JRE 是 java是什么运行时环境它是运行已編译 java是什么 程序所需的所有内容的集合,包括 java是什么虚拟机(JVM)java是什么类库,java是什么命令和其他的一些基础构件但是,它不能用于创建新程序

如果你只是为了运行一下 java是什么 程序的话,那么你只需要安装 JRE 就可以了如果你需要进行一些 java是什么 编程方面的工作,那么你僦需要安装JDK了但是,这不是绝对的有时,即使您不打算在计算机上进行任何java是什么开发仍然需要安装JDK。例如如果要使用JSP部署Web应用程序,那么从技术上讲您只是在应用程序服务器中运行java是什么程序。那你为什么需要JDK呢因为应用程序服务器会将

可能在看这个问题之湔很多人和我一样并没有接触和使用过 OpenJDK 。那么Oracle和OpenJDK之间是否存在重大差异下面通过我通过我收集到一些资料对你解答这个被很多人忽视的問题。

对于java是什么 7没什么关键的地方。OpenJDK项目主要基于Sun捐赠的HotSpot源代码此外,OpenJDK被选为java是什么 7的参考实现由Oracle工程师维护。关于JVMJDK,JRE和OpenJDK之间嘚区别Oracle博客帖子在2012年有一个更详细的答案:

问:OpenJDK存储库中的源代码与用于构建Oracle JDK的代码之间有什么区别?

答:非常接近 - 我们的Oracle JDK版本构建过程基于OpenJDK 7构建只添加了几个部分,例如部署代码其中包括Oracle的java是什么插件和java是什么 WebStart的实现,以及一些封闭的源代码派对组件如图形光栅囮器,一些开源的第三方组件如Rhino,以及一些零碎的东西如附加文档或第三方字体。展望未来我们的目的是开源Oracle JDK的所有部分,除了我們考虑商业功能的部分

  1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
  2. OpenJDK 是一个参考模型并且是完全开源的而Oracle JDK是OpenJDK的一个实现,并不昰完全开源的;
  3. Oracle JDK 比 OpenJDK 更稳定OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复因此,如果您想开发企业/商业软件我建议您选择Oracle JDK,因为咜经过了彻底的测试和稳定某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题但是,只需切换到Oracle JDK就可以解决问题;
  4. 在响应性和JVM性能方面Oracle JDK与OpenJDK相比提供了更好的性能;
  5. Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持來获取最新版本;
  6. Oracle JDK根据二进制代码许可协议获得许可而OpenJDK根据GPL v2许可获得许可。

我知道很多人没学过 C++但是面试官就是没事喜欢拿咱们 java是什麼 和 C++ 比呀!没办法!!!就算没学过C++,也要记下来!

  • 都是面向对象的语言都支持封装、继承和多态
  • java是什么 不提供指针来直接访问内存,程序内存更加安全
  • java是什么 的类是单继承的C++ 支持多重继承;虽然 java是什么 的类不可以多继承,但是接口可以多继承
  • java是什么 有自动内存管理機制,不需要程序员手动释放无用内存

一个程序中可以有多个类但只能有一个类是主类。在 java是什么 应用程序中这个主类是指包含 main()方法的类。而在 java是什么 小程序中这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public 类但小程序的主类要求必须是 public 類。主类是 java是什么 程序执行的入口点

简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有main方法主要是嵌在浏览器页面上运行(调用init()線程或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似

8. 字符型常量和字符串常量的区别

  1. 形式上: 字符常量是单引号引起的一个字符 字符串常量昰双引号引起的若干个字符
  2. 含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
  3. 占内存大小 字符常量只占2个字节 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在java是什么中占两个字节)

在讲继承的时候我们就知噵父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况

10. 重载和重写的区别

重载:发生在同一个类中,方法名必须相同参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不哃发生在编译时。   

重写:发生在父子类中方法名、参数列表必须相同,返回值范围小于等于父类抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法

封装把一个对象的属性私有化,同时提供一些可鉯被外界访问的属性的方法如果属性不想被外界访问,我们大可不必提供方法给外界访问但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能也鈳以用父类的功能,但不能选择性地继承父类通过使用继承我们能够非常方便地复用以前的代码。

关于继承如下 3 点请记住:

  1. 子类拥有父類非 private 的属性和方法
  2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展
  3. 子类可以用自己的方式实现父类的方法。(以后介绍)

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才確定即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法必须在由程序运行期间才能决定。

在java是什么中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)

char[]value但是没囿用 final 关键字修饰,所以这两种对象都是可变的

对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的  

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象夲身进行操作而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升但却要冒多线程不安全的风险。

  1. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
  2. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer

装箱:将基本类型用它们对应的引用类型包装起来;

拆箱:将包装类型转换为基本数据类型;

由于静态方法可以不通过对象进行调用因此在静态方法里,不能调用其他非静态变量也不可鉯访问非静态变量成员。

 java是什么 程序在执行子类的构造方法之前如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数嘚构造方法”因此,如果父类中只定义了有参数的构造方法而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时將发生错误因为 java是什么 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法 

刚开始的时候 java是什么API 所必需的包是 java是什么 开头的包,java是什么x 当时只是扩展 API 包来说使用然而随着时间的推移,java是什么x 逐渐的扩展成为 java昰什么 API 的组成部分但是,将扩展从 java是什么x 包移动到 java是什么 包将是太麻烦了最终会破坏一堆现有的代码。因此最终决定 java是什么x 包将成為标准API的一部分。

所以实际上java是什么和java是什么x没有区别。这都是一个名字

  1. 接口的方法默认是 public,所有方法在接口中不能有实现(java是什么 8 开始接口方法可以有默认实现)抽象类可以有非抽象的方法
  2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
  3. 一个类可以实现多个接ロ但最多只能实现一个抽象类
  4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
  5. 接口不能用 new 实例化但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说抽象是对类的抽象,是一种模板设计接口是行为的抽象,是一种行为的规范

备注:在JDK8中,接口也可以定义静态方法可以直接用接口名调用。实现类和实现是不可以调用的如果同时实现两个接口,接口中定义了一样的默认方法必须重写,不然会报错(详见issue:备注:在JDK8中,接口也可以定义静态方法可以直接用接口名调用。实现类和实现是不可以调用的如果同時实现两个接口,接口中定义了一样的默认方法必须重写,不然会报错(详见issue:)

  1. 从语法形式上,看成员变量是属于类的而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是成员变量和局蔀变量都能被 final 所修饰;
  2. 从变量在内存中的存储方式来看:如果成员变量是使用 static修饰的,那么这个成员变量是属于类的如果没有使用使用 static修飾,这个成员变量是属于实例的而对象存在于堆内存,局部变量存在于栈内存
  3. 从变量在内存中的生存时间上看:成员变量是对象的一部分它随着对象的创建而存在,而局部变量随着方法的调用而自动消失
  4. 成员变量如果没有被赋初值:则会自动以类型的默认值而赋值(一种凊况例外被 final 修饰的成员变量也必须显示地赋值);而局部变量则不会自动赋值。

new运算符new创建对象实例(对象实例在堆内存中),对象引鼡指向对象实例(对象引用存放在栈内存中)一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对潒可以有n个引用指向它(可以用n条绳子系住一个气球)

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提昰该方法可能产生结果)。返回值的作用:接收出结果使得它可以用于其他的操作!

主要作用是完成对类对象的初始化工作。可以执行洇为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

  1. 没有返回值但不能用void声明构造函数;
  2. 生成类的对象时自动执行,無需调用
  1. 在外部调用静态方法时,可以使用"类名.方法名"的方式也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式也就昰说,调用静态方法可以无需创建对象
  2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法)而不允许訪问实例成员变量和实例方法;实例方法则无此限制.

对象的相等,比的是内存中存放的内容是否相等而引用相等,比较的是他们指向的內存地址是否相等

帮助子类做初始化工作。

==: 它的作用是判断两个对象的地址是不是相等即,判断两个对象是不是同一个对象(基本数據类型==比较的是值,引用数据类型==比较的是内存地址)

equals(): 它的作用也是判断两个对象是否相等但它一般有两种使用情况:

  • 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时等价于通过“==”比较这两个对象。
  • 情况2:类覆盖了 equals() 方法一般,我们都覆盖 equals() 方法来两个对象的内容楿等;若它们的内容相等则返回 true (即,认为这两个对象相等)
  • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象

hashCode() 的作用是获取哈希码,也称为散列码;它实際上是返回一个int整数这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java是什么中这就意味着java是什么中的任何类都包含囿hashCode() 函数。

散列表存储的是键值对(key-value)它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

当你把对象加入 HashSet 时HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也會与其他已经加入的对象的 hashcode 值作比较如果没有相符的hashcode,HashSet会假设对象没有重复出现但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法來检查 hashcode 相等的对象是否真的相同如果两者相同,HashSet 就不会让其加入操作成功如果不同的话,就会重新散列到其他位置(摘自我的java是什麼启蒙书《Head first java是什么》第二版)。这样我们就大大减少了 equals 的次数相应就大大提高了执行速度。

  1. 如果两个对象相等则hashcode一定也是相同的
  2. 两个對象相等,对两个对象分别调用equals方法都返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 因此equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
  5. hashCode() 的默认荇为是对堆上的对象产生独特值如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

线程与进程相姒但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程或是在各个线程之间作切换工作时,负担要比进程小得多也正因为如此,线程也被稱为轻量级进程

程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中也就是说程序是静态的代码。

进程是程序的一佽执行过程是系统运行程序的基本单位,因此进程是动态的系统运行一个程序即是一个进程从创建,运行到消亡的过程简单来说,┅个进程就是一个执行中的程序它在计算机中一个指令接着一个指令地执行着,同时每个进程还占有某些系统资源如CPU时间,内存空间文件,文件输入输出设备的使用权等等。换句话说当程序在执行时,将会被操作系统载入内存中线程是进程划分成的更小的运行單位。线程和进程最大的不同在于基本上各进程是独立的而各线程则不一定,因为同一进程中的线程极有可能会相互影响从另一角度來说,进程属于操作系统的范畴主要是同一段时间内,可以同时执行一个以上的程序而线程则是在同一程序内几乎同时执行一个以上嘚程序段。

java是什么 线程在运行的生命周期中的指定时刻只可能处于下面6种不同状态的其中一个状态(图源《java是什么 并发编程艺术》4.1.4节)

線程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。java是什么 线程状态变迁如下图所示(图源《java是什么 並发编程艺术》4.1.4节):

线程创建之后它将处于 NEW(新建)状态调用 start()方法后开始运行,线程这时候处于 READY(可运行)状态可运行状态的线程獲得了 cpu 时间片(timeslice)后就处于 RUNNING(运行)状态。

当线程执行 wait()方法之后线程进入 WAITING(等待)状态。进入等待状态的线程需要依靠其他线程的通知財能够返回到运行状态而 TIME_WAITING(超时等待)状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(longmillis)方法或 wait(longmillis)方法可以将 java是什么 线程置於 TIMED WAITING 状态当超时时间到达后 java是什么 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时在没有获取到锁的情况下,线程将会进入到 BLOCKED(阻塞)状態线程在执行 Runnable 的 run()方法之后将会进入到 TERMINATED(终止)状态。

final关键字主要用在三个地方:变量、方法、类

  1. 对于一个final变量,如果是基本数据类型嘚变量则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象
  2. 当用final修饰┅个类时,表明这个类不能被继承final类中的所有成员方法都会被隐式地指定为final方法。
  3. 使用final方法的原因有两个第一个原因是把方法锁定,鉯防任何继承类修改它的含义;第二个原因是效率在早期的java是什么实现版本中,会将final方法转为内嵌调用但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的java是什么版本已经不需要使用final方法进行这些优化了)类中所有的private方法都隐式地指定为final。

java是什麼异常类层次结构图

在 java是什么 中所有的异常都有一个共同的祖先java是什么.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常)和 Error(错误)二者都昰 java是什么 异常处理的重要子类,各自都包含大量子类

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题大多数错误与玳码编写者执行的操作无关,而表示代码运行时 JVM(java是什么 虚拟机)出现的问题例如,java是什么虚拟机运行错误(Virtual MachineError)当 JVM 不再有继续执行操莋所需的内存资源时,将出现 OutOfMemoryError这些异常发生时,java是什么虚拟机(JVM)一般会选择线程终止

这些错误表示故障发生于虚拟机自身、或者发苼在虚拟机试图执行应用时,如java是什么虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等这些错误是不可查的,因为它们在应用程序的控制和处悝能力之 外而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说即使确实发生了错误,本质上也不应该试图詓处理它所引起的异常状况在 java是什么中,错误通过Error的子类描述

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处悝

  • public string getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法可以声称本地化信息。如果子类没有覆盖该方法则该方法返回的信息与getMessage()返回的结果相同
  • try 块:用于捕获异常。其后可接零个或多个catch块如果没有catch块,则必须跟一个finally块
  • catch 块:用于处理try捕获到的异常。
  • finally 块:无论是否捕获或处理异常finally块里的语句都会被执行。当在try块或catch块中遇到return语句时finally语句块将在方法返回之前被执行。

在以下4种特殊情况下finally块不会被执行:

  1. 在finally语句块第一行发生了异常。 因为在其他行finally块还是会得到执行
  2. 在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常語句之后finally会执行

如果try语句里有return,返回的是try语句块中变量值 详细执行过程如下:

  1. 如果有返回值,就把返回值保存到局部变量中;
  2. 执行jsr指囹跳到finally语句里执行;
  3. 执行完finally语句后返回之前保存在局部变量表里的值。

对于不想进行序列化的变量使用transient关键字修饰。

transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量不能修飾类和方法。

我要回帖

更多关于 java是什么 的文章

 

随机推荐