java 常见面试题

倖福魔咒の 提交于 2020-03-01 12:44:31

基本问题

基本数据类型和对象的区别
(1) 基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的栈上的,数据本身的值就是存储在栈空间里面,Java语言里面八种数据类型是这种存储模型;

(2) 引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java堆和栈来进行这种类型的数据存储,简单地讲,“引用”(存储对象在内存堆上的地址)是存储在有序的栈上的,而对象本身的值存储在堆上的;

不论是基本数据类型还是引用类型,他们都会先在栈中分配一块内存,对于基本类型来说,这块区域包含的是基本类型的内容;而对于引用类型来说,这块区域包含的是指向真正内容的指针,真正的内容被手动的分配在堆上。

JAVA中的数据类型及其各自的特点。
分为基本类型和引用类型,基本类型有八个,数值型的有byte(1字节),short(2字节),int(4字节),long,float,double,布尔类型的bool和字符类型的char。引用类型有类,接口,数组。

JAVA面向对象的特征?
封装、继承、多态、抽象 封装:通过类来体现,将实体封装成类,其中包含属性和方法

继承:类与类之间可以继承特点,使得代码重用

多态:通过传递给父类对象引用不同的子类从而表现出不同的行为

抽象: 将一类实体的共同特性抽象出来,封装在一个抽象类中。

封箱和拆箱?
基础类型属于数据,不属于类,自然也不属于Object的子类,无法使用相关方法。装箱就是自动将基本数据类型转换为包装器类型,拆箱就是自动将包装器类型装换为基本数据类型。

Integer a = Integer.valueOf(123);  //装箱
int b = a.intValue();  //拆箱

= =和equals的区别?
(1)基本数据类型之间的比较,使用双等号(==),比较两者的值

(2)复合数据类型(类)之间的比较,比较的是在内存池的地址,使用equals。在Java语言中,通常equals交给开发者自行定义,满足什么条件的Object是equals的。

String、StringBuilder、StringBuffer之间的区别?
(1)运行速度:StringBuilder > StringBuffer > String
String是字符串常量,其他两者属于字符串变量,String对象创建后不可以改变,对String的操作实际上是不断创建和回收的过程,执行速度慢。
(2)线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的
StringBuffer对象在字符串缓冲区被多个线程使用时,可以使用synchronized关键字,能够保证线程安全。
(3)使用场景
String适用于少量的字符串操作;StringBuilder适用于单线程下的在字符串缓冲区进行大量的操作的情况下;StringBuffer适用于多线程下的在字符串缓冲区进行大量的操作的情况下。

JAVA中的集合
Java中的集合分为两大类:

Collection(value):包含list和Set,其中list是有序,可重复的;set是无序,不可重复的。

Map(key-value)包含HashMap、HashTable、CurrentHashNap

JVM

内存回收机制与其他语言的区别?
GC是垃圾回收机制,java中将内存管理交给垃圾回收机制,这是因为在面向对象编程中一个对象的生命周期往往无法预料,所以我们无法为每个对象指定回收时机。
但是我们可以采用System.gc()和Runtime.getRuntime().gc()进行请求垃圾回收,可以使用对象的finalize()对必要资源在垃圾回收之前进行处理。
优点:使得java程序员不需要考虑内存管理,由于垃圾回收机制,java中的对象不再有作用域的限制,只有对象的引用有作用域,可以有效的防止内存泄漏,有效的使用有限的可以使用的内存。

都有哪些垃圾回收算法?

标记-清扫(Mark-and-sweep)—sun前期版本就是用这个技术。
原理:对于“活”的对象,一定可以追溯到其存活在堆栈、静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。第一阶段:从GC
roots开始遍历所有的引用,对有活的对象进行标记。第二阶段:对堆进行遍历,把未标记的对象进行清除。这个解决了循环引用的问题。
缺点:1、暂停整个应用;2、会产生内存碎片。

复制(copying)
原理:为了提升效率,把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。优点:不会出现碎片问题。
缺点:1、暂停整个应用。2、需要2倍的内存空间。

