python之父去面试-面试题_个人文章 - SegmentFault 思否

1 Spring Bean是什么?

在spring中由Spring创建和管理的对象称为bean,

bean有相关的特性,例如懒加载,作用域,生命周期这些。

懒加载就是延迟加载,启动的时候,会创建所有对象,有些不用浪费资源,因此使用懒加载的方式。

作用域:常用的单例和多例,默认单例,多例去配置文件scope设置

单:名字和类型相同的bean对象的实例在spring容器中只能有一个

多:每次spring从容器中获取对象都会创建新的对象,不需要懒加载

2Spring框架中的bean对象的生命周期?

3AOP的初始化?

首先读取配置文件,生成Advisor,PointCat等文件信息。在容器创建bean的过程中,可以对bean进行拦截替换,实现我们想要进行增益的操作。最后,生成代理,返回给容器。

4IOC的初始化?

1 resource定位:指对BeanDefinition的资源定位过程。找到定义Javabean信息的xml文件。并将其封装成Rescource对象。

2 BeanDefinition的载入:把用户定义好的Javabean表示为Ioc容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition。

3 接着向Ioc容器去注册这些BeanDefinition。

5 SpringBoot项目的启动流程?

springBoot启动的时候,基于启动类上注解描述,进行自动配置并扫描指定包和加载包以及包中的类进行加载,然后检测类上是否有指定的注解描述,如@service,@Controller,如果有,将类交给spring框架中的Bean工厂接口的实现类的对象,该对象会基于对象反射创建bean的实例,如果设定的生命周期方法,就调用该方法。一样的,有作用域描述,将实例储存到不同的作用域中。

6 springMVC拦截器的运行原理?

948 接口里本来就有个方法,只需要重写指定的方法

主要的拦截主要是url的请求地址

业务层的拦截用AOP来做

7AOP的主要功能?

日志记录,性能统计,安全控制,事务控制,异常处理

8描述一下最近做的项目和你负责的模块,只需要描述?

9cookie和session的区别?

1cookie是将会话中的数据保存在客户端,属于客户端技术。

2因为cookie将数据保存在客户端,对服务器没有影响,用户的操作就会导致数据的丢失,不稳定,也不安全。

3cookie保存在客户端,可以保存很久。

所以,对安全性不高,数据又要保存久用cookie

4cookie的大小和个数都有限制。大小不超过1kb,站点给浏览器发送的个数了不超过20个。

5cookie应用:实现购物车,记住用户名,30天内自动登入。

session是服务端技术,数据在服务端。相对安全

session是服务端的对象,在并发性高的时,每一个浏览器客户端在服务端都要对应一个session对象,占用内存,影响效率。

所有session适合不用保存很久,安全性要求高的数据。比如保存登入状态,保存验证码。

10什么是SQL注入攻击?如何防止

不用输入密码只输入用户名也可以登入就是SQL注入攻击,由于后台的SQL语句是拼接而来的。用户提交参数中夹杂了#,--等,导致SQL语句的变化。

方法:1通过正则表达式对用户提交的数据进行校验,如果参数中有符号就结束程序,通知用户输入参数不合法,2使用PreparedStatement对象防止SQL注入攻击。使用preparedStatement对象先将SQL语句发送给服务器编译,确定下来,编译之后,SQL语句的骨架和寓意就不会变了,再讲SQL语句发送给服务器,这时候即使有SQL关键字或者是特殊符号,也只是被当做普通文本来处理。

11 JVM如何进行内存调优?

一般企业用三方工具检索程序中,某个方法,某个城西,以及某个接口或者线程占用资源过多,进行调优。

硬件调优:更改JVM的参数设置

软件调优:

12 数据库的优化?

sql语句的优化:尽量不使用全表扫描,不使用where子查询,不要使用模糊查询

13Spring框架中的IOC实现原理?

通过把创建和查找依赖的权利交给容器管理,降低耦合,跟以前主动创建依赖不一样。

14AOP的实现原理?

AOP针对的是非核心业务,基于开闭原则。目的是:不该变原有系统的核心业务代码的基础上添加一些扩展功能,如日志处理,事务控制,权限处理等。

分为两大类:一类是动态代理技术,利用截取消息面的方式,对消息进行装饰,取代原有对象的执行。

AOP基于代理机制实现功能扩展

JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理

CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。

15 Spring实现AOP的方式?

1 基于xml配置 在xml中先改成cglibi代理,定义切面,切入点controller下所有类被调用前都会被拦截。

python之父去面试-面试题_个人文章 - SegmentFault 思否_第1张图片

2基于注解的实现 @Aspect @Before

python之父去面试-面试题_个人文章 - SegmentFault 思否_第2张图片

3基于自定义的注解实现

16streambuffer和streambuilder的区别是什么?

17类方法和实例方法有什么区别?

类方法属于类,不属于某个对象。

类方法只能访问成员变量,不能访问实例变量,实例方法两个都可以

