面试技术总结

1:JSP、JavaScript、jQuery、jQuery Easy UI、Ajax、JSON各自是什么、区别、联系
JavaScript是一门前端语言,是对页面的渲染,来实现一些逻辑
jQuery是轻量级的js框架,它对js进行了封装,使其更方便使用,jQuery提供了一系列的Ajax函数,使js与Ajax的使用更方便
JSP是页面的展示
Ajax是一种基于JavaScript等的异步通讯技术,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新。Ajax最多用途是做前后台数据交互,最大的优点是提高了数据更新的速度
JSON是JavaScript内置的一种数据格式,目的是为了让Ajax技术中的数据传输更方便更简单。
2:spring 里面的3大块
2.1:ioc (控制反转)通过反射的方式在ioc容器中创建bean,所有必须要有无参的构造方法
2.2:aop 面向贴面编程–主要起到了拦截的作用
2.3:事务(aop最好的使用)-- 转载事务学习
2.4:注解
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
3:struts的学习–控制层的框架–通过过滤器来拦截请求与参数
前台请求接收参数的方法
4:springmvc
前台请求接收参数的方法
5 springboot与springCloud的关系
SpringBoot专注于快速方便的开发单个个体微服务。
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。
SpringBoot可以离开SpringCloud独立开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
6: io ,nio,bio 的区别
区别1
区别2

7:
在这里插入图片描述

hashMap 1.8之前底层和1.81之后的底层
1.7:数组+链表
底层hash表-数组。数组里面存的是一个个Entry。所有hashmap遍历使用Entry对象。
Map-hash表默认大小是16.
在这里插入图片描述
计算hasecode值对应的索引值。
在这里插入图片描述
hasecode相同,equles相同,value覆盖之前的value。
在这里插入图片描述
hasecode相同,equles不相同。形成链表。
在这里插入图片描述

碰撞太多了,导致hasemap设计的没有意义。所有出来了一个加载因子,当数据到达数组的75%的时候,实现数组扩容,扩容完后,数组在进行新的重新排序(计算hasecode)。减少碰撞概率。

1.8:数组+链表+红黑树
什么时候转换成红黑树,当总容量大于64和链表数据大于8时,就转成红黑树。

红黑树的好处,除了添加之外,其他效率都快于链表。添加需要比较
jdk1.8l链表添加到末尾和1.7不同。
孔融扩容也方便在这里插入图片描述

8:ConcurrentHashMap 1.8之前的变化
jdk1.7 ,锁分段机制,并发级别 16.

在这里插入图片描述

1.8:CAS算法。无锁算法。不使用段了,因为段的长度不好凭静。16。太大浪费空间,太小,某些段中,数据过多。

看完这篇 HashMap ,和面试官扯皮就没问题了

9:jvm 模型变化,jdk1.7于jdk1.8

jdk1.7在这里插入图片描述

1.8
在这里插入图片描述

JVM 内存可简单分为三个区:
1、堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)
2、栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)
3、方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)
Java 的垃圾回收器(GC)主要针对堆区
方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放
在这里插入图片描述

10.重载与重写
重载:
1.同一个类中,方法名相同,参数列表不同。返回值类型合修饰符无限制
重写:
1.子类继承父类,重写父类里面的方法,方法名相同,参数列表相同,返回值类型相同,修饰符大于等于父类。
1.final修饰变量,则等同于常量
2.final修饰方法中的参数,称为最终参数。
3.final修饰类,则类不能被继承
4.final修饰方法,则方法不能被重写。
5.final 不能修饰抽象类
6.final修饰的方法可以被重载 但不能被重写
11.Servlet的生命周期
1.加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
2.创建:通过调用Servlet的构造函数来创建一个Servlet实例
3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
4.处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的
Service()方法来响应客户端请求(Service方***根据请求的method属性来调用doGet()和doPost())
5.卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
在这里插入图片描述
11.1. servlet与controller里面的拦截区别
你可以理解为,Spring MVC是基于servlet的,它有一个DispatherServlet,然后它负责处理请求,并且调用了你的controller。
打一个比方,web网站是应用程序么?你可以说浏览器是一个应用程序,而web网站是让浏览器这个应用程序作为基础,成为通用的应用的容器
11.2. springboot 里面配置servlet拦截
SpringBoot中使用Servlet

在这里插入图片描述

拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别

拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
spring boot 过滤器、拦截器的区别与使用

总结:核电项目里面的spring security 相当于一个filter,过滤器。对url请求做处理的。基于函数回调。
拦截器 基于 java反射

abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
is-a:继承关系 has-a:从属关系 like-a:组合关系

13.依赖注入和控制反转是同一概念:
依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
依赖注入的动机就是减少组件之间的耦合度,使开发更为简洁
14.Java标识符由数字,字母和下划线(_),美元符号($)或人民币符号(¥)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字不能当作Java标识符。

Java 标识符有如下命名规则:

       由26个英文字母大小写,数字:0-9 符号:_ $ 组成
       标识符应以字母、_ 、$开头。
       标识符不能是关键字。

 Java中严格区分大小写 

在这里插入图片描述
在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错