标记-整理(Mark-Compact)
原理:第一阶段标记活的对象,第二阶段把为标记的对象压缩到堆的其中一块,按顺序放。即将所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。优点:1、避免标记扫描的碎片问题;2、避免停止复制的空间问题。
具体使用什么方法GC,Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率低的话,就切换到“标记-扫描”方式;同样,Java虚拟机会跟踪“标记-扫描”的效果,要是堆空间碎片出现很多碎片,就会切换回“停止-复制”模式。这就是自适应的技术。

分代(generational collecting)—–J2SE1.2以后使用此算法
原理:基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。

新生代:每次垃圾收集都有大量对象死去,只有少量存活,就选择复制算法

老年代:对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”,或者“标记-整理”算法来进行回收。

自适应算法(Adaptive Collector)在特定的情况下,一些垃圾收集算法会优于其它算法。基于Adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。

JVM 的内存的垃圾回收机制你知道哪些。

垃圾收集器有哪些。
在这里插入图片描述
上图展示了7种作用域不同分代的收集器,如果两个收集器之间存在连线,就说明他们可以搭配使用,虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。

  1. Serial(串行GC)收集器 Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

  2. ParNew(并行GC)收集器 ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。在单CPU工作环境内绝对不会有比Serial的收集器有更好的效果,随着可以使用的CPU的数量的增加,它对于GC时系统资源的有效利用还是很有好处的,它默认开启的收集线程数与CPU的数量下同,在CPU非常多的环境下,可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。

  3. Parallel Scavenge(并行回收GC)收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行多线程收集器。parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量= 程序运行时间/(程序运行时间 +
    垃圾收集时间),虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,那吞吐量就是99%。Parallel
    Scavenge提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数和直接设置吞吐量大小的-XXGCTimeRatio参数。这个收集器还有一个开关:-XX:+UseAdaptiveSizePolicy值得关注。这个开关打开后,虚拟机会根据当前系统的运行情况收集性能监控信息自动调整新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRation)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数。
    使用自适应策略,只需要设置最大堆(-Xmx),利用最大停顿时间或者吞吐量给虚拟机设置一个优化目标。

  4. Serial Old(串行GC)收集器 Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。对于Server模式下有两个用途:1.
    在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用;2.
    作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

  5. Parallel Old(并行GC)收集器 Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

  6. CMS(并发GC)收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记-清除”算法实现的,整个收集过程大致分为4个步骤:
    ①.初始标记(CMS initial mark)
    ②.并发标记(CMS concurrenr mark)
    ③.重新标记(CMS remark)
    ④.并发清除(CMS concurrent sweep)
    其中初始标记、重新标记这两个步骤任然需要停顿其他用户线程。初始标记仅仅只是标记出GC
    ROOTS能直接关联到的对象,速度很快,并发标记阶段是进行GC ROOTS 根搜索算法阶段,会判定对象是否存活。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会被初始标记阶段稍长,但比并发标记阶段要短。由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以整体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
    CMS收集器的优点:并发收集、低停顿
    CMS收集器主要有三个显著缺点: 1. CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是:(CPU数量+3) /4。虚拟机提供了一种称为“增量式并发收集器”的CMS收集器变种,可以在并发标记、清理的时候让GC线程、用户线程交替运行,尽量减少GC线程的独占资源的时间。 2. CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure“,失败后而导致另一次Full GC的产生。由于CMS并发清理阶段用户线程还在运行,伴随程序的运行自热会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理它们,只好留待下一次GC时将其清理掉。这一部分垃圾称为“浮动垃圾”。也是由于在垃圾收集阶段用户线程还需要运行,即需要预留足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分内存空间提供并发收集时的程序运作使用。在默认设置下,CMS收集器在老年代使用了68%的空间时就会被激活,也可以通过参数-XX:CMSInitiatingOccupancyFraction的值来提供触发百分比,以降低内存回收次数提高性能。要是CMS运行期间预留的内存无法满足程序其他线程需要,就会出现“Concurrent Mode Failure”失败,这时候虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。所以说参数-XX:CMSInitiatingOccupancyFraction设置的过高将会很容易致“Concurrent Mode Failure”失败,性能反而降低。 3. 碎片化,最后一个缺点,CMS是基于“标记-清除”算法实现的收集器,使用“标记-清除”算法收集后,会产生大量碎片。空间碎片太多时,将会给对象分配带来很多麻烦,比如说大对象,内存空间找不到连续的空间来分配不得不提前触发一次Full GC。为了解决这个问题,CMS收集器提供了一个-XX:UseCMSCompactAtFullCollection开关参数,用于在Full GC之后增加一个碎片整理过程,还可通过-XX:CMSFullGCBeforeCompaction参数设置执行多少次不压缩的Full GC之后,跟着来一次碎片整理过程。

  7. G1收集器 G1(Garbage First)收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。还有一个特点之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个Java堆(包括新生代,老年代)。
    G1收集器的特点:
    **并行与并发:**G1利用多CPU、多核环境下的硬件优势,缩小stop-the-world的时间。
    **分代收集:**G1不需要其他收集器配合就可以独立管理整个GC堆,但它能够采用不同的方式来处理。 空间整合:整体上是“标记-整理”,局部上是基于“复制”的算法来实现的 可预测的停顿:降低停顿时间,G1建立了可预测的停顿时间模型,能让使用者明确的指定在一个长度M毫秒内的时间片段,消耗在垃圾收集的时间不得超过N毫秒,这已经适实时java(RTSJ)的垃圾收集器的特征了
    G1收集的步骤: 初始标记 并发标记 最终标记 筛选回收

