java工程师面试内容
2019-09-26 本文已影响0人
smallgrey
数据库相关:
- SQL中常用的函数;
count() sum() avg() max() if(e1,e2,e3) trim() lower() upper() now() (查询的是语句开始的时间)sysdate()(查询的是实时时间) - SQL中如何去重;
distinct - SQL中如何排序,如何分组
order by
group by - SQL中通过select * 与 select 全字段有什么区别
*需要查数据库字典找到表字段
全字段就不用了 - 如何进行多表连接
left join
inner join
right join - where 与 having 的区别
where是在结果返回之前起作用的,使用where中不能使用聚合函数
having 是在结果返回之后起过滤操作的,在having中可以使用聚合函数 - mysql的两个搜索引擎innodb与myisam的区别对比,以及事务的隔离级别
1) InnoDB支持事务,MyISAM不支持事务,当涉及到安全性的操作时,首选InnoDB
2)MyISAM适合查询插入为主的操作,并且执行大量查询的操作时,性能比较高,InnoDB适合频繁修改以及涉及到安全性比较高的操作。
3)InnoDB支持外键和行锁,MyISAM不支持外键,支持表级锁(读取时对所有表加共享锁,写入时对所有表加排它锁)
4)清空整个表时,innodb是一行一行的删除,效率低,myisam是重建表。
如果一定要用事务用innodb
如果对查询性能要求较高,用myisam - 数据库的一些代码操作
//在表中添加一列
alter table tb_test add gender varchar(2)
//修改表中一列的名字
alter table tb_test change gender sex
//删除表中的一列
alter table tb_test drop column gender
// 修改表中某一列的属性定义
alter table tb_test modify sex varchar(2)
//对于已经存在的表建立索引
alter table tb_test add index sindx (id,name,age);
//存储过程 批量插入数据
create PROCEDURE batch_insert()
BEGIN
DECLARE a int DEFAULT 1;
while (a<=10000) DO
set a = a + 1;
insert into tb_test set name = 'name2',age = a,id = a + 5;
end WHILE;
COMMIT;
END;
call batch_insert();
//用explain查询select的执行计划,看是否使用索引
explain select id,name,age,sex from tb_test where id = 17#使用索引一个
explain select id,name,age,sex from tb_test where name='jack'; # 不使用索引
explain select id,name,age,sex from tb_test where id = 17 and name='jack'; #使用索引前两个
explain select id,name,age,sex from tb_test where id = 17 and name='jack' and age = 18;#使用索引三个
explain select id,name,age,sex from tb_test where id = 17 and age = 18 # 使用索引一个
explain select name from tb_test where name='jack';#使用索引全部(查询的是单个在复合索引中的字段)
java相关:
- list删除第一个元素
remove() - java的特性
封装,继承,多态 - 重写与重载的区别
重写是子类与父类之间的多态,重载是方法之间的多态 - 抽象与接口的区别
抽象用来继承,接口用来实现
抽象类中可以有普通的方法,接口中不能有普通的方法 - == 与 equals的区别
== 用来比较引用的地址
equals用来比较值内容 - 如何判断一个String类型的变量是null 或者是空的 用if()
判断字符串是否为null "".equals("string") 将字符串转为char数组,判断length string.isEmpty() - hashMap 如何查询所有的key和value值
通过iterator迭代查询Map map = new HashMap(); Iterator it = map.entrySet().iterator(); while(it.hasNext()){ Map.Entry entry = (Map.Entry)it.next(); Object key = entry.getKey(); Object value = entry.getValue(); }
- mybatis中如何传递参数
1,顺序传参 sql中用#{0} #{1}来接收
2,@Param传参
3,Map传参法
4,Java Bean传参法 - 为什么有GC回收装置,还会出现内存溢出?
内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式 - HTTP与TCP的区别
- linux常用的命令
答:ifconfig(查询IP地址)
pwd(查询当前目录)
cat(显示文件内容)
mkdir(创建文件夹)
source .bash_prodile(使修改的文件失效)
vim(进入编辑模式) wq!(推出编辑模式并保存)
rm -rf(删除文件夹)
cp(复制)
ps (查进程)
find (找文件)
which() - 查找一万条手机号码中的重复手机号
答:通过循环list将list中的值放入hashmap中,手机号作为key值,如果map中没有就放入map中value值设为1,如果有就放到一个新建的list中 - VUE架构
- 千万级别的数据库,如何优化
- 在A表中有ID,name,age如何选择出那个年龄的人数最多不能用order by
select b.age,b.counts from (select age,count(age) as counts from tb_test GROUP BY age) b where b.counts = (select max(b.counts) from (select count(age) counts from tb_test group by age) b);
17.Java中如何实现重写,并简述重写在编译时与运行时的调用过程。
答:
集合相关:
- Java里面的容器分两大类Collection和Map,而Collection又有子接口List(数据存储顺序和插入顺序是一样的)、set(里面的元素具有唯一性)
Map是存储键值对的,里面的键不可以重复,但是值可以重复
对于List主要有Arraylist和linkedList两种实现,实现的数据结构不同,所以主要的区别也就是和数据结构相关。Arraylist基于数组,随机访问快,而对于中间元素的插入删除效率低,因为要移动数据,而且需要考虑扩容的问题。linkedlist则基于链表的,和arraylist正好相反。
set也是collection,和list比起来主要体现在元素的唯一性。 - iterator的作用
iterator可以实现collection接口的方法,可以一个一个获取集合中的元素 - 说一下ArrayList与LinkedList的区别和联系,以及什么时候使用?
联系:都是list接口的实现类
区别:实现机制不同一个是数组,一个是链表
当要快速获取一个值时,用ArrayList,当用与顺序插入操作时用Linkedlist - list,set,map的特征
list中的元素可以重复
set中的元素不可以重复
map中的key不可以重复,value可以重复 - hashset和treeset有什么区别,什么时候用它们
HashSet中的元素不能重复,没有顺序
TreeSet中的元素不可以重复,但是有顺序
当集合中的元素需要排序的时候用TreeSet
一般情况下用HashSet,因为不需要排序,速度比TreeSet快
6.什么是泛型,怎么使用,有什么好处?
定义一个集合时,可以知道里面定义的是什么类型。
集合前面用大于小于号括起来
使用泛型后,集合中取得的元素就不用强转了
7.强转怎么转,一般多用还是少用,为什么?
强转一般在继承的基础上用,一般是小范围转大范围,子类转父类,反之则不行,需要使用强转
Person person = new Student();
Student student = (Student)person;
把运行期的强转为编译期的。
编译期不会出错,运行期容易出错,所以一般少用。
8.Collection与Collections的区别
Collections是一个工具类,可以直接调用List和Set的方法
Colelction是一个接口,是List和Set集合的父接口
9.Collections的6个方法
sort()
addAll()
max() min() copy()
10.Arrays类是干什么的?
Arrays是数组的一个工具类
11.比较一下集合和数组的优缺点
集合是多个对象的容器,可以将不同的数据类型放到集合里面, 数组放的是统一类型的数据
12.如何对一个对象排序,有几种方法。
答:1.把对象放入list集合中,用Collections工具类,调用sort方法进行排序,但是这个对象必须实现Comparable接口
2.把对象放到set集合中,用TreeSet()实现类对集合直接排序
13.在集合里怎么判断两个对象相等,用equals。
14.怎么样把集合转数组,怎么把数组转集合
答:把集合转为数组,可以用list.toArray()方法
把数组转为集合时,用Arrays.asList()方法
15.分别写出List,Set,Map里面的5个常用方法
答:List add(),clear(),contains(),indexOf(),set()
Set add(),clear(),contains(),remove(),size()
Map containsKey(),containsValue(),keySet(),put(),remove()
16.HashMap怎么实现有序
答:可以转化放入TreeMap
17.去掉List中的重复数据
放到HashSet中
spring相关:
- spring的隔离级别
使用后端数据库默认的隔离级别
未提交读
已提交读
可重复读
可串行化
mybatis相关:
- 一二级缓存
mybatis的一级缓存是默认缓存,其存储的作用域为session,当session flush或者close之后,给session所有的cache就将清空。
二级缓存的存储作用域为Mapper(Namespace)并且可以自定义存储源,要开启二级缓存需要实现serializable序列化接口(可用来保存对象的状态),可在它的映射文件配置。
对于缓存数据更新机制,当某个作用域进行c/u/d 的操作后,所有的select中的缓存都将被clear - spring + mybatis如何插入一万条数据
- mybatis中的> 与 < 号怎么写
“>“ “<” - mybatis的工作原理
1.将mybatis-config.xml文件转换为inputstream流文件
2.从inputstream中解析出configuration对象,创建sqlSessionFactory工厂对象
3.然后调用openSession创建SqlSession对象
4.从SqlSession中调用execute执行数据库操作并生成具体的sql指令
5.提交事务
6.关闭SqlSession
SpringMVC:
- 如何进行分页
1,通过sql语句的limit 进行分页
2,全部查询出来根据页面返回的参数对数据进行截取,显示到页面
3,通过RowBounds对象进行分页。 - SpringMVC的工作流程:
1.客户端发送请求到dispatcherServlet
2.dispatcherServlet接到请求后代用HandlerMapping处理器映射器
3.处理器映射器找到具体的处理器,生成处理器对象以及处理器拦截器一并返回DispatcherServlet
4.DispatcherServlet调用HandlerAdapter处理器适配器
5.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewResolver视图解析器
9.ViewResolver解析后返回view
10.DispatcherServlet根据View进行渲染视图
11.DispatcherServlet响应用户。
注意,处理器映射器,处理器适配器,视图解析器称为springmvc的三大组件
springboot
- springboot常用的注解
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration 自动导入
@ComponentScan
@value注解来读取application.properties里面的配置 - springMVC常用的注解
@RequestMapping
@Controller
@autowired
@Resource
@Service - 简单介绍一下springboot
答:springboot就是简化spring应用程序的初始搭建以及开发过程,用特定的方式来进行配置,使开发人员不需要定义样版话的配置,通过自动配置和默认的设置可以让开发人员,快速的开发应用。 - springboot的优点
答: 减少开发,测试时间。
使用JavaConfig有助于避免使用XML
避免大量的maven导入和各种版本冲突
通过默认值快速开发
没有单独的web服务器需要
需要更少的配置因为没有web.xml文件。只需要添加用@Controller注释的类,然后添加用@Bean注释的方法,Spring将自动加载对象并进行管理。- 什么是JavaConfig
答:Spring JavaConfig是Spring社区的产品,他提供了配置SpringIOC容器的纯java方法。
优点:面向对象的配置。由于配置被定义为javaconfig中的类,因此用户可以充分利用java中的面向对象的功能。一个配置类可以继承另一个,重写他的@Bean方法等。
减少或消除XML配置。
- 什么是JavaConfig
- 如何在自定义的端口上运行Spingboot应用程序,在application.properties中指定端口。server.port = 8090
- 如何使用Springboot实现分页和排序?
答:使用spring-data-jpa可以实现将可分页的org.soringframework.data.domain.Pageable传递给存储库的方法。 - springboot的核心配置文件有哪几个?他们的区别?
答: application与bootstrap
application主要用于springboot项目的自动化配置
bootstrap配置文件有以下几个应用场景
使用springcloud Config配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息。
一些固定的不能被覆盖的属性,
一些加密、解密的场景 - springboot的配置文件有哪几种格式?他们有什么区别
.properties
```
app.user.name = javastack
```
.yml
```
app:
user:
name:javastatck
```
.yml格式不支持@propertySource注解导入配置。
vue
redis
- redis是一种高级的key:value存储系统,其中value支持五种数据类型:
字符串(strings),字符串列表(lists),字符串集合(sets),有序字符串集合(sorted sets),哈希(hashs)
关于key,可以不要太长,不要超过1024字节,要不然会消耗内存,而且会降低查找的效率;可以也不要太短,太短的话,可读性会降低;在一个项目中最好统一的命名模式。