java中的i++和++i在java语言层面上来看使用中间量机制,i=i++,i不变,i=++i相当于++i,而结合在一个语句里使用则会报错,因为++后应该跟变量。同理,i=(++i)++也是不对的。
在这里插入图片描述
在这里插入图片描述
17:抽象类和接口

  1. 接口中不能有构造方法,抽象类中可以有。抽象类中构造方法作用:初始化抽象类的成员;为继承它的子类使用
  2. 接口中方法默认是public abstract (只能是这两个关键字,或其中一个或都省略)
  3. 接口中的变量默认是public static final(只能是这三个关键字,或其中两个/一个或都省

18: F.Synchroized修饰非静态方法,是对调用该方法的对象加锁,Synchroized修饰静态方法,是对类加锁(因为类会调用它,)
19:java关键字
在这里插入图片描述
20:
定义在类中的变量是类的成员变量,可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型例如int则会默认初始化为0
局部变量是定义在方法中的变量,必须要进行初始化,否则不同通过编译
21:
22在这里插入图片描述
22:
在这里插入图片描述
23:
在这里插入图片描述

24:
运行异常,可以通过java虚拟机来自行处理。非运行异常,我们应该捕获或者抛出。
finally代码块在return中间执行。return的值会被放入临时空间,然后执行finally代码块,如果finally中有return,会刷新临时空间的值,方法结束返回临时空间值。
在这里插入图片描述
在这里插入图片描述
25:
在这里插入图片描述
26: this,super,this(),super()

  1. 构造器中第一行默认是super(),一旦直接父类的构造器中没有无参的,那么必须显式调用父类的某个有参构造。 2. 构造器中第一行的super()可以换成this(),但是this()和super()只能出现一个。
    3. super,this关键字与super(),this()不是一回事,前者表示当前调用者的父类与其本身,后者是为了构造器相互调用。
    构造函数不能被继承,构造方法只能被显式或隐式的调用。

27:String,StringBuffer,StringBuilder,都实现了CharSequence接口。 String是个不可继承类(final修饰),也是个不可变类(内部char数组被final修饰)。 StringBuffer和StringBuilder内部都是一般的动态数组,所以可变。前者是线程安全的,因为方法基本都被synchronized修饰了。

28:多态
编译看左边,运行看右边。意思编译时候,看左边有没有该方法,运行的时候结果看 new
的对象是谁,就调用的谁。 编译不通过,下面程序。
在这里插入图片描述
面向对象的特性有抽象,封装,继承,多态,多态的表现形式可以是对父类的方法的重写。继承是根源,重写是表现形式
29: 项目里面bean对象实现序列化的原因。
数据是通过流传输的。
序列化机制允许将实现序列化的Java对象转换成字节序列 ,这些字节序列可以被保存在磁盘上,或者通过网络传输,以备以后重新恢复成原来的对象.1.对象的序列化(serialize)指将一个Java对象写入IO流中,对象的反序列化机制(Deserialize)则指从IO流中恢复该Java对象.如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化的(实现Serialize接口或者Externalizable接口)一.使用对象流实现序列化
30:http请求 - socket 通信

31:左移,右移
5的二进制是0101。 x=5>>2 (>>带符号右移) 将0101右移2位,为:0001。 y=x>>>2 (>>>无符号右移,左边空缺补充为0) 将0001右移2位,补0。结果为:0000。 所以得出答案0
在这里插入图片描述
32:线程
在这里插入图片描述
在这里插入图片描述
34:
1、null、true、false 是 Java 中的显式常量值,并不是关键字 或 保留字
2、sizeof 是 C/C++ 中的方法,Java 中并没有这个方法,也没有该关键字 或 保留字
3、implements 和 instanceof 都是 Java 中的关键字
35:异常提膝

                            error
  throwable         
                                                  checked excption
                             excption                
                                                  runtime excption

36:
在这里插入图片描述

37:运算

被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了

而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。
Java中的byte,short,char进行计算时都会提升为int类型。
在这里插入图片描述
38:
数组不是基本类型,在java中,数据类型就分为基本数据类型(即原生类)和引用数据类型,所以数组不是原生类
39:
默认的浮点数据类型是double,如果要指明使用float,则需要在后面加f
40:
接口是更抽象的东西,属性默认是:public static final的,方法默认是public abstract的!
41:
在这里插入图片描述

42:
在这里插入图片描述

43:
在这里插入图片描述

44:
在这里插入图片描述

在这里插入图片描述

45:

在这里插入图片描述
46:

在这里插入图片描述

数据库部分-mysql

1.关联查询,left join on ,innor join on , rigth join on 与 子查询 in ,exstis 的区别
定义:
exist适合 子查询中表数据大于外查询表中数据的业务场景
in:适合外部表数据大于子查询的表数据的业务场景

in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的

in-子查询先查询in里面,在查询in外面 — 在什么里面。
exstis - 子查询 先查询exstis外面,在查询exstis里面。

使用:在这里插入图片描述

left join on 影响的是left join 右边的表
rigth join on 影响的是rigth join 左边的表
inner join on 合计

在这里插入图片描述
3:组合索引

在这里插入图片描述
在这里插入图片描述

3.redis

1:redis过期key的清理策略

一,有三种不同的删除策略

(1),立即清理。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。
(2),惰性清理。键过期了就过期了,不管。当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
(3),定期清理。每隔一段时间,对expires字典进行检查,删除里面的过期键。
二,详细说明三种清理方式的优劣
(1)立即清理
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。
因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。
(2)惰性删除
惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。
所以惰性删除的缺点很明显:浪费内存。dict字典和expires字典都要保存这个键值的信息。
(3)定时删除
从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。
定时删除是:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。
另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。
三,目前redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用

4:项目里面使用的主键生成策略总结-目前使用过的

1:mysql数据库表自动策略,主键自动生成策略。 可以设置增长的步长。数字类型

在这里插入图片描述
2:UUID -字符串类型 (是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)

  32位的字符串,无需赋值,

在这里插入图片描述
3:核电项目使用的-主键雪花算法。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值