CMS 和 G1 的区别。
JVM 参数你调过哪些。
内存分配与回收策略

对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区,如果启动了本地县城分配缓存,将按照线程优先在TLAB上分配,少数情况下也可能会直接分配在老年代中,分配规则并不是百分百固定的,其细节决定于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

  1. 对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机将进行一次Minor GC。Minor GC和Full GC有什么不一样吗? 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随着至少一次的MinorGC(但非绝对,在Parallel Scavenge收集器的手机策略里有直接进行Major GC的策略选择过程)MajorGC的速度一般会比Minor GC慢10倍以上。

  2. 大对象直接进入老年代 所谓的大对象是指,需要大量连续内存空间的java对象,最典型的大对象就是那种很长的字符串以及数组,大对象对虚拟机的内存分配来说就是一个坏消息,经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续时间来“安置”它们。虚拟机提供了-XX:PretenureSizeThreshold参数,令大于这个设置值的对戏那个直接在老年代分配,这样做的目的是避免在Eden区以及Survivor区之间发生大量的内存复制。 -XX:PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效,Parallel Scavenge的收集器不认识这个参数,Parallel
    Scavenge收集器一般并不需要设置,如果遇到必须使用这个参数的场合,可以考虑ParNew加CMS的收集器组合。

  3. 长期存活的对象将进入老年代 虚拟机为了采用分代收集的思想来管理内存,利用每个对象定义的对象年龄(Age)计数器,如果对象在Eden出生并经历了第一次Minor GC后仍然存活,并且能被Survivor接纳的话,将移动到Survivor空间中,并且对象年龄设为1,对象在Survivor区中每熬过一次Minor GC,年龄就增加1岁,当他的年龄增加到一定的程度(默认为15岁),就会被晋升到老年代,对象晋升到老年代的年龄阀值,可以通过参数-XX:MaxTenuringThreshold设置。

  4. 动态对象年龄判定 为了更好的适应不同的成都的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。

  5. 空间分配担保 在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对戏那个总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败,如果允许,那么会继续检查老年代最大可用的连续控件是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor
    GC,尽管这次Minor GC是有风险的,如果小于,或者HandlePromotionFailure设置不允许冒险,那这也要改为进行一次Full GC。
    冒险:前面提到过,新生代使用复制收集算法,但为了内存利用率,只是用其中一个Survivor空间来作为轮换备份,因此当出现大量对象在Minor GC后仍然存活的情况(最极端的情况就是内存回收后新生代中所有对象都存活),就需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代。
    取平均值进行比较其实仍然是一种动态概率的手段,也就是说,如果某次Minor GC存活后的对象突增,远远高于平均值的话,依然会导致担保失败,如果发生了担保失败,那就治好在失败后重新发生一次Full GC,虽然担保失败的时候绕的圈子是最大的,但大部分的时候还是会打开分配担保的,避免Full GC过于频繁。

