2022面试题

StringBuffer / StringBuilder的区别

Java 平台提供了两种类型的字符串:String和StringBuffer / StringBuilder,

String的不可变性

它们都可以储存和操作字符串,同时三者都使用final修饰, 都不能被继承

StringBuilder和StringBuffer称之为“可变字符序列”

strinngBuffer是线程安全的,做线程同步检查, 效率较低。

stringBuilder是 JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。

暂停线程执行常用的方法有sleep()和yield()方法,这两个方法的区别是:

\1. sleep()方法:可以让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态。

\2. yield()方法:可以让正在运行的线程直接进入就绪状态,让出CPU的使用权。

_Java线程中,sleep()和wait()区别

sleep是线程类(Thread)的方法;作用是导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复;调用sleep()不会释放对象锁。

wait是Object类的方法;对此对象调用wait方法导致本线程放弃对象锁,进入等 待此对象的等待锁定池。只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进行运行状态。

接口和抽象类的区别

相同点:都不能被实例化 都是被继承的,均包含抽象方法 ,继承类或实现接口的类必须实现所有的抽象方法,否则是抽象类

区别:抽象类:可以有抽象方法,普通方法,构造方法 ,是一个类,被其他类继承用的

抽象类中可以定义常量和变量

接口:只能有抽象方法,但是在jdk1.8之后 ,可以有修饰符修饰的默认方法和静态方法

接口不能有构造方法

接口中只能定义全局静态常量,不能定义变量

session和cookie的区别

相同点 两者都是保存数据的 就是键值对保存数据的 两者都可以设置保存时间

存储角度

Session是服务器端的数据存储技术,cookie是客户端的数据存储技术

解决问题角度:

  • Session解决的是一个用户不同请求的数据共享问题,cookie解决的是不同请求的请求数据的共享问题

安全的角度

session是保存在服务器端 所以相对安全一点 key是字符串 value可以放对象

cookie也是服务器端产生的一个对象,会保存在客户端,相对不安全,key-value只能是字符串

生命周期角度:

  • Session的id是依赖于cookie来进行存储的,浏览器关闭id就会失效,Cookie可以单独的设置其在浏览器的存储时间。

session和cookie的区别(上课时的笔记)

  1. session 保存在服务端 保存的内容为Object类型 保存对象 两个都是key-value保存

  2. Cookie在 客户端 不是内置对象 保存的内容为String类型 只能保存字符串 cookie不能保存中文

  3. session里的数据相对安全,cookie不安全 ,因为session的数据保存在服务器

Cookie由服务端生成的,再发送给客户端保存

HashMap与HashTable的区别

\1. HashMap: 线程不安全,效率高。允许key或value为null。

\2. HashTable: 线程安全,效率低。不允许key或value为null。

Tcp和UDP的区别

传输层的两个协议 ,它们使用IP路由功能把数据包发送到目的地

TCP:面向连接,可靠传输,TCP的路由选择只发生在建立连接的时候

UDP:无连接,不可靠传输,UDP的每个报文都要进行路由选择

set和list和map这几个接口的区别:

set是不能重复且无序的,,新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。

list:可以重复且有序, List接口常用的实现类有3个:ArrayList、LinkedList和Vector

map 存储键值对 而且key值是唯一的,

数据库 jdbc

什么是事务 事务的四大特性:

事务(Transaction)是访问和更新数据库的程序执行单元;事务是由多条sql语句组成的工作单元,要么都执行,要么都不执行

怎么实现事务

获取连接的时候,首先拿到connection对象,

  • 原子性:语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的;实现主要基于undo log

  • 持久性:保证事务提交后不会因为宕机等原因导致数据丢失;实现主要基于redo log,指一个事务一旦被提交,它对数据库中数据的改变就是永久性的

  • 隔离性:保证事务执行尽可能不受其他事务影响;InnoDB默认的隔离级别是RR,RR的实现主要基于锁机制(包含next-key lock)、MVCC(包括数据的隐藏列、基于undo log的版本链、ReadView)

  • 一致性:事务追求的最终目标,一致性的实现既需要数据库层面的保障,也需要应用层面的保障,(数据不被破坏)事务在完成时,必须使所有的数据都保持一致状态

  • 什么是sql注入

