面试题总结2019

这份资料写的不全只是去面试的时候,面试官提的几个问题记录 并在网上搜索去加深印象,具体的哪里看的也忘了 ,写的不是很及时。非原创。回答部分点到为止没有太深入,主要作为一个总结性的博文

一、java基础知识:

厦门篇

  1. java的反射机制:Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制,它的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后通过使用java.lang.reflect包下的API以达到各种动态需求。反射作用总结就是:1.动态地创建类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。2.应用程序需要在运行时从某个特定的程序集中载入一个特定的类。
  2. jvm怎么划分的:运行时数据区通常包括这几个部分:1.程序计数器(Program Counter Register)(也就是说是用来指示 执行哪条指令的。)、2.Java栈(VM Stack)(Java栈是Java方法执行的内存模型)、3.本地方法栈(Native Method Stack)、4.方法区(Method Area)(在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。)、5.堆(Heap)(Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的)。
  3. equle和==的比较: ==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同
  4. 类的加载过程: 1、加载:这个很简单,程序运行之前jvm会把编译完成的.class二进制文件加载到内存,供程序使用,用到的就是类加载器classLoader ,这里也可以看出java程序的运行并不是直接依 靠底层的操作系统,而是基于jvm虚拟机。如果没有类加载器,java文件就只是磁盘中的一个普通文件。2、连接:连接是很重要的一步,过程比较复杂,分为三步 验证 》准备 》解析验证:确保类加载的正确性。一般情况由javac编译的class文件是不会有问题的,但是可能有人的class文件是自己通过其他方式编译出来的,这就很有可能不符合jvm的编 译规则,这一步就是要过滤掉这部分不合法文件准备:为类的静态变量分配内存,将其初始化为默认值 。我们都知道静态变量是可以不用我们手动赋值的,它自然会有一个初始值 比如int 类型的初始值就是0 ;boolean类型初始值为false,引用类型的初始值为null 。 这里注意,只是为静态变量分配内存,此时是没有对象实例的解析:把类中的符号引用转化为直接引用。解释一下符号引用和直接引用。比如在方法A中使用方法B,A(){B();},这里的B()就是符号引用,初学java时我们都是知道这是java的引用,以为B指向B方法的内存地址,但是这是不完整的,这里的B只是一个符号引用,它对于方法的调用没有太多的实际意义,可以这么认为,他就是给程序员看的一个标志,让程序员知道,这个方法可以这么调用,但是B方法实际调用时是通过一个指针指向B方法的内存地址,这个指针才是真正负责方法调用,他就是直接引用。3、初始化:为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程序编写者为变量分配的真正的初始值.
  5. 多线程几种实现方式: 1、继承Thread类创建线程。2、实现Runnable接口创建线程。3、实现Callable接口通过FutureTask包装器来创建Thread线程。
  6. 同步有几种实现方法: 1. 使用同步关键字synchronized (1).同步方法 。(2).同步代码块。 2.使用特殊域变量(volatile)实现线程同步。3.使用重入锁实现线程同步。4.使用局部变量实现线程同步。
  7. 什么是线程安全: 线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。死锁和脏数据就是典型的线程安全问题。
  8. Java线程池的四种创建方式: 1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
  9. Callable和Runnable的区别: 1、Callable有返回值,Runnable没有返回值 2、Runnable没有容错机制,意味着如果出现异常必须立即处理;Callable有容错机制,意味着出现异常之后可以向上抛出3、Runnable可以通过Thread来启动,也可以通过线程池的execute、submit来处理;Callable线程只能通过线程池的submit来处理。
  10. wait方法和sleep方法的区别: 1.Thread类的方法:sleep(),yield()等 Object的方法:wait()和notify()等 2. sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 4. sleep必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常。
  11. 创建对象: 1.用new语句创建对象,这是最常见的创建对象的方法。2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。3.调用对象的clone()方法。4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
  12. Java中的泛型是什么: 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写体验泛型,代码时定义一些可变部份,那些部份在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。 好处: 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。 2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。3、泛型的类型参数可以有多个。4、泛型的参数类型可以使用extends语句,例如。习惯上称为“有界类型”。5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(“java.lang.String”);
  13. HashMap和Hashtable的区别: 1、继承的父类不同: Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。 2、线程安全性不同:Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。
  14. ArrayList、Vector和LinkedList的区别: 1.实现方式:ArrayList,Vector 是基于数组的实现。LinkedList 是基于链表的实现。2.同步:ArrayList,LinkedList 不是线程安全的。Vector 是线程安全的,实现方式是在方法中加 synchronized 进行限定。3.性能消耗:ArrayList和Vector由于是基于数组实现,所以在指定位置插入和删除时间复杂度为O(n),还可能出现扩容问题,这比较消耗性能。LinkedList不会出现扩容问题,适合增删操作;查找元素需要遍历链表,时间复杂度为O(n)。4.快速插入、删除元素,使用LinkedList快速随机访问元素,使用ArrayList,单线程,使用List,比如ArrayList,多线程,使用Vector。
  15. 内部类如何实例化: 假设外部类叫Out,内部类叫In,那么我们可以使用Out.In in = new Out().new In()来实例化内部类的对象。
  16. switch是否能作用在byte上,是否能作用在long上,是否能作用在string上:switch可作用于char byte short int;switch可作用于char byte short int对应的包装类;switch不可作用于long double float boolean,包括他们的包装类。switch只能是int 或这能转化为int型的byte,short,char,jdk1.7之后String也可以。
  17. 简单描述hibernate中load和get的区别: 1.返回值:get()返回的是查询出来的实体对象,而load()查询出来的是一个目标实体的代理对象。2.查询时机:get()在调用的时候就立即发出SQL语句查询,而load()在访问非ID属性的时候才会发出查询语句并且将被代理对象target填充上,但是如果这个动作发生在Session被关闭后的话就会抛出LazyInitializationException。3.查询结果为空时:get()抛出NullPointerException,load()抛出ObjectNotFoundException
  18. spring的事务应该配置在dao层,还是service层?为什么?: Spring事务为业务逻辑进行事务管理,保证业务逻辑上数据的原子性。事务得根据项目性质来细分:事务可以设置到三个层面(dao层、service层和web层)。 第一:web层事务,这一般是针对那些安全性要求较高的系统来说的。例如电子商务网站。粒度小,一般系统用不着这么细。 第二:service层事务,这是一常见的事务划分, 将事务设置在业务逻辑上,只要业务逻辑出错或异常就事务回滚。粒度较小,一般推荐这种方式。第三:数据持久层数据务,也就是常说的数据库事务。这种事务在安全性方面要求低。就是给一个简单的增删改之类的操作增加事务操作。粒度大给Service层配置事务,因为一个Service层方法操作可以关联到多个DAO的操作。在Service层执行这些Dao操作,多DAO操作有失败全部回滚,成功则全部提交。事务分为业务事务和系统事务,业务事务也就是业务逻辑上操作的一致性,系统事务自然就是指真正的数据库事务,Spring配置事务的是为了什么进行管理,当然是为业务逻辑进行事务管理,保证业务逻辑上数据的原子性;Dao层是什么,数据访问层,是不应该包含业务逻辑的,这就是和Service层的不同;Service层就是业务逻辑层,事务的管理就是为Service层上的保证。
  19. java中String类型的NULL和“”区别,分别如何判断: 1、类型 null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;"“表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = “” ;2、内存分配: String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;String str = “”; 表示声明一个字符串类型的引用,其值为”"空字符串,这个str引用指向的是空字符串的内存空间;在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap); 判断null:s == null,判断“”:s.isEmpty();
  20. 接口是否可以继承接口;抽象类是否可以实现接口?抽象类是否可以继承实体类: 接口可以继承接口,抽象类不可以继承接口,但可以实现接口;抽象类可以继承实体类。
  21. 数组不属于一种原生类,数组是对象,java中数组的长度不可以改变
  22. 数据连接池的工作机制是什么:
  23. 谈谈对多态的理解: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定
  24. 列举http请求的方式有几种,说说对这几种请求的理解: 1.get请求:这种方法是将信息存储在url中,既不安全,还无法传递太大的数据。注意:get方法不应当用于容易产生‘副作用’的操作中。一般的网络爬虫都会从get入手。2.post:向指定的路径提交数据进行处理请求,一般用于表单的提交数据。注意:数据包含在请求体中。post请求可能会导致新的资源或以有的资源被修改。3.options:返回服务器针对特定资源所支持的http请求方法。注意:允许客户端查看服务器的性能,也可以利用向web服务器发送的“*”的求情来测试服务器的功能4.head:与get请求相似的响应,但是请求体不会被返回。注意:这一方法可以不必传输整个响应内用的情况下,就可以获取包含在响应消息头中的原信息。5.put:从客户端向服务器传送的数据取代指定的文档的内容。6.delete:请求服务器删除指定的页面7.trace:返回显示服务收到的请求,主要用于测试或诊断。
    深圳篇
  25. 方法是值传递还是引用传递: 1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
  26. 怎么用数组实现队列和栈详情请看此博客
  27. 设计一个注册登录模块:
  28. 什么是跳跃表:
  29. 内部类和静态内部类的区别内部类: 1、内部类中的变量和方法不能声明为静态的。2、内部类实例化:B是A的内部类,实例化B:A.B b = new A().new B()。3、内部类可以引用外部类的静态或者非静态属性及方法。静态内部类:1、静态内部类属性和方法可以声明为静态的或者非静态的。2、实例化静态内部类:B是A的静态内部类,A.B b = new A.B()。3、静态内部类只能引用外部类的静态的属性及方法。
  30. final关键字的用法: 1.修饰数据,在编写程序时,我们经常需要说明一个数据是不可变的,我们成为常量。2.修饰方法参数,前面我们可以看到,如果变量是我们自己创建的,那么使用final修饰表示我们只会给它赋值一次且不会改变变量的值。3.修饰方法,它表示该方法不能被覆盖。4.修饰类,类是无法被继承的。
  31. abstract关键字的用法: 1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。 2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。
  32. 八种基本数据类型:byte(位)8,short(短整数)16,int(整数)32,long(长整数)64,float(单精度) 32,double(双精度)64,char(字符)16,boolean(布尔值)8。