线程

线程的实现方式?怎么样启动线程?怎么区分线程?
线程的实现方式有三种:第一种是继承Thread类,第二种是实现Runnable接口,第三种是实现java.util.concurrent下的Callable接口。

线程的启动:调用start()方法—可以使得线程处于可运行状态,但是不一定会执行,如果实在main()方法中调用的话,run()会执行

区分线程:给线程设置名字

线程并发库和线程池的作用?
线程池的好处:

限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃
线程池每次都不需要去创建和销毁,节约了资源
线程池不需要每次都去创建,响应时间更快

怎么打印线程的堆栈信息。
怎么创建线程。
知道有哪些线程池。
线程和进程的区别。
进程和线程在内存上的区别。
多线程和多进程是否都可利用多核 CPU。(面试官好像又解释了,我以前学的时候进程内多线程只能用单核 CPU,现在好像改进了,都可以用多核了)。

数据结构

ArrayList、Vector、LinkedList的区别?
区别:
Vector和ArrayList都是以类似数组的形式存储在内存中,LinkedList以链表的形式进行存储
Vector线程同步,ArrayList和LinkedList线程不同步
LinkedList适合在指定位置进行插入、删除等操作,不适合查找,Vector、ArrayList适合查找
Vector默认扩充为原来的两倍,ArrayList默认扩充为原来的1.5倍

HashMap和HashTable的区别?
都是使用key-value的形式来存储数据,区别是HashTable基于Dictionary类,而HshMap是基于AbstractMap。
HashMap是单线程安全的,HashTable是多线程安全的
HashMap仅仅支持Iterator的遍历方式,HashTable支持Iterrator和Enumeration两种遍历方式
HashMap可以允许存在一个为null的key和若干个为null的value,但是HashTable中的key和value都不允许为null

ArrayList 和 LinkedList 的区别。
HashMap 的底层讲一下。
HashMap 什么情况转化为红黑树。
讲讲红黑树(还好没有手撕哈哈哈,不然必然劝退)。

Redis

(结合项目问的)
你是怎么实现并发的。
你怎么加锁的。
并发的时候会有什么问题。
你这样是原子性的么。

Java

Java 中 == 和 equals 的用法。

Spring

Spring对bean的管理
1.BeanFactory: BeanFactory采用了工厂设计模式,负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
2.ApplicationContext:除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:国际化支持、aop、事务等。
3.BeanFactory在解析配置文件时并不会初始化对象,只有在使用对象getBean()才会对该对象进行初始化,而ApplicationContext在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程。

65、SpringMVC和SpringBoot的区别?
Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包:

  1. 创建独立的Spring应用程序
  2. 嵌入的Tomcat,无需部署WAR文件
  3. 简化Maven配置
  4. 自动配置Spring
  5. 提供生产就绪型功能,如指标,健康检查和外部配置
  6. 绝对没有代码生成和对XML没有要求配置 [1]

讲讲 Spring 的 AOP。
AOP的应用?
AOP:面向切面编程
核心原理:使用动态代理的方式在执行前后或出现异常后做加入相关逻辑.
我们主要使用AOP来做:
事务处理 执行方法前,开启事务,执行方法后提交事务,出现异常后回滚事务
权限判断 在执行方法前,判断是否具有权限
日志记录 在执行方法前执行日志
简单介绍一下SPRING或者SPRING的两大核心?
spring是j2ee应用程序框架,是轻量级的IOC和AOP的容器框架,主要针对javabean的生命周期进行管理的轻量级容器,可以单独使用,也可以跟其它框架组合使用.

(1).IOC(inversion of control)或DI(dependency injection)控制反转
原来:我的service要调用Dao,我就在service中创建Dao对象,这时Dao对象的创建的控制权在我手中
Spring:spring发现我的service依赖于Dao,就给我的service注入Dao对象,这时Dao对象创建的控制权在spring手中
核心原理:工厂模式+反射+配置文件

(2).AOP:面向切面编程
核心原理:使用动态代理的方式在执行前后或出现异常后做相关逻辑.
我们主要使用AOP来做:
事务处理
权限判断
日志记录