sql注入是一种将sql代码添加到输入参数中,传递到sql服务器解析并执行的一种攻击手法

(这里介绍两种主要的sql注入攻击)

  • 数字注入

    sql中where条件的参数值为数字的语句进行修改攻击。

   也就是上面提到的 id = -1 OR 1=1

  • 字符串注入

jsp get和post两种提交方法,两者的区别

get相对不安全,传输内容显示在地址栏

post相对安全

session和cookie的区别

项目里面的登录是怎么实现的

java是怎么连接数据库的,jdbc连接数据库的步骤

tomcat怎么部署项目

springmvc工作流程

  快速记忆:

  核心控制器捕获请求,查找Hander,执行Handler,选择ViewResolver,通过ViewResoler渲染视图并返回

redis的四个数据类型

vue的生命周期

vue的生命周期=]]

怎么防止暴力登录

1.验证码

2.限制登录次数

token 登录时 服务器端发给客户端的一个验证码 客户端访问服务器时携带token,服务器去验证token,验证是否合法,是否过期

selvet的生命周期 线程不安全,单例的 可以有两个人同时调用doget方法或dopost方法 会不会出问题,不会,每次的不是同一个

第一次的时候创建实例

调用构造方法

调用初始化方法

调用servies方法

生命周期,调用了什么方法,什么时候调用,单例的

jvm 五个内存 方法区 放什么,堆放什么 堆是属于常量的,专门放常量,,方法区,程序计数器,本地方法区

进程和线程的区别

进程是共享资源的,不能独占资源

进程不能独立存在

jsp的工作原理 jsp是Java的一个特殊类

首先翻译成.java文件

在编译成.class文件

在由tomcat运行

最后输出到页面

什么是事务

在浏览器敲一个地址 从回车到结果 这一个过程是怎么样的 主要考点3次握手 四次挥手

屏蔽掉底层细节,笼统的总结一下上述过程:

应用层:

  • 浏览器封装 HTTP 请求报文

  • DNS 解析域名获得目标服务器地址

传输层:

  • 建立连接

  • 把应用层传过来的 HTTP 请求报文进行分割,并在各个报文上打上标记序号及端口号转发给网络层

网络层:

  • 利用 ARP 协议根据 IP 地址获取作为通信目的地的 MAC 地址后转发给链路层

服务端在链路层收到数据,按序往上层发送,一直到应用层接收到浏览器发送来的 HTTP 请求报文,然后处理该请求并返回 HTTP 响应报文,浏览器接收到响应报文之后解析渲染界面。最后 TCP 断开连接。

vue用了哪些设计模式

vue里面的数据绑定 v-model 用了什么设计模式 观察者设计模式

vue的声明周期

****vue实例的生命周期**** 一个Vue实例在被创建时要经过一系列的初始化过程,这个过程就是"vue的生命周期"

在vue一整个的生命周期中会有很多钩子函数提供给我们在vue生命周期不同的时刻进行操作, 那么先列出所有的钩子函数,然后我们再一一详解: beforeCreate 创建前 created 创建完毕后 beforeMount 挂载前 mounted 挂载完毕后 beforeUpdate 更新前 updated 更新完毕后 beforeDestroy 销毁前 destroyed 销毁完毕后

详解 1.创建阶段的生命周期(如果无法找到挂载对象将无法进入挂载阶段) 首先会判断对象是否有el选项,如果有的话就继续向下编译,如果没有el选项,则停止编译,也就意味着停止了生命周期! 验证测试: 注释掉 el: '#myView' 会发现执行到created之后就没有执行了,代表无法找到挂载目标

2.挂载阶段的生命周期 挂载前:不会载入数据绑定插值 挂载后:则载入数据绑定插值,并渲染到页面显示

3.更新阶段的生命周期 当vue发现data中的数据发生了改变,会触发更新,重新渲染页面, 先调用beforeUpdate,再调用updated

4.销毁阶段的生命周期 beforeDestroy钩子函数在实例销毁之前调用(注意!在这一步,实例仍然完全可用)。 destroyed钩子函数在Vue实例销毁后调用(调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁)。

拖动创建表 要有一个映射工具类

2种思路 1 根据用户拖动的字段和类型 动态产生sql语句 执行sql语句,创建表,通过表创建类 (指定数据类型,字段名称)

