面试考点汇总
JavaSE部分
Java基础
为什么重写 equals 还要重写 hashcode
将对象放入到HashMap或HashSet中时,hashCode方法决定了对象会被放到数组的哪个下标,当多个对象的哈希值冲突时,equals方法决定了这些对象是否是同一个对象。
说一下 map 的分类和常见的情况
- HashMap:无序,key可以为null,value可以为null,线程不安全。
- LinkedHashMap:有序,key可以为null,value可以为null,线程不安全。
- HashTable:无序,key不能为null,value不能为null,线程安全。
- TreeMap:有序,key不能为null,value可以为null,线程不安全。
- ConcurrentHashMap:无序,key不能为null,value不能为null,线程安全。
说一下 set 的分类和常见的情况
- HashSet:无序,值可以为null,线程不安全。
- TreeSet:有序,值不可以为null,线程不安全。
Object 若不重写 hashCode()的话,hashCode()如何计算出来的?
Object的hashCode方法是本地方法,也就是说是使用C或者C++语言实现的,该方法直接返回对象的内存地址。
==比较的是什么?
基本数据类型的变量,比较的是数值;引用类型的变量,比较的是地址。
若对一个类不重写,它的 equals()方法是如何比较的?
比较的是引用类型的变量所指向的对象的地址。
java8 新特性
- 接口的默认方法和静态方法。
- 函数式接口:要求接口中有且仅有一个抽象方法。
- lambda表达式:匿名函数,是一段没有函数名的函数体。
- 方法引用:为了进一步简化lambda表达式。
- Stream流:一种新的数据处理方式。
- Optional:可以解决空指针异常。
- Date/Time日期时间API的改进。
说说 Lambda 表达式的优缺点。
- 优点:
- 代码简洁,开发迅速。
- 方便函数式编程。
- 改善了集合操作(Stream流)。
- 缺点:
- 代码可读性变差。
- 学习难度提升。
- 不容易进行调试。
一个十进制的数在内存中是怎么存的?
- 以二进制补码形式存储,最高位是符号位,正数的补码是它的原码,负数的补码是它的反码加1,在求反码时符号位不变,符号位为1,其他位取反。
- 因为原码和反码计算不准确,而补码是准确的。
为啥有时会出现 4.0-3.6=0.40000001 这种现象?
2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。
Java 支持的数据类型有哪些?什么是自动拆装箱?
- 八大基本数据类型:byte、int、short、long、float、double、char、boolean。
- 将基本数据类型转换为所对应的包装类的过程叫做装箱,将包装类转换为基本数据类型的过程叫做拆箱。装箱和拆箱的过程是自动进行的,所以叫做自动拆装箱。
- 原理:自动装箱时编译器调用valueOf()将基本数据类型转换成包装类,自动拆箱时编译器调用intValue()将包装类转换为基本数据类型。
什么是值传递和引用传递?
- 值传递是相对于基本数据类型的变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。
- 引用传递是相对于引用类型的变量而言的,传递的是该对象地址的一个副本,并不是原对象本身,对该副本所指向的对象进行操作会同时改变原对象。
数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用 Array 而不是 ArrayList?
- 区别:数组大小固定,只能存储相同数据类型的数据;列表大小可动态扩展,可以存储各种类型的数据。
- 使用场景:不需要复杂功能和确定长度的情况下,使用数组效率更高,通常情况建议使用List。
你了解大 O 符号(big-O notation)么?你能给出不同数据结构的例子么?
- 大O符号表示算法的时间或者空间复杂度上界。
- 数组的插入删除时间复杂度为O(N),查找时间复杂度为O(1),空间复杂度为O(1)。
- 链表的插入删除时间复杂度为O(1),查找时间复杂度为O(N),空间复杂度为O(1)。
String 是最基本的数据类型吗?
不是,是引用类型。
int 和 Integer 有什么区别
- int是基本数据类型,Integer是引用类型。
- int默认值是0,Integer默认值是null。
- int存储在栈中,Integer存储在堆中。
- int变量存储的是数值,Integer变量存储的是引用地址。
String、StringBuffer、StringBuilder 的区别
- String使用字符数组保存字符串,数组有final修饰,String对象是不可变的,可以理解为常量,线程安全。
- StringBuffer使用字符数组保存字符串,StringBuffer对象是可变的,对方法加了同步锁,线程安全。
- StringBuilder使用字符数组保存字符串,StringBuilder对象是可变的,没有对方法加同步锁,线程不安全。
&和&&的区别?
- &是位运算符,&&是逻辑运算符。
- &是逻辑与,&&是短路与。
我们在 web 应用开发过程中经常遇到输出某种编码的字符,如 iso8859-1 等,如何输出一个某种编码的字符串?(Java 字符编码与解码)
1 | String str = new String("hello"); |
在 Java 中,如何跳出当前的多重嵌套循环?
在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。
你能比较一下 Java 和 JavaSciprt 吗?
- Java是面向对象的语言,JavaScript基于对象的语言。
- Java要先编译后解释执行,JavaScript不需要编译,直接解释执行。
- Java的变量在使用前必须声明,JavaScript的变量在使用前不需要声明。
- Java和JavaScript的代码格式不一样。
简述正则表达式及其用途。
- 正则表达式就是一个按照一种规则定义的字符串。
- 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
Java 中是如何支持正则表达式操作的?
Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作。
请你说说 Java 和 PHP 的区别?
无。
关键字
介绍一下 Synchronized 锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?如果修饰代码块,锁住了什么?
- 保证同一时候,只有一个线程可以执行某个代码块或方法,保证了代码在执行完后所修改的数据对其它线程是可见的,可以保证原子性、可见性、有序的。
- 修饰成员方法,锁住的是当前对象。
- 修饰静态方法,锁住的是当前类的Class对象。
- 修饰代码块,锁住的是括号里的对象。
介绍一下 volatile?
- 禁止指令重排,保证了有序性。
- 保证变量的读写及时从缓存刷新到主存,保证了可见性。
锁有了解嘛,说一下 Synchronized 和 lock
- synchronized是可重入的,reentrantlock也是可重入的。
- synchronized是关键字,reentrantlock是Java类。
- synchronized是通过JVM的字节码实现的,每个锁对象都绑定一个monitor,进入一个synchronized同步逻辑时需要获取该monitor并在计数时加1,离开时释放并减1,reentrantlock是通过CAS操作实现的。
- synchronized的加锁和释放锁是自动的,reentrantlock需要手动加锁和释放锁。
- reentrantlock有读写锁实现,在有读和写的并发需求时可以实现更有效率的并发。
- synchronized是不可中断的,reentrantlock支持超时返回和中断。
讲一讲 Java 里面的 final 关键字怎么用的?
- 修饰类,类不能被继承。
- 修饰变量,变量就变成了常量,只能被赋值一次。
- 修饰方法,方法不能被重写。
面向对象
wait 方法底层原理
Java 有哪些特性,举个多态的例子。
- 封装、继承、多态。
- 多态的主要特征:父类引用指向子类对象。
- 多态的例子:Animal animal = new Dog();
String 为啥不可变?(如何理解 String 类型值的不可变?)
- String内部是使用一个被final修饰的char数组value存储字符串的值。
- 数组value的值在对象构造的时候就已经进行了赋值。
- String不提供方法对数组value中的值进行修改。
- String中需要对数组value进行修改的方法(例如replace)则是直接返回一个新的String对象。
集合
Map 和 ConcurrentHashMap 的区别?
Map是接口,ConcurrentHashMap是实现类。
线程
多线程中的 i++线程安全吗?为什么?
不安全,i++不是原子性操作。i++分为读取i值,对i值加一,再赋值给i,执行期间任何一步都有可能被其它线程抢占。
锁
讲一下非公平锁和公平锁在 reetrantlock 里的实现。
基于AQS的锁(比如ReentrantLock)原理大体是这样:有一个state变量,初始值为0,假设当前线程为A,每当A获取一次锁,state++。释放一次,state–。锁会记录当前持有的线程。当A线程拥有锁的时候,state>0。B线程尝试获取锁的时候会对这个state有一个CAS(0,1)的操作,尝试几次失败后就挂起线程,进入一个等待队列。如果A线程恰好释放,–state==0, A线程会去唤醒等待队列中第一个线程,即刚刚进入等待队列的B线程,B线程被唤醒之后会去检查这个state的值,尝试CAS(0,1),而如果这时恰好C线程也尝试去争抢这把锁。
非公平锁实现:C直接尝试对这个state CAS(0,1)操作,并成功改变了state的值,B线程获取锁失败,再次挂起,这就是非公平锁,B在C之前尝试获取锁,而最终是C抢到了锁。
公平锁实现:C发现有线程在等待队列,直接将自己进入等待队列并挂起,B获取锁。
讲一下 synchronized,可重入怎么实现。(知乎)
- 作用:保证同一时刻,只有一个线程可以执行某个代码块或方法,保证了代码在执行完后所修改的数据对其它线程是可见的,可以保证有序性,可见性,原子性。
- 原理:synchonized是基于进入和退出monitor对象来实现同步的,使用monitorenter和monitorexit指令实现的。任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁,当获得对象的monitor以后,monitor内部的计数器就会自增(初始为0),当同一个线程再次获得monitor的时候,计数器会再次自增。当同一个线程执行monitorexit指令的时候,计数器会进行自减,当计数器为0的时候,monitor就会被释放,其他线程便可以获得monitor。
锁和同步的区别。
- synchronized是可重入的,reentrantlock也是可重入。
- synchronized是关键字,reentrantlock是Java类。
- synchronized是通过JVM的字节码实现的,每个锁对象都绑定一个monitor,进入一个synchronized同步逻辑时需要获取该monitor并在计数时加1,离开时释放并减1,reentrantlock是通过CAS操作实现的。
- synchronized的加锁和释放锁是自动的,reentrantlock需要手动加锁和释放锁。
- reentrantlock有读写锁实现,在有读和写的并发需求时可以实现更有效率的并发。
- synchronized是不可中断的,reentrantlock支持超时返回和中断。
什么是死锁(deadlock)?
两个或多个线程在执行过程中,相互争夺资源而造成的一种互相等待的现象。
如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?
- 正确的顺序获得锁:如果必须获取多个锁,就要考虑不同线程获取锁的顺序。
- 超时放弃:当线程获取锁超时了则放弃,这样就避免了出现死锁获取的情况。
请你简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
如上。
JDK
Java 中的 LongAdder 和 AtomicLong 的区别
JDK,JRE,JVM有什么区别?
- JDK是Java开发工具包,提供了Java的开发环境和运行环境。包含了编译Java源文件的编译器Javac,还有调试和分析的工具。
- JRE是Java运行环境,包含Java虚拟机及一些基础类库。
- JVM是Java虚拟机,提供执行字节码文件的能力。
反射
反射的实现与作用
- 实现:Class.forName(),类.class,对象.getClass()。
- 作用:动态获取类的信息以及动态调用对象属性和方法。
JVM
JVM 回收算法和回收器,CMS 采用哪种回收算法,怎么解决内存碎片问题?
- 垃圾回收算法
- 标记-清除算法:标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
- 复制算法:将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。
- 标记-整理算法:让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
- 分代收集算法:新生代选择复制算法,老年代选择标记-清除或标记-整理算法。
- 垃圾回收器:
- 新生代回收器:
- Serial:单线程,工作时必须暂停其他工作线程。多用于client机器上,使用复制算法。
- ParNew:serial收集器的多线程版本,server模式下虚拟机首选的新生代收集器,复制算法。
- Parallel Scavenge:复制算法,可控制吞吐量的收集器。吞吐量即有效运行时间。
- 老年代回收器:
- Serial Old:serial的老年代版本,使用整理算法。
- Parallel Old:PS收集器的老年代版本,多线程,标记整理。
- CMS:目标是最短回收停顿时间。
- 通用回收器
- G1:基本思想是化整为零,将堆分为多个Region,优先收集回收价值最大的Region。
- 新生代回收器:
- CMS采用标记清除算法,解决办法是让CMS在进行一定次数的Full GC(标记清除)的时候进行一次标记整理算法。
类加载过程
- 加载:把class字节码文件通过类加载器装载入内存中。
- 验证:保证加载进来的字节码文件符合虚拟机规范,不会造成安全错误。
- 准备:为类变量分配内存,并且赋予初值。
- 解析:将常量池内的符号引用替换为直接引用的过程。
- 初始化:是对类变量初始化,是执行类构造器的过程。
JVM 分区
- 线程私有:Java虚拟机栈、本地方法栈、程序计数器。
- 线程共享:Java堆、方法区。
JAVA 虚拟机的作用?
解释Java源文件编译后产生的字节码文件,消除平台差异性.。
GC 中如何判断对象需要被回收?
- 引用计数法:给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。
- 可达性分析法:通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。
JAVA 虚拟机中,哪些可作为 ROOT 对象?
- Java虚拟机栈(栈帧中的本地变量表)中引用的对象。
- 本地方法栈中JNI(即一般说的native方法)引用的对象。
- 方法区中的静态变量和常量引用的对象。
JVM 内存模型是什么?
JMM的主要目标是定义程序中变量的访问规则,所有的共享变量都存储在主内存中共享。每个线程有自己的工作内存,工作内存中保存的是主内存中变量的副本,线程对变量的读写等操作必须在自己的工作内存中进行,而不能直接读写主内存中的变量。
jvm 是如何实现线程?
jvm 最大内存限制多少
什么是 Java 虚拟机?为什么 Java 被称作是”平台无关”的编程语言”?
- JVM:能够解释并执行java字节码文件的虚拟进程。
- 原因:Java源文件经过javac编译器生成字节码文件,不同的平台安装不同的JVM,字节码运行在JVM上,而JVM能够将相同的字节码翻译成与平台相关的机器码,从而进一步再执行。
描述一下 JVM 加载 class 文件的原理机制?
将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在java堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
GC
java 中内存泄露是啥,什么时候出现内存泄露?(知乎)
- 不再会被使用的对象的内存不能被回收,申请了内存用完了不释放。
- 如果长生命周期的对象持有短生命周期的对象的引用,就很可能会出现内存泄露。
- 举例:静态集合类、单例模式、数据库连接。
minor gc 如果运行的很频繁,可能是什么原因引起的?
- 产生了太多朝生夕灭的对象导致需要频繁minor gc。
- 新生代空间设置的比较小。
minor gc 如果运行的很慢,可能是什么原因引起的?
- 新生代空间设置过大。
- 对象引用链较长,进行可达性分析时间较长。
- 新生代survivor区设置的比较小,清理后剩余的对象不能装进去需要移动到老年代,造成移动开销。
- 内存分配担保失败,由minor gc转化为full gc。
- 采用的垃圾收集器效率较低,比如新生代使用serial收集器。
阐述 GC 算法
标记-清除算法、复制算法、标记-整理算法、分代收集算法。
GC 是什么? 为什么要有 GC?
- GC是垃圾收集的意思。
- GC能够对不可达的对象进行回收,释放内存。
垃圾回收的优点和原理。并考虑 2 种回收机制
- 优点:使Java程序员在编写程序时不再考虑内存管理的问题,有效的防止了内存泄露,可以有效的使用可使用的内存。
- 原理:对不可达的对象进行清除和回收。
- 回收机制:标记垃圾回收、分代复制垃圾回收、增量垃圾回收。
java 中会存在内存泄漏吗,请简单描述。
会,如果长生命周期的对象持有短生命周期的对象的引用,就很有可能会发生内存泄漏。
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
- 基本原理:对于GC(垃圾收集)来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。
- 垃圾回收器不可以马上回收内存。
- 程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
IO 和 NIO、AIO
怎么打印日志?
运行时异常和检查时异常区别
- 运行时异常:程序中可以选择捕获处理,也可以不处理。
- 检查时异常:必须进行处理的异常,如果不处理,程序就不能编译通过。
什么是 java 序列化,如何实现 java 序列化?
- 序列化:把Java对象转化为可传输的字节序列的过程。
- 反序列化:把字节序列还原为Java对象的过程。
- 使用Java的对象流,序列化使用ObjectOutputStream对象输出流的writeObject()方法,反序列化使用ObjectInputStream对象输入流的readObject()方法。
java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
- 2种类型,字节流和字符流。
- InputStream,OutputStream,Reader,Writer。
Java 中的异常处理机制的简单原理和应用。
- Java中出现异常时,会创建一个异常对象,转交给JVM,JVM会把异常一直往上层抛,如果有处理异常的代码,就调用异常处理代码,没有处理异常的代码,JVM 就会将异常转交给默认的异常处理器,默认异常处理器打印出异常信息并终止应用程序。
- 创建异常对象并转交给 JVM 的过程称为抛出异常。
给我一个你最常见到的 runtime exception
- NullPointerException:空指针异常。
- IndexOutOfBoundsException:索引超出异常。
- ArithmeticException:算术异常。
- ClassCastException:类转换异常。
- IllegalArgumentException:非法数据异常。
- IllegalStateException:非法语句异常。
给我一个你最常见到的 checked exception
IOException、FileNotFoundException、SQLException。
error 和 exception 有什么区别?
- Error:是程序无法处理的错误。
- Exception:是程序本身可以处理的异常。
JavaEE部分
Spring
说一下 IOC 和 AOP?
介绍一下 bean 的生命周期
- 实例化(Instantiation):实例化一个bean对象。
- 属性赋值(Populate):为bean设置相关属性和依赖。
- 初始化(Initialization):有Aware接口的依赖注入、BeanPostProcessor在初始化前后的处理以及InitializingBean和init-method的初始化操作。
- 销毁(Destruction):有注册相关销毁回调接口,最后通过DisposableBean和distory-method进行销毁。
Spring 里面注解用过没有?@Autowired 和 @Resource 区别?(博客园)
- @Autowired与@Resource都可以用来装配bean,都可以写在字段上,或写在setter方法上。
- @Autowired默认按类型装配(这个注解是属业spring的),默认情况下要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
- @Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Controller和@RestController 的区别?
- @Controller注解可以返回页面,如果要返回json数据,需要加@ResponseBody注解。
- @RestController = @Controller + @ResponseBody,返回json数据不需要加@ResponseBody注解,不能返回页面。
依赖注入的方式有几种,哪几种?
set注入、构造函数注入、p命名空间注入。
springIOC 原理?自己实现 IOC 要怎么做,哪些步骤?
- 控制反转,对对象的生命周期的控制由程序控制改为由 IOC 容器控制,需要某个对象时就直接通过名字去 IOC 容器中获取。
- 解析xml文件,获取所有bean节点信息,创建一个Map对象,获取bean节点的class信息,使用反射机制实例化对象,通过bean节点的子节点中的信息进行对象属性赋值,将bean节点的id信息作为key,将实例化对象作为value,存放到map中,最后通过beanId获取到容器中的对象。
Spring 中 BeanFactory 和 ApplicationContext 的区别?
BeanFactory仅在调用getBean()方法时实例化bean,而ApplicationContext在容器启动时实例化bean,而不等待getBean()被调用。
什么是 IoC 和 DI?DI 是如何实现的?
请问 Spring 中 Bean 的作用域有哪些?
singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、globalsession(全局会话)。
谈谈 Spring 中自动装配的方式有哪些?(知乎)
在Spring框架中,开启自动装配,只需要在xml配置文件
1 | <bean id="cutomer" class="com.xxx.xxx.Customer" autowire=""/> |
autowire属性有五种自动装配的方式
- no:缺省情况下,自动配置是通过”ref”属性手动设定。
- byName:根据bean的属性名称进行自动装配。
- byType:根据bean的类型进行自动装配。
- constructor:类似byType,不过是应用于构造器的参数。如果一个bean与构造器参数的类型形同,则进行自动装配,否则导致异常。
- autodetect:如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配。
aop 的应用场景?
性能统计/计数、事务处理、缓存处理、协议转换、日志打印。
AOP 的原理是什么?
你如何理解 AOP 中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
- Joinpoint(连接点):目标对象中所有可以增强的方法。
- Pointcut(切入点):目标对象中要增强的的方法。
- Advice(通知/增强):增强的代码。
- Target(目标对象):被代理对象。
- Weaving(织入):将通知应用到连接点的过程。
- Proxy(代理):生成的代理对象。
- Aspect(切面):切入点+通知就形成了切面。
Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?
- 编程式事务:在代码中进行硬编码,使用TransactionTemplate来进行事务管理。
- 声明式事务:通过注解形式和配置形式来管理事务,操作简单。
介绍一下 spring?
Spring是一种可以解决对象创建以及对象之间依赖关系的框架,核心是IOC和AOP。
Hibernate
Struts
Mybatis
解释一下 MyBatis 中命名空间(namespace)的作用。
在mybatis中,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。当namespace绑定接口后,可以不用写接口实现类,mybatis会通过该绑定自动找到对应要执行的SQL语句。
MyBatis 中的动态 SQL 是什么意思?
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
JavaWeb编程
web编程基础
web编程进阶
forward 与 redirect 区别,说一下你知道的状态码,redirect 的状态码是多少?
1 | 200 OK //客户端请求成功 |
servlet 生命周期,是否单例,为什么是单例。
- 生命周期:init()方法初始化,service()方法处理客户端的请求,destroy()方法销毁。
- 是单例的,减少了产生servlet的开销。
Servlet 执行时一般实现哪几个方法?
- init():初始化。
- getServletConfig():获得配置。
- service():服务。
- getServletInfo():获得信息。
- destroy():销毁。
说说 Servlet 接口中有哪些方法?
如上。
如何在基于 Java 的 Web 项目中实现文件上传和下载?
web编程原理
get 和 post 区别?
- GET提交的数据会放在URL之后,POST提交的数据放在主体中。
- GET提交的数据大小有限制,POST提交的数据大小没有限制。
- GET提交数据会带来安全问题,POST提交数据不会带来安全问题。
请谈谈转发和重定向的区别?
- 本质区别:转发是服务器行为,重定向是客户端行为。
- 重定向特点:两次请求,浏览器地址发生变化,可以访问自己web之外的资源,传输数据会丢失。
- 转发特点:一次请求,浏览器地址不变,访问的是自己本身的web资源,传输的数据不会丢失。
说说你对 get 和 post 请求,并且说说它们之间的区别?
如上。
cookie 和 session 的区别?
- cookie数据存放在客户端,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用Cookie。
- 单个Cookie保存的数据长度不能超过4K,很多浏览器都限制一个网址最多保存20个cookie。
forward(转发) 和 redirect(重定向) 的区别(博客园)
1 | //Servlet里处理get请求的方法 |
1 | //Servlet中处理get请求的方法 |
BS 与 CS 的联系与区别。
设置请求的编码:request.setCharacterEncoding(String)。
1 | request.setCharacterEncoding("utf-8"); |
设置响应内容的类型:response.setContentType(String) or response.setHeader(String, String)。
1 | response.setContentType("text/html; charset=utf-8"); |
什么是 Web Service(Web 服务)?(Web service是什么?)
“网络服务”(Web Service)的本质,就是通过网络调用其他网站的资源。
JDBC编程
JDBC基础
数据库水平切分,垂直切分(例子)
- 垂直切分:根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。
- 水平切分:按照某个字段的某种规则,把数据切分到多张数据表。
数据库索引介绍一下。
索引用于快速找出在某个列中有一特定值的行。
介绍一下什么时候用 Innodb 什么时候用MyISAM。
- 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM。
- 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。
- 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB。
数据库两种引擎
InnoDB和MyISAM。
索引了解嘛,底层怎么实现的,什么时候会失效
- 索引底层使用B+树实现。
- 前导模糊查询,数据类型隐式转换,负向条件,执行计算,复合索引如果查询条件不包括索引最左边的字段。
问了数据库的隔离级别
- READ-UNCOMMITTED(读取未提交):可以读取到未提交数据,事务回滚后,读取数据实际并不存在。
- READ-COMMITTED(读取已提交):只能读取已提交数据,但是会导致当前事务读取的数据前后值不一样。
- REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。
- SERIALIZABLE(可串行化):所有事务操作依次顺序执行。
数据库乐观锁和悲观锁
- 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
- 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。
数据库的三范式?
- 第一范式:原子性(列不可分)。
- 第二范式:非主属性完全依赖主属性(要有主键)。
- 第三范式:非主属性互相不依赖,消除传递(不可存在传递依赖)。
讲一下数据库 ACID 的特性?
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):事务前后数据的完整性必须保持一致。
- 隔离性(Isolation):多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其它事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
mysql 主从复制?
leftjoin 和 rightjoin 的区别?
- 左外连接:查询的是左表所有数据以及其交集部分。
- 右外连接:查询的是右表所有数据以及其交集部分。
数据库优化方法
- 表的设计合理化(符合3NF)。
- 添加适当索引(index) 。
- SQL语句优化。
- 分表分库技术(水平拆分、垂直拆分)。
- 进行读写分离。
- 编写存储过程。
- 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小]。
- mysql服务器硬件升级。
- 定时的去清除不需要的数据,定时进行碎片整理。
说出数据库连接池的工作机制是什么?
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。