Java面试题

  1. 三次握手,四次挥手中,为什么要挥手四次

第一次握手,客户端发送同步报文到服务端,客户端知道自己有发送数据能力,不知道服务端是否有发送、接受数据能力。

第二次握手,服务端收到同步报文,并回复确认同步报文,此时,服务端知道自己有接收、发送数据能力,并且客服端有发送数据能力,但不知道客户端是否有接收数据能力。

第三次握手,当客户端收到确认同步报文后,知道服务端具备发送、接收能力,也知道自己具备,但是服务端只知道客户端具备发送能力,还不知道也有接收能力,所以需要发送确认报文,告诉服务端自己具备接收能力。

第一次挥手客户端发起关闭连接的请求给服务端;

第二次挥手:服务端收到关闭请求的时候可能这个时候数据还没发送完,所以服务端会先回复一个确认报文,表示自己知道客户端想要关闭连接了,但需要等待数据传输完;

第三次挥手,当数据传输玩,服务端会主动发送FIN报文,告知客户端,标识数据已发送万传给你,服务端准备关闭连接了。

第四次挥手,当客户端收到服务端的FIN报文后,会回复ACK报文,告知服务端自己知道了,在等待一会就关闭连接。

为什么握手三次,挥手却要四次?因为服务端的SYN和ACK报文可以一起发送,但是挥手时有数据传输,ACK和FIN报文不能同时发送,需要分为两步,所以多了一步流程。就是挥手的第二次挥手时候没有发送

  1. LinkedList和ArrayList的去重方法

第一种:通过LinkedHashSet来解决,LinkedHashSet是有序不可重复的,可以把ArrayList传入LinkedHashSet中

 第二种:使用Java8的新特性stream的distinct()方法来实现

第三种:使用contains()方法去重

第四种: 利用HashSet(无序唯一)的特性

  1. mysql事务的执行流程
  1. 开启事务:记录回滚点,并通知服务器,将要执行一组操作,要么同时成功、要么同时失败
  2. 执行sql语句:执行具体的一条或多条sql语句
  3. 结束事务(提交|回滚)
    1. 提交:没出现问题,数据进行更新
    2. 回滚:出现问题,数据恢复到开启事务时的状态

  1. 对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?

根据查询字段的位置不同来决定,如查询a,     a,b    a,b,c    a,c   都可以走索引的,其他条件的查询不能走索引。

组合索引 有“最左前缀”原则。就是只从最左面的开始组合,并不是所有只要含有这三列存在的字段的查询都会用到该组合索引。

  1. 如何创建索引
  1. 写sql创建

sql范本:create index 索引名称 on 表名(字段名);

sql示例:create index index_user_name on PROMULGATE_CERT(user_name);

  1. 使用数据库工具创建

手动创建索引

  1. 造轮子还是用轮子

我认为用轮子更好,因为程序员流传着一句话,不要重复造轮子,就是无意义的事情可以不做,当然以后学了更多的技术后,还是要专研更好的技术,尝试造轮子,像尤雨溪一样写出优秀的vue框架

  1. mybatis的批量操作

1.foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach标签的属性主要有item,index,collection,open,separator,close。

2.Mybatis内置的ExecutorType有3种,默认为simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优;但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,在某些情况下不符合业务的需求。

8.抽象类和接口的区别

1.抽象类允许包含某些方法的实现,而接口是不允许的;从设计级别看,为了实现由抽象类定义的类型,一个类必须定义为一个抽象类的子类,这限制了它在类图中的层次,但是接口没有这个层次的限制。

2.在抽象类中提供成员方法的实现细节,该方法只能在接口中为 public abstract修饰,也就是抽象方法。

3.抽象类中的成员变量可以实现多个权限 public private protected final等,接口中只能用 public static final修饰。

9.介绍一下你最近做的一个的项目?

10.

  1. 同一个事物,多个人操作
  2. SSM整合