实例方法只能通过对象访问,类方法可以通过类名,类方法,对象类方法调用。

类方法只能访问类方法,实例方法可以访问类方法和实例方法。

类方法不能被覆盖,实例方法可以被覆盖。

18 hashmap和hashtable的区别

HashMap是线程不安全的.,Hashtable是线程安全的。

hashMap是对Map接口的实现,hashtable实现Map接口与dictionary抽象类。

hashMap初始容量为16,hashtable是11.

HashMap可以存储null键和null值

Hashtable不可以存储null键和null值.

两者的默认填充因子都是0.75,hashmap扩容时会翻倍。

19 线程和进程的区别

进程是资源分配的最小单位,线程是时程序运行的最小单位。

产生一个线程的时候,系统会为线程分配独立的内存地址空间,而线程之间是共享地址空间。因此,一个线程耗费的资源比较多,线程共享空间,所以线程的效率高,一个进程的毁坏,不会影响其他进程,一个线程的毁坏,会导致整个进程毁坏了

20.介绍一下枚举类型

21jdk1.8新特性

22二叉树遍历方式

方法一:先序遍历:

遍历顺序:根节点–>左孩子–>右孩子

中序遍历:

后序遍历:

层次遍历:按照所在层次,从下往上遍历

23Tcp和Uip区别

24三次握手和四次挥手

三次握手:A对B,发起请求连接;(第一次握手,发送SYN,然后进入SYN-SEND状态)

第二次握手:B收到了A的信息,统一建立连接,发送ACK-SYN包

第三次握手:A收到B信息,确认与B建立连接。双方进入连接状态。

四次挥手:

A与B交流后,对B发送我要关闭连接了。

B收到A信息,确定A要关闭连接

A收到了B的确认信息后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2)

4.B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次挥手)

5.A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,然后A进入CLOSED)

6.B收到A的确认后,也进入CLOSED。

25 spring中的两大重点是什么

26什么是IOC?

控制反转也叫依赖注入。利用了工厂模式 将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让 spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件 中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要 调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在 A里面new这些bean了。

27 Spring基于xml注入bean的集中方式?

Set方法注入

构造器注入:通过index设置参数的位置,通过type设置参数类型

静态过程的注入4实例工厂的注入

28 Spring支持集中bean的作用域?

单例:每个容器中只有一个bean的实例

多例:为每一个bean提供一个实例

request:为每一个网络请求创建一个实例,在请求完成以后, bean会失效并被垃圾回收器回 收。

session:与request范围类似,确保每个session中有一个bean 的实例,在session过期后,bean 会随之失效。

global-session:全局作用域

29SpringMVC怎么样设定重定向?

转发:加forward

重定向:在返回值加redirct

30SpringMVC运行流程?

用户发起请求带前端控制器

前端控制器根据xml注解进行自动配置,注解查找Handler。

处理器向前端控制器返回handler

前端控制器调用处理器执行Handler

处理器执行Handler,执行结束,给适配器一个返回

适配器向前端控制器返回一个modelandView

前端控制器请求视图解析器进行视图解析

视图解析器进行视图解析,完成后,给前端控制返回一个view对象

前端控制器进行视图渲染,填充到request域中,结束后向用户响应结果。

31 mybatis如何进行批量插入

1 mybatis foreach标签:

INSERT INTO TStudent(name,age) list是参数类型

SELECT #{item.name} as a, #{item.age} as b FROM DUAL

32mybatis中返回主键吗?写SQL,但不要自己插入主键值

配置@Options(useGeneratedKeys=true, keyProperty="对象.属性") 这个的作用是设置是否使用JDBC的getGenereatedKeys()方法获取主键并赋值到keyProperty设置的对象的属性中,说白了就是把自增长的主键值赋值给对象相应的属性

在插入后,使用对象.主键属性的getXXId()方法 获取主键值

33什么原因导致内存溢出,有没有好的解决措施

1 内存中加载的数据量过于庞大,如一次从数据库中取出太多数据。

尽量采用分页方式查询

2 集合类中有对对象的引用,使用后没有清空,是JVM不能回收

34String和StringBuffer的区别

从运行速度方面来说 StringBuffer>String。String为字符串常量,不可变。当你给String字符串重新赋值时看上去是改变了这个字符串,但实际上在jvm中是重新创建了一个对象,而之前的被垃圾回收了。如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的

String适用与少量字符串操作,StringBuffer适用于多线程下在字符串缓冲区进行大量操作

35StringBuffer和StringBuild区别?

36Error、Exception和RuntimeException的区别,作用又是什么?

Exception 是程序员导致的错误,应该在应用程序级被处理

运行异常,空指针异常,数字格式异常,下标越界异常,类强转异常

Error 是不可被控制,经常用来表示系统错误,或者低层次资源错误

37 事务的四大特性:

1 原子性:操作是不可分离的,要么成功,要么失败

