Java后端面试总结

前序

今天去面了几家公司,主要是Java后端的,有个公司问的东西真的是蛮多的,这里记录一下印象深一点的问题吧。

Java基础

  1. int、byte、char各占几个位?
    注意这里说的不是字节,问的是bit位。
    我当时就说int 4个字节,byte 1个字节,char 2个字节。
    每个字节又是8位,各再乘以8就好了。结果那面试官居然还说1个字节是4位,当时我都懵了。回来查查资料发现,我才是对的。1个字节就是8位。。。

    参考资料:
    https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  2. 一个Map集合是否有方法可以直接取出所有的value,也就是说不通过keySet()entrySet()等间接的方式?
    我当时说没有,他就给我举出一个方法了,values()。。。事实证明确实是有这个方法的,只不过我们一般用的很少。

  3. 设计模式,单例手写就不多说了,太简单。

  4. 一个List集合如何不再添加重复的元素进去?
    在添加的时候,通过if(!lsit.contains())进行判断就行了,结果引出新的问题,是如何判断两个对象是相同的?我接着说重写类的equals()hashCode()方法即可,因为其底层就是通过equals()进行比较的。
    然后接着问,重写equals()方法,为什么还要重写hashCode()方法呢?我就直接说Java官方规定的。。其实这个也是一个约定的事情,可以查看Object类中的javadoc文档说明。

    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

在重写equals()时也必须要重写hashCode()方法,以保证相同对象的hash值也是一样的,否则会出现意想不到的问题的。不明白他为啥要一直追问这个,哎。最后网上在搜了一下资料,说是:
如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()

Java基础就到这里吧,当然还问其他很多基础问题,不过在这里就不一一说明了。

Java后端框架

因为我说自己用SpringMVC比较多,所以他们问的问题也大都跟这个相关,当然也会结合简历问一些其他方面的问题,下面再说一说。

  1. SpringMVC有哪些常用注解?
    比较常用的有:@Controller、@Service、@Repository、@Bean、@RequestMapping,@Autowired、@Resouce、@ResponseBody、@RequestBody等等还有很多,这里就不一一列举了。

  2. 如何获取在@RequestMapping注解中定义的变量?
    这个在RESTFul风格中比较常见,在方法的参数中再加@PathVariable(“var”)参数即可。

  3. 如何在Controller中获取request请求的变量,非RESTFul那种拼接的参数?
    可以直接在方法参数中,添加HttpServletRequest参数变量就行,然后根据req的getParameter(“var”)获取相应的参数。

  4. 在SpringMVC中如何通过工厂方法来创建一个bean?
    这个用的好像比较少,不过我当时还真想起来了。直接在sprign配置文件中的bean中就有一个属性叫:factory-method

  5. 在使用Hibernate框架时,除了HQL还有什么方式可以查询数据?
    这个我当时说的是Criteria,这个单词不太好读,我当时也没读正确读全,不过大家都知道是啥意思就好啦。它是采用面向对象的方式封装了查询条件。其实还可以直接用Hibernate的session的,当时紧张所以忘了。为啥紧张是因为我瞎说了一个JPA。。通过jpa去操作查询,结果就是被教训一顿了,JPA是Java的持久化规范没错,不过跟人家Hibernate真没太大关系,虽然Hibernate也实现了JPA的规范。。。

  6. struts2与struts1有什么区别?
    额,struts框架我在项目中还真没用过,也就自己学了点,结果就大摇大摆的也加在简历上,结果一问就露馅了吧。后悔,以后不太熟的东西最好不要加在简历上吧,不然就等着减分吧。至于到底有哪些区别,在网上查一查一大堆,这里就不多说了。

好了,后面的框架知识问得我也是泪流满面,就不多说了。

数据库

数据库可以说在后端中是重之又重了,可惜我还没有达到熟练精通的地步,也就初学者一个吧,结果几个问题下来直接就over了。。
1. 数据库一般有哪些优化?
我当时说的是给表字段加索引、拆分表、避免少用子查询多用连接查询等等常见的操作吧。
2. 如何优化一条SQL语句,有什么关键字可以用?
当时我就想到explain这个,应该算是正确的吧。
3. 常用的日期字段有哪些?
一般常用的就datetimetimestamp这两种吧。
4. 如何给查询出来的日期进行加一天操作?
额,这个我忘记了,记得有一个函数的,当时没想起来。查了查就是叫date_add(),把查询出来的日期结果放到函数的参数中就行了。
date_add(my_date, INTERVAL 1 day)

数据库相关的还有待加强啊,继续努力。

Linux

作为Java后端开发,Linux可以说是必须要掌握的吧,毕竟开发的软件都是要运行在服务器上的,现在服务器差不多80-90%都是Linux操作系统了,所以简历上肯定也是要写这方面的东西的。

  1. 如何在重启开机的时候自动将应用容器如:tomcat启动?
    直接编辑/etc/rc.local文件,在最后一行exit 0前面加一句${TOMCAT_HOME}/bin/startup.sh就行了,TOMCAT_HOME变量可替换为安装的路径,当然了,如果是直接通过apt-get安装的话,它会自动添加到systemd中的,这样的话通过# systemctl enable tomcat7也可以做到开机自动启动的。

差不多就到这里吧,太多就不想看了。
最后一个问题就是:最近有没有研究什么比较新的技术?
我当时说的是Docker,其实这个也不算新吧,2013年的时候就非常火了,不过那时候连大厂都还只是停留在研究状态,别说直接在生产环境使用了,技术也还没稳定下来。随着这两年过来,逐渐的用的公司才多一点的。我也是在去年就开始学习那个。今年一直也没怎么搞,看样子需要再捡起来了。

总结

这次面试,可以说是我经历过所有面试中,问的最多,最全面的了。对人员的综合要求挺高的,面试官总的来说也很nice。通过这次面试我也发现了自己严重的不足。许多的知识都还停留在非常表面的层次,没有一点稍微深入的地方。这也是没办法的事情啊,谁让咱本来就是半路出家,而且还是搞Android出身。。积累啊积累,万里长征路漫漫。

你可能感兴趣的:(职场)