SpringMVC:SpringMVC框架位于Controller层,主要为接收用户发起的请求,在接收请求后可进行一定处理(如:通过拦截器的信息验证处理)。在通过处理后SpringMVC会根据请求的路径将请求分发到对应的Controller类中的处理方法。处理方法再调用Service层的业务处理逻辑。

Spring框架:Spring框架在SSM中充当类似与粘合剂的作用,利用其对象托管的特性将SpringMVC、MyBatis两个独立的框架有机的结合起来。 Spring可将SpringMVC中的Controller类和MyBatis中的SqlSession类进行托管,简化了人工管理过程。 Spring除了能对SpringMVC和MyBatis的核心类进行管理外,还可对主要的业务处理的类进行管理。

MyBatis框架MyBatis框架应用于对数据库的操作,其中主要功能类SqlSession可对数据库进行具体操作。

2.SSM框架中的容器管理

**SpringMVC容器:**主要对Controller控制器对象,视图等用户请求和请求结果进行管理。

**Spring容器:**主要对Service、Dao、工具类等对象进行管理。

**两个容器的关系:**SpringMVC容器为Spring容器的子容器,进而两容器中的对象进行间接管理。

  1. 如何保证用户模块的数据安全?

可以使用加密算法,

  1. 对称加密算法

加密和解密使用相同的密钥。对称加密算法加密解密速度快,但安全性较差
常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES

  1. 非对称加密算法

加密和解密使用不同的密钥,也称为公私钥加密。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。但安全性比对称加密算法高

常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

  1. hash算法

Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。Hash算法常用在不可还原的密码存储、信息完整性校验等

常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1

加密算法会生成密钥,token就是临时令牌,也就是密钥,Token是由字符串组成的是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。

jwt是token的一种实现方式,它将用户信息加密token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

  1. String的常用方法

1.求字符串长度 public int length()//返回该字符串的长度

2.求字符串某一位置字符
public char charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。

3.提取子串
用String类的substring方法可以提取字符串中的子串,该方法有两种常用参数:
1)public String substring(int beginIndex)//该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
2)public String substring(int beginIndex, int endIndex)//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。

4.字符串比较
1)public int compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前
字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
2)public int compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
3)public boolean equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
4)public boolean equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。

5.字符串连接
public String concat(String str)//将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。

6.indexOf索引

7.字符串中字符的大小写转换
   1)public String toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
   2)public String toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串

8.字符串中字符的替换
   1)public String replace(char oldChar, char newChar)
   //用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。

  1. Mysql百万级的数据迁移方案

小数据量可以使用mysqldump命令进行导入导出,这种方式简单便捷。数据量较大,且有足够的迁移耐心时,可以选择自己写脚本,选择合适的并行方案迁移数据,这种方式编码成本较高。数据量较大,且希望能在短时间内完成数据迁移时,可以通过mysql导入导出文件的方式来迁移,这种方式效率较高。

  1. Spring MVC传递接收参数的几种方式

一、通过实体Bean接收请求参数bean对象

@RequestMapping("/login")