2 一致性:数据库状态保存一致。比如转账,转账前后,相加的合保持不变。

3 隔离性:不同事务之间应该隔开。比如B在修改事务,那么A应该看到修改事务之前,或者之后,而不是中间状态。

4 持久性:事务提交成功,所有数据都被持久化保存在数据库中。

38 事务并发读问题?

可以通过设置事务的隔离级别。

脏读:一个事务读取到另一个事务没有提交更新的数据

不可重复读:对同一记录的两次读取结果不一样,在这期间对事务进行了修改

幻读:对同一张表的两次查询结果不一致,因为在两次查询期间,有事务进行了插入或者删除操作。

事务的隔离级别:4个。

1read uncommitted 读未提交的数据 安全性最差,以上都会发生

2read commit oracle默认

读已经提交数据 只可以防止脏读,性能较好

3repeatable read mysql默认 可重复读

防脏读和不可重复读,不能防止幻读

4串行化 最高,数据访问串行,不会有并发问题

数据库中如何将重复的数据去重(具体的sql语句)数据库中存储的数据类型有哪些

整数 int bigint 实数类型 float,double

字符串类型,varchar,char,text等

42 varchar和char区别1)Char固定长度 ;

2)Varchar可变长度 ;

Char如果存入数据的实际长度比指定长度要小 会补空格至指定长度 如果存入的数据的实际长度大于指定长度 低版本会被截取 高版本会报错;

4)Varchar类型如果存入的数据的实际长度比指定的长度小 会缩短到实际长度 如果存入 数据的实际长度大于指定长度 低版本会被截取 高版本会报错;

5)Char 会浪费更多的存储空间 而Varchar不会 ;

6)Char效率会更高 Varchar 效率偏低 ;

7)Char和Varchar在指定时必须要制定后面的数字

43 1. 如果数据库中有N张表,怎样统计表格的数量(具体的sql语句)

44 1. Linux中如何将服务器A远程连接到服务器B(具体命令语句)

45 1. 说一说spring中bean对象的理解

46 项目发布到服务器的流程.

47 说一说依赖注入

用于解耦 三种方式实现

构造函数注入 set注入 接口注入

48 请介绍你最近做过的项目,项目中遇到过什么样的问题,你是怎么解决的?

49 Redis的运行原理是怎么样的,简单描述一下

50 你的项目里面哪里用了多线程?

在日志记录模块使用了多线程,因为多条记录仪器涌向数据库

51 GC回收具体讲一下?

52redis缓存讲一下

53String操作类有哪些?有什么区别?

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

54 Linux如何修改文件权限?

55详细说说你项目主要有哪些功能?

56你在项目中遇到的印象深刻的问题?

57你了解几种IO?

58Hashmap和HashTable的区别?

Hashmap是线程安全的,table是不安全

hashmap初始值是16,table是11.HashMap是可以储存null值和null键的,hashtable不可以。两者默认填充因子是0.75,hashMap扩容会翻倍。

59Redis的基本数据类型

list set zset String

60 如何在命令窗口打包

61 Linux一些基本命令

62 表格是怎么设计?

63 可达性算法什么是根?垃圾找到方法

程序跑起来的时候,运行main方法,在这个main方法分配内存的时候,比如 T T1=new T,这里面可能有队列,又维护有一系列对象,好了,整个程序开始跑,最后形成对象图,最开始用到的对象就是根对象,顺着根找到的都是有用的对象,没有的就是废物。

64 垃圾清除的方法

标记清除 找到了就标记

拷贝

压缩

64JVM性能调优程序计数器

为了能够使得每个线程都在线程切换之后,能够回到之前的位置,所以每个程序计数器都需要一个独立程序计数器,并且不能够被干扰。

得到指令后,计算器就+1

程序计数器中储存的数据所占的空间的大小不会随程序的执行而发生。

2Java栈(线程私有)

3本地方法栈(线程私有)

4 堆(线程共享)

5方法区(线程共享)

6直接内存(线程共享)

1.1 Java跨平台的基础

类的本质:

class文件都对应一个类或者一个接口的定义文件,不一定以8位字节问问基础

类加载的机制

双亲委派机制

标记清除法在堆里

标记清除法:两个阶段:第一阶段从引用根节点开始标记所以被引用的对象。第二阶段,遍历整个堆,标记对象的清除。需要暂停整个应用,会产生内存碎片。

引用计数:增加一个引用+1,减少一个引用-1,为0清除

复制:把内存分为两半,每次使用一半。然后遍历这个区域,把正在使用的对象复制到另外一半区域,复制的时候,还能进行清理。

标记整理

从根节点标记所有被引用对象,在遍历整个堆,清理标记对象,把存活的对象,"压缩到其中一块区域’,按顺序排放。

Java中是值传递还是引用传递?

你可能感兴趣的:(python之父去面试-面试题_个人文章 - SegmentFault 思否)