二、框架:

厦门篇

  1. 对spring的看法:主要谈一下IOC和AOP,然后讲一下实现原理和应用。并结合部分自己熟悉的设计模式讲解。并引导面试官到自己熟悉的领域(回答:(1).什么是DI机制? 依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者。因此也称为依赖注入。spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。设置注入的优点:直观,自然构造注入的优点:可以在构造器中决定依赖关系的顺序。(2)什么是AOP? 面向切面编(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面 1.面向切面编程提供声明式事务管理 2.spring支持用户自定义的切面面向切面编程(aop)是对面向对象编程(oop)的补充,面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。aop框架具有的两个特征: 1.各个步骤之间的良好隔离性 2.源代码无关性)。
  2. aop是怎么实现的:AOP 思想: 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强 !AOP应用场景场景一: 记录日志,场景二: 监控方法运行时间 (监控性能), 场景三: 权限控制 ,场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 ),场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )。
  3. Spring中AOP的实现原理 Spring中AOP的有两种实现方式:1、JDK动态代理:JDK动态代理只能为接口创建动态代理实例,而不能对类创建动态代理。需要获得被目标类的接口信息(应用Java的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用invokeHandler方法来处理。2、Cglib动态代理:CGLib动态代理需要依赖asm包,把被代理对象类的class文件加载进来,修改其字节码生成子类。
  4. hibernate和mybatis的区别: 1.开发方面: hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发;Mybatis 属于半自动化,sql需要手工完成,稍微繁琐;2.sql优化方面:Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;3.对象管理比对:Hibernate 是完整的对象-关系映射的框架,开发工程中,无需过多关注底层实现,只要去管理对象即可;mybatis 需要自行管理映射关系;4.数据库移植性:mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。 关于这两者的区别这博文写的不错。
    深圳篇
  5. @Autowired 与@Resource的区别:详细请看该博文
  6. Spring中ioc是怎么实现的:详细请看该博文
  7. **过滤器,拦截器,前端控制器,Controller请求的先后顺序:**过滤器一>前端控制器一>拦截器一>Controller详细请看该博文
  8. hibernate的优点:
  9. 理解Spring容器、BeanFactory和ApplicationContext: 参考该文章
  10. 说出servlet的生命周期 并说servlet和CGI的区别: 参考该文章

一、数据库:

厦门篇

  1. 脏数据和脏读:1)脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。2)不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。3)幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
  2. 不可重复读和幻读到底有什么区别(1)不可重复读是读取了其他事务更改的数据,针对insert与update操作 解决:使用行级锁,锁定该行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。(2)幻读是读取了其他事务新增的数据,针对insert与delete操作。
  3. 左连接和内连接的区别: 内连接:取交集,select * from A,B where A.Aid=B.BnameidSelect * from A JOIN B ON A.Aid=B.Bnameid的运行结果是一样的。外连接:外连接分为两种,一种是左连接(Left JOIN)和右连接(Right JOIN)取一边的值为主,没有对应的值放空。总结:左连接:左边有的,右边没有的为null,右连接:左边没有的,右边有的为null,内连接:显示左边右边共有的。
  4. 使用语句查询表中所有成绩大于80的数据: select name from student where id not in(select distinct stu_id from score where grade &lt; 80)
  5. mysql函数编写: create function functionName([parm type],[parm1 type],……) returns type begin 语句;return 值; end;
  6. sqlserver函数: ALTER FUNCTION [dbo].[dateAddHour] ( @CheckTime AS datetime --时间 ) RETURNS datetime AS BEGIN Declare @retValue datetime Set @retValue = DATEADD(hh, 8, @CheckTime) Return @retValue END;
  7. 谈谈你对关系型数据库和非关系型数据库的理解: 1.数据存储方式不同:关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。2.扩展方式不同:SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。3.对事务性的支持不同:如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。4.关系型:Oracle,SQLServer,DB2,Mysql,Microsoft Access,非关系型:redis, Amazon DynamoDB, Memcached,Microsoft Azure Cosmos DB和Hazelcast。5.使用场景:关系型:需要做复杂处理数据;数据量不是特别大的数据;对安全性能要求高的数据;数据格式单一的数据;非关系型
  8. 数据库如何获取当前时间的: oracle :select TRUNC(SYSDATE) from dual,mysql:NOW() 和 SYSDATE() ,sqlsever:getdate()。
  9. mysql8新特性:该文称比较全的阐述系特性
  10. 写出发帖数最多的十个人名字的sql利用下表:members(id,username,posts,pass,email)
    答案:SELECT members.username FROM members ORDER BY posts DESC limit 10;
    深圳篇
  11. oracle和mysql的区别:详情请看
  12. 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?:参考该文章
  13. 联合索引是什么:联合索引是由多个字段组成的索引。生效时索引条件从左到右,A+B+C 索引生效,A+C先匹配A但索引失效,B+C索引失效。
  14. 多节点部署服务,生成的文件如何确定用户下载的他需要的,将所有服务器单独生成的文件放在共享文件价里,提供统一调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值