public String login(User user, Model model) {    

二、通过处理方法的形参接收请求参数单个属性

通过处理方法的参数接收请求参数,就是将表单参数直接写入控制器类对应方法的参数中,即参数名称与请求参数名称完全相同。 接收参数模式适用于GET和POST提交请求

@RequestMapping("/login")

public String login(String name, String pwd, Model model)

  • 通过HttpServletRequest接收请求参数

@RequestMapping("/login")

public String login(HttpServletRequest request, Model model) {

  • 通过@PathVariable接收URL中的请求参数

@RequestMapping("/login/{name}/{pwd}")

public String login(@PathVariable String name, @PathVariable String pwd, Model model) {

  • 通过@RequestParam接收请求参数

@RequestMapping("/login")

public String login(@RequestParam String name, @RequestParam String pwd, Model model) {  

六、通过@ModelAttribute接收请求参数

@RequestMapping("/login")

public String login(@ModelAttribute("user") User user, Model model) {  

  1. java单例模式之懒汉式与饿汉式

饿汉式:线程安全在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。

空间换时间

1.创建一个类 然后对类里面的构造器进行私有化 目的:防止外面调用该类创建对象 无法实现单例

2.一开始先创建一个静态对象 目的:这个对象就是单例

3.创建一个pubilc静态方法来返回对象,供外面调用该对象

懒汉式: 当程序第一次访问单例模式实例时才进行创建。

时间换空间

1.创建一个类 并将构造器设置为私有的 目的:防止外面的对象去调用 无法弄成单例模式

2.声明一个静态对象 但是没有初始化  等到要使用的时候再去初始化对象 避免占用内存空间

3.提供一个public static 方法供外面调用


区分饿汉式和懒汉式水
饿汉式:
坏处:对象加载时间过长。
好处:饿汉式是线程安全的

懒汉式:好处:延迟对象的创建。
坏处:线程不安全--->到多线程内容时,再修改

  1. IOC的注入方法
  1. set方式注入

2.构造函数注入

3.注解注入

  1. 基本数据类型,引用数据类型放在同一个对象,使用是值还是地址

使用的是地址,因为对象访问是访问地址,地址相同就是同一个对象

  1. 为什么使用SpringBoot ?

1.遵循约定优于配置的原则 ;零配置,无冗余代码生成

2.提供starter POM,高效包管理; 集成了大量常用的第三方库的配置

3.简化配置,无需XML ;

4.内嵌servlet容器 ;

5.与主流框架集成简单。Spring Boot 依赖 Spring 框架来管理对象的依赖spring框架是通过ioc机制来管理bean的

  1. Redis的五大数据类型

1.string 2.hash 3.list 4.set 5.zset

  1. HashMap的两种取值方式

Map的两种取值方式keySet、entrySet
keySet
先获取所有键的集合, 再根据键获取对应的值。(即先找到丈夫,去找妻子)
entrySet
    先获取map中的键值关系封装成一个个的entry对象, 存储到一个Set集合中,再迭代这个Set集合, 根据entry获取对应的key和value。
  向集合中存储自定义对象 (entry类似于是结婚证)

 HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。

  1. Java中解决跨域的几种方法
  1. 使用注解 `@CrossOrigin`,标注在controller类的方法上或者controller类上
  2. crosFIlter
  3. WebMvcConfigurer

  1. HashMap的put方法key值可以重复嘛

Key可以重复 value不能重复,键和值可以为空

  1. MyBatis怎么寻找SQL语句
  • 获取映射文件xml

二、解析mapper文件,并获取内容

三、得到SQL语句

四、对SQL语句的处理

  1. spring,springboot,springmvc的关系和区别

Spring包含springmvc,springboot是在spring的基础上进行的扩展,关系大概是springmvc<spring<springboot,springboot对比spring的优点有:1.提供嵌入式容器支持,2.使用命令java-jar独立运行jar,3.在外部容器中部署时,可以选择排除依赖关系以避免潜在的jar冲突,4.部署时灵活指定配置文件的选项,5.用于集成测试的随机端口生成

  1. Tomcat和Nginx和apache的关系和区别
  1. nginx主要用于做静态内容服务和代理服务器,直接将外来的请求转发给后面的应用服务器,tomcat更像是一个应用容器
  2. Apache是一个同步多进程模型,是可以一个连接对应一个进程,而nginx属于异步的,多个连接可以对应一个进程,nginx轻量级,抗并发,处理静态文件好,apache稳定性好,对php支持比较简单,nginx还需要配合其它后端进行使用,处理动态请求上更有优势
  3. Apache由c语言实现,支持各种特性和模块从而拓展核心功能,tomcat是由java实现,可以更好的支持servlet和jsp,apache也是普通的服务器,本身只支持html静态网页,不过可以通过插件来支持php等,tomcat是servlet/jsp容器,支持html,jsp,asp,php,cgi等,apache更侧重于http server,tomcat侧重于servlet引擎
  1. Java和JavaScript的区别
  1. java是强类型语言,使用变量时必须在程序中声明,在java中,编译会检查变量的类型。javascript是弱类型语言,有更宽松的语法和规则
  2. 数据类型不同,java有八种数据类型是byte,short,int,long,float,double,boolean,char,javascript有三种数据类型是number,string,boolean
  3. 执行环境不同,java在jvm或web浏览器中运行,执行时会使用更多内存,javascript仅在浏览器上运行,运行时只需要很少的内存
  4. 定位不同,java是一种面向对象的oop编程语言,要设计对象,JavaScript是基于对象的oop脚本语言,他为开发者提供了很多自带的内部对象,更为简单省时
  5. 联编方式不同,java采用静态联编,是一种静态类型语言,java的对象引用必须在编译时就进行,编译器需要实现强类型检查,JavaScript使用动态联编,是一种动态类型语言,它的对象引用可以在运行时检查
  6. 并发方法不同,java是一种基于线程的并发方法,JavaScript具有基于事件的并发方法
  1. 对springboot的原理有了解吗

Springboot是有自动配置和启动器和大量注解实现的,主要是先执行springboot项目,然后使用注解@springbootapplication,进行自动配置,然后执行@enableautoconfiguration注解扫描当前启动注解的class对象作为root目录,然后使用@aotoconfigurationpackage主要是将registrar类导入容器中,registar类的作用是扫描主配置类同级目录以及子包,并将相应的组件导入springboot创建管理的容器中,最后是@import(aotoconfigurationimportselector.class)导入到容器中,使用内部工具类进行加载,实现将配置类信息交给springfactory加载器进行一系列的容器创建过程

  1. java数据结构

八种,哈希表(hash),队列(queue),树(tree),堆(heap),数组(array),栈(stock),链表(linked list),图(graph)

  1. ioc和aop是什么

Ioc是控制反转,底层是基于自定义注解和反射实现的,ioc是不通过new关键字来创建对象,而是通过ioc容器来帮助我们实例化对象,ioc的作用是降低耦合,aop是面向切面编程,底层是反射执行流程是先调用getbean,然后看有没有被aop切面切中,如果没有就返回原类,有就判断是否实现了接口,有就是jdk动态代理对象,没有就是cglib动态代理对象

  1. 利用接口做参数,写个计算器,能完成加减乘除运算

(1)定义一个接口IComputer含有一个抽象方法int computer(int one, int two),其中参数one和two分别为参与运算的操作数1和操作数2(按先后顺序)。

(2)设计四个类Add类、Sub类、Mul类、Div类,分别实现IComputer接口,完成加、减、乘、除运算。

(3)设计一个类UseComputer,类中含有方法:

public static void useCom(IComputer com, int one, int two)

(4)调用UseComputer中的方法useCom来完成一组键盘输入数据的加减乘除运算。

  1. 鸽子猫头鹰飞机,利用抽象类和接口
  2. list 去重的方式

1.使用LinkedHashSet删除arraylist中的重复数据

2.使用java8新特性stream进行List去重

3.利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件保证顺序:

4.利用List的contains方法循环遍历,重新排序,只添加一次数据,避免重复:

5.双重for循环去重

35.springboot的核心注解

有@springbootapplication是最核心的注解,是配置类,然后是@enableautoconfiguration是自动装配,然后是@autoconfigurationpackage是自动导包,封装了很多包,然后是@import(autoconfigurationimportselector.class)

36.数据库的几种索引

37.如何实现序列化

38.java中有哪些容器

39.数据库事务的隔离级别

  1. springboot的热部署的三种方式
  2. Mybatis一级缓存二级缓存
  3. Hashmap和hashtable的区别
  4. 动态代理和静态代理的区别
  5. arraylist和linkedlist的区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值