42、Spring事务的传播特性和隔离级别
脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

Mysql 默认:可重复读
Oracle 默认:读已提交
在这里插入图片描述

网络 && 传输

简单说一下HTML、CSS、JavaScript在网页开发中的定位
Html 超文本标记语言,定义网页的结构
Css 层叠样式表,用来美化页面
Javascript 主要用来验证表单,做动态交互(其中ajax)

33、简单介绍一下AJAX
ajax就是异步的JavaScript和想xml。通过ajax可以与服务器进行数据交换,ajax可以使网页局部刷新,意味着可以在不用加载整个网页的情况下,对网页的某部分进行更新。

怎么实现?ajax xmlhttpRrqueset对象,使用这个对象可以异步向服务器发送请求,获取响应,完成局部更新,open send responseText/responseXml局部响应.
使用场景:登陆失败时不跳转页面,注册时提示用户名是否存在,二级联动等等.

34、JS和JQuery的关系
JQuery是一个js框架,封装了js的属性和方法,并且增强了js的功能,让用户使用起来更加便利,并且增强了js的功能.
原来是使用js是要处理很多兼容性的问题(比如注册事件等),由JQuery封装了底层,就不用处理兼容性问题.
原生的js的dom和事件绑定和ajax等操作非常麻烦,JQuery封装了以后,操作非常方便.

你用 Java 写过 socket 编程么。
Java 在网络传输的时候是大端还是小端。
可以有哪些写文件的方式。
BufferWriter 和 OutputStream 的区别。
缓冲区你一般开多大,为什么。

实现一个拷贝文件的工具类要使用字节流还是字符流?
应该使用字节流,因为在文件中可能会包含图片之类的字节

HTTP、GET、POST请求的区别?
GET请求的数据会暴露在地址栏当中,而POST不会
对于GET,特定的浏览器和服务器对于URL有长度限制,传输数据时会受到限制
POST的安全性比GET高

说说你对Servlet的理解?
就是运行在WEB服务器上的一个Java小程序,用来接收和响应客户端发送过来的请求,通常使用HTTP协议

使用方法:

编写一个Java类,实现servlet接口
把开发好的Java类部署到web服务器当中

Servlet的生命周期?
当用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中的init方法就会执行。任何一次请求都会创建一个线程访问Servlet中的service方法,根据请求的不同方式调用不同的doXXX()方法。当Servlet从服务器中移除或者关闭服务器,Servlet的实例就会被销毁,那么destory()方法就会执行。

Servlet中Forward和Redirect的区别
forward重定向:两次request,重定向可以访问自己的web应用以外的资源。重定向的过程,传输的信息会被丢失。

redirect请求转发:服务器内部把对一个request/response的处理权交给另外一个客户端,传输的信息不会丢失。

18、JSP和Servlet的相同点和不同点?
1、联系:
JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外表表达。
JSP编译后是”类 servlet”。
2、不同点:

  • Servlet 的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。Servlet如果要实现html功能,必须使用Writer输出对应的html.
  • JSP 的情况是Java和HTML可以组合成一个扩展名为.jsp 的文件。做界面展示比较方便,而嵌入逻辑复杂.
  • JSP 侧重于视图,Servlet 主要用于控制逻辑

19、JSP内置对象和四大作用域
九大内置对象:

request、response、config、application、session、exception、page、out、pagecontext

四大作用域:

page—只能在当前页面使用

request—只能在同一次请求当中使用

session—只能在同一个会话(session对象)中使用

context—只能在同一个web应用中使用

20、session和cookie的区别和使用场景?
区别:

  1. cookie的数据存储在客户端,session的数据存储在服务器上
  2. cookie不是很安全,别人可以通过分析存放在本地的cookie并进行cookie欺骗,考虑到安全应该使用session
  3. session会在一定时间内保存在服务器上,当访问增多时,会影响服务器的性能.考虑到服务器性能,应当使用cookie.
  4. 单个cookie保存数据不能超过4k,很多浏览器显示一个站点最多保存20个cookie
  5. 将重要信息保存在session中(登陆),将其他需要保留的信心存放在cookie中(购物车,cookie是可以在客户端禁用的,这时候要使用cookie+数据库的方式实现购物车,当cookie中不能取出数据,就从数据库中取)