2 根据属性和类型 动态的产生一个java类 在由一个类产生一个表

springmvc 的底层原理

项目的技术

怎么生成验证码 整体的思路

首先 :验证码是从后端随机生成;【后端永远认为前端有可能被伪造】

后端调用第三方类库,或者是 平台php,.NET ,Java 系统核心绘图类库进行图片的绘制。
绘制的那些随机数字,字母都是后端预先设定好的。
将绘制的图片的url地址,通过网络返回给客户端,然后客户端=使用img标签来引用该地址。
后端在绘制完毕验证码之后,会把它保存在session中
当客户端输入验证码以后,会提交表单,后台服务器会拿到客户端提交过来的验证码与服务器端的session中的验证码进行比较。

arrayList怎么让他线程安全

你对于前后端分离的理解,为什么要实现前后端分离 ,有什么好处

为什么要前后端分离?

把前端与后端独立起来去开发,放在两个不同的服务器,需要独立部署。两个不同的工程,两个不同的代码库,不同的开发人员,前后端工程师需要约定交互接口,实现同步开发。开发结束后需要进行独立部署,前端通过接口来调用调用后端的API,前端只需要关注页面的样式与动态数据的解析和渲染,而后端专注于具体业务逻辑。

解耦

1、彻底解放前端。前端不再需要向后台提供模板或是后台在前端HTML中嵌入后台代。

2、提高工作效率,分工更加明确。前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的JSON文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。

3、局部性能提升。通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。

4、降低维护成本。通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。

5、实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。

6、即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。

7、可以使后台能更好的追求高并发、高可用、高性能,使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。

普通方法和静态方法的区别

1静态方法是类的方法,2可以通过类名调用,3静态方法不能直接调用实例方法,4是所有对象所有实例共享的方法

1实例方法不行,2要通过对象来调用 调用方式不一样3,实例方法可以调用静态方法,一个对象对应一个实例方法,互不干扰

1 调用方法不一样

2 数量不一样

3 加载时机不一样 一个类加载时就出现 实例是new对象时才有

4 (方法里才有的) 静态里面不能调用非静态 实例里可以调用静态

http和https协议

登录功能,登录后的状态保存了吗,保存在哪里

保存在session里面 session的特点,原理,页面不关闭,服务器端怎么知道是不是同一个人,服务器端怎么区别他们的身份

产生sessionId 说一下这个流程

方法1 保存session 当用户通过浏览器第一次访问这个这个资源的时候,服务器会产生一个session对象,f服务器通过cookie把sessionId发送给客户端,客户端会保存,每次在访问,页面会携带这个sessionId,服务器会对比sessionId,验证有没有,没有产生新的,有就认为访问过

方法2 保存redis

mysql数据库和redis数据库的区别

mysql是一个关系型数据库,mysql存的是一张张的表,表里面是字段,关系型数据库,数据保存在硬盘里的,可以通过sql语言操纵数据库

redis是一个缓存型的数据库 没有表,只有键值对, 是键值对缓存数据的,数据的存储类型不一样,存储可以设置有效时间,数据保存在内存里面,redis没有sql语言,不能通过sql语言操作数据库

登录的时候显示上一次登录的用户名和密码,是怎么实现的

限制登录次数,整体思路

线程的状态

线程之间的转化

线程创建调用start方法进入就绪状态

抢占到cpu资源进入运行状态,如果在这个时间片内执行完毕,线程结束

调用witer或sleep方法进入阻塞状态

如果阻塞状态被解除 ,线程进入就绪状态

为什么用连接池

防止一直创建连接关闭连接,减少开销

防止系统崩溃

序列化

把java对象转变为字符串的过程,为的是持久保存

把字符串还原成java对象

拦截器和过滤器的区别

拦截器拦截的是方法

请求先通过过滤器在通过拦截器

1.拦截器是基于Java的反射机制实现的,而过滤器是基于函数回调

2、拦截器不依赖于servlet容器,过滤器依赖于servlet容器

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

4、拦截器可以访问action的上下文,值栈里的对象,而过滤器不能访问

5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化的时候被调用一次

6、拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,可以在拦截器里注入一个service组件,可以调用业务逻辑。

ssm的工作流程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值