中级java面试总结

170 阅读7分钟

一、首先是常用的框架使用

1 什么是springboot ?

用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)

创建独立的spring引用程序 main方法运行 

简化maven配置 

自动配置spring添加对应功能starter自动化配置 

=========简单说就是:快速搭建、开发和运行Spring应用

2 Springboot 有哪些优点?

-快速创建独立运行的spring项目与主流框架集成 

-使用嵌入式的servlet容器,应用无需打包成war包

-starters自动依赖与版本控制 

-大量的自动配置,简化开发,也可修改默认值 

-准生产环境的运行应用监控 

-与云计算的天然集成

3.SpringCloud 和 Dubbo 有哪些区别?

首先,他们都是分布式管理框架。

最大的区别:

Spring Cloud是基于HTTP的REST方式 ;Dubbo 的是RPC通信。

4.SpringBoot 和 SpringCloud 之间关系? SpringBoot:专注于快速方便的开发单个个体微服务(关注微观);SpringCloud:关注全局的微服务协调治理框架,将SpringBoot开发的一个个单体微服务组合并管理起来(关注宏观);

SpringBoot可以离开SpringCloud独立使用,但是SpringCloud不可以离开SpringBoot,属于依赖关系。

5.什么Docker Docker是一个容器化平台,它以容器的形式将所有应用程序及其所有依赖项打包在一起,以确保所有应用程序在任何环境中无缝运行。

6.什么是Docker镜像 Docker镜像是Docker容器的源代码,Docker镜像用于创建容器。使用build命令创建镜像。

7.docker常用命令 docker pull 拉取或者更新指定镜像 docker push 将镜像推送至远程仓库 docker rm 删除容器 docker rmi 删除镜像 docker images 列出所有镜像 docker ps 列出所有容器

RPC的详细过程

RPC主要的重点有: 动态代理,主要是invoke反射原理 序列化,使用Thrift的效率高 通信方式,使用Netty的NIO能提高效率 服务发现,使用zookeeper可以实现

二、几种重要的接口和类简介

1、List(有序、可重复) List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。

2、Set(无序、不能重复) Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

3、Map(键值对、键唯一、值不唯一) Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。

5.ArrayList和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以索引数据快,插入数据慢,Vector由于使用了(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快。

6.arraylist和linkedlist 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

HashMap与TreeMap 1、 HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序

7.mycat是怎样实现分库分表的?

mycat里面通过定义路由规则来(路由规则里面会定义分片字段,以及分片算法)。

8.主从复制机制的原理概述是怎样的?常见的存在形式有哪些?

答:mysql主从复制是master将所有的事务操作写入到binlog,slave获取binlog读入自己的中继区,然后再进行执行。

9.分库分表中解释一下垂直和水平2种不同的拆分?

答:垂直拆分:是将单表,或者是有关联的表放在一个数据库,把原有的一个数据库拆分成若干个数据库。 水平拆分:是将一个很大的表,通过取模,按照日期范围等等拆分成若干个小表

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间

三、基础部分:

  1. 基本数据类型的大小,以及他们的封装类。

byte(Byte) 1 ,short(Short) 2 ,int(Integer) 4 ,long(Long) 8 ,float(Float) 4 ,double(Double) 8,boolean(Boolean),char(Character)

  1. Switch能否用string做参数?

switch语句中的变量类型可以使byte,short,int,char。从jdk1.7后可以使用String类型,是通过switch中的String.hashcode将String转换成int进行判断的。

  1. equals与==的区别。

==操作符是用来比较两个变量的值是否相等,即就是比较变量在内存中的存储地址是否相同,equals()方法时String类从Object类中继承的,被用来检测两个对象的内容是否相同。

  1. Object有哪些公用方法?

clone() 克隆此对象的副本

equals()判断

getclass()返回object的运行类

hashcode()返回对象的哈希码值

notify()唤醒正在等待对象监听器的单个进程

notifyAll()唤醒正在等待对象监听器的所有进程

wait()导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。

toString()返回此对象的字符串表示形式

finalize()当垃圾收集确定不需要该对象时,垃圾回收器调用该方法

5.静态变量和实例变量的区别

静态变量前要加上关键字static,实例变量则不会。静态变量不需要创建任何的对象就可以直接使用,而实例变量需要先创建实例对象才能被使用。

6.Overload和Override的区别:

重载Overload表示的是同一个类中可以有多个相同名称的方法,但这些方法的参数列表不同

重写Override表示子类中的方法可以与父类中的方法名称和参数完全相同,即就是子类中的该方法将父类的该方法覆盖了

7.抽象类和接口的区别

抽象类可以有默认的方法进行实现,可以有构造器,可以有main方法进行运行,可以直接在该类中添加实现的方法

接口没有默认的方法进行实现,没有构造器,不可以使用main方法进行运行,在接口中添加方法时需要在具体实现的类中添加方法。

8.Java中final、finally和finalize的区别、

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。

9.创建线程池的4种方式。

1、newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作。如果这个唯一的线程因为异常结束,就会有一个新的线程来代替它

2、newFixedThreadPool:创建一个固定大小的线程池。

3、newCacheThreadPool:创建一个可缓存的线程池。

4、newScheduledThreadPool:创建一个大小不限的线程池

10。wait方法和sleep方法的区别。

sleep是线程类Thread的方法,wait是Object类的方法