21、MVC模式和MVC各部分的实现
MVC是Model(模型)—View(视图)—Controller(控制器)的缩写

数据库

关系型数据库的三范式?
范式就是规范,就是关系型数据库设计表时遵循的三个规范.要满足第二范式,必须先满足第一范式,要满足第三范式,必须先满足第二范式

第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。列数据的不可分割.
第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识.(主键)
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键)
反三范式:有时候为了效率,可以设置重复或者可推导出的字段.比如:订单(总价),订单项(单价)

数据库分类和常用数据库?
关系型数据库:MySQL、 ORACLE、SQL Server、IBM DB2、Sybase

非关系型数据库:Redis,Memcached,MongoDB ,Hadoop

你了解数据库吧。
写一道 SQL。学生成绩的 SQL。表A{id, name},表B{id, course, score}。求每名学生的 id 和 name 和平均成绩。(我竟然没写对,GG)。

MySQL数据库的最大连接数

The maximum amount of concurrent sessions the MySQL server will

allow. One of these connections will be reserved for a user with

SUPER privileges to allow the administrator to login even if the

connection limit has been reached.

max_connections=100
默认的最大连接数为100

26、MySQL和Oracle上的分页语句
为什么要分页?很多数据不能完全展示出来,需要进行分段显示

mysql:是使用关键字limit来进行分页的.LIMIT [offset,] rows:offset指定要返回的第一行的偏移量(也就是从哪个索引开始),rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)
oracle:一般是使用rownum 加select 嵌套查询

27、触发器的使用场景?
触发器:触发器需要有触发条件,当条件满足后,做什么操作

应用场景:某些社交软件的日志更新,会通知好友; 一些论坛中,当插入新帖时,会更改当前帖子总数以及最后发帖时间.

CREATE [or REPLACE] TRIGGER 触发器名
BEFORE | AFTER
[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW ][WHEN(条件) ]
declare
……
begin
PLSQL 块
End ;

28、存储过程的优点

  1. 存储过程只在创建时进行编译,以后每次执行它都不会再重新编译.一般SQL语句每次执行都会编译.所以存储过程会大大提高数据库执行速度
  2. 通常复杂的业务逻辑需要多条SQL语句,这些语句要分别从客户机发送到服务器,当客户机和服务器之间的操作很多时,会产生大量的网络传输.如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输会大大减少,降低网络负载.
  3. 存储过程是可重复使用的,能减少数据库开发人员的工作量.
  4. 存储过程可以屏蔽对底层数据对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显示权限,安全性高.

29、JDBC调用存储的过程
加载驱动—获取连接—设置参数—执行—释放连接

30、简单说一下对JDBC的理解
JDBC:Java数据库连接

Java只定义接口,让数据库厂商自己实现接口,对于我们开发人员而言,只需要导入对应厂商开发的实现即可,然后以接口的方式进行调用(mysql+mysql驱动(实现)+jdbc)

31、数据库连接池的作用
限定数据库的连接个数,不会犹豫数据库连接过多导致系统运行缓慢或者崩溃
数据库连接不需要每次都去创建或销毁,节约了资源
数据库连接不需要每次都去创建,响应时间更快

算法

最后一道笔试题看你提交了很多次啊,为什么。(我就说我在凑测试用例。在主管面的时候我才知道我提交了 100 多次哈哈哈啊哈)。
手撕:m * n 矩阵,从左上到右下的路径有多少种。只能往左或者往下走。

设计模式

设计模式和常用的设计模式?
一共有23中设计模式?常用的有单例模式、工厂模式、装饰者模式、代理模式

单例模式:
工厂模式:
装饰者模式:
代理模式:

Linux

Lilux常用命令
Cd跳转到目录
Pwd 获取当前路径
Su 切换用户
Ll 查看当前目录下文件和目录
Tail 查看文件
Rm –rf 删除文件
Vi 修改文件
Mv 移动/重命名 文件或文件夹
Mkdir 创建文件夹
Rm –f 删除文件夹
Tar 打包/解压
Grep 查找想要的信息

参考:
JVM垃圾回收机制与内存回收

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!