记录某公司(简称SMKJ) 的一次面试

昨天去了一家公司面试 Java 开发岗位,这篇文章主要是做一个面试的记录以及总结。

这家公司的规模大概100-200人,环境还可以,在一栋大厦租了两层办公室(31层和32层)。一同搭电梯上去的还有一位去应聘测试岗位的妹纸🙂

这里要吐槽一下该公司的前台,由于跟HR约好了是在31楼面试,我和测试妹纸都去了31楼的前台,31楼的前台直接让我们去楼上找32楼的前台,32楼的前台找了楼下31楼的面试官,结果又把我们带回楼下31楼面试。

首先填了一份个人信息表,然后直接进入面试环节(没有笔试 🙃)。

以下是面试时一些问题的记录:

1、面向对象的三大特性

答:封装、继承、多态。

2、XML解析

答:
1、解析方式

  • DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种标准方式。

缺点:必须读取整个XML文档,才能构建DOM模型,如果XML文档过大,造成资源的浪费。
优点:适合对XML中的数据进行操作(CRUD)。

  • SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。

2、解析工具

  • JAXP:

DOM或SAX方式进行解析XML。API在JDK之中。

  • Dom4J:(推荐)

是开源组织推出的解析开发包。(牛,大家都在用,包括SUN公司的一些技术的实现都在用)

3、反射

答:当我们的程序在运行时,需要动态的加载一些类,这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻。

举个例子,我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!

举多个例子,大家如果接触过spring,会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

4、Java 8 新特性

  • Lambda 表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

  • 方法引用:方法引用提供了非常有用的语法,可以直接引用Java的类方法、对象方法或者构造器。

5、Lambda 表达式

Lambda 表达式我们可以理解为对于函数式接口和其中的抽象方法的具体实现。

Lambda 表达式可以认为是一种特殊的匿名内部类,Lambda只能用于函数式接口。

lambda语法如下:

     ([形参列表,不带数据类型]) -> {
         //执行语句
         [return..;]
     }

代码演示如下:

public class TestLambda {  
     public static void main(String[] args) {  
           TestLambdaInterface1 t1 = new TestLambdaInterface1() {  
                @Override  
                public void test() {  
                     System.out.println("使用匿名内部类");  
  
                }  
           };  
           
           //与上面的匿名内部类执行效果一样  
           //右边的类型会自动根据左边的类型进行判断  
           TestLambdaInterface1 t2 = () -> {  
                System.out.println("使用lambda");  
           };  
           t1.test();  
           t2.test(); 
     }
}

@FunctionalInterface  
interface TestLambdaInterface1 {  
     //不带参数的抽象方法  
     void test();  
}  

6、设计模式

单例模式

单例模式:确保一个类只有一个实例,并提供了一个全局访问点。

实现:

  • 使用一个私有静态变量、一个私有构造函数以及一个公有静态函数来实现。

  • 私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。

public class Singleton {

    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

代理模式

发布订阅模式

MVC 模式

7、Hibernate 的一级缓存、二级缓存

Session 的缓存被称为 Hibernate 的第一级缓存。SessionFactory 的外置缓存称为 Hibernate 的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory 的 内置缓存 存放元数据和预定义 SQL,SessionFactory 的内置缓存是只读缓存。

缓存的作用:

  • 减少数据库的访问频率,提高访问性能。

  • 保证缓存中的对象与数据库同步,位于缓存中的对象称为持久化对象。

8、ConcurrentHashMap 的 key 可不可以为 null ?

  • HashMap 可以允许插入 null key 和 null value

  • HashTable 和 ConcurrentHashMap 都不可以插入 null key 和 null value

9、线程池的线程命名

一、创建线程的时候没有传入名字

ThreadPoolManager.potatoPool.execute(new MyThread());  

在这种情况下,线程池会给线程自动命名,如果想改变线程的名称,那么需要在线程中的run方法中给线程setName。如下:

public class MyThread extends Thread{  
    public String threadName;  
    public MyThread (String threadName){  
        this.threadName=threadName;  
    }  
    
    @Override  
    public void run() {  
        Thread.currentThread().setName(threadName);  
    }  
  
}  

二、创建线程的时候直接传入名字

ThreadPoolManager.potatoPool.execute(new MyThread("aa"));  

10、Linux上安装好MySQL,只能本机访问,其他机器不能访问的问题

1、权限问题,修改权限

2、防火墙的原因,修改防火墙配置

11、线程池核心线程数(core) 和 最大线程数(max)

当所有的核心线程(core) 都在干活时,新添加的任务会被添加到队列中等待处理,如果队列满了,则新建非核心线程执行任务。

12、线程池捕获异常

public class CaptureUncaughtException {  
    public static void main(String[] args) {  
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());  
        ExecutorService exec = Executors.newCachedThreadPool();  
        exec.execute(new ExceptionThread2());  // ExceptionThread2 为任务对象
    }  
}  

/**  
 * MyUncaughtExceptionHandler:捕获线程异常处理的类,需要实现 UncaughtExceptionHandler 接口
 * @author nnngu  
 */  
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {  
    @Override  
    public void uncaughtException(Thread t, Throwable e) {  
        System.out.println(t+"捕获到了异常,异常处理的对象为:"+e); // e:抛出的对象 
    }  
}  

13、Mybatis 的 Mapper

参考:

为什么mybatis的mapper没有实现类(原理探究)

Mybatis中Mapper映射文件详解

14、Jsp和servlet ,jsp的 9大内置对象

Servlet 的生命周期:init、service(doGet、doPost)、destory

JSP 的九大内置对象:

内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext

JSP 的四大域对象:

对象
ServletContext context域
HttpServletRequet request域
HttpSession session域
PageContext page域

15、文件上传、socket、流

参考:

java文件上传和下载

16、Netty

参考:

Netty——基本使用介绍

17、集合

答:List、Set、Map

List 是有序的,可以有重复元素

Set 是无序的,不允许有重复元素

Map 是键值对

18、IO 和 NIO

参考:

Java NIO 系列教程

19、写在最后

最后,我发现面试官也有一些错误,在此也把它记录下来:

  • 面试官说 NIO 是 JDK 1.5 之后引入的。(其实 NIO 是 JDK 1.4 开始引入的)
  • 关于线程池的核心线程数(core) 和 最大线程数(max)的问题,面试官说当线程池里的线程数达到核心线程数(core) 时,新来了任务就会继续创建线程来处理。(其实当线程数达到核心线程数之后,新来的任务会加入队列等待处理,只有当队列满了才会继续创建线程)

先写到这里,以后有什么补充再更新。

本文永久更新地址:https://github.com/nnngu/LearningNotes/blob/master/_posts/2018-03-30-%E6%9F%90%E5%85%AC%E5%8F%B8(%E7%AE%80%E7%A7%B0SMKJ)%E9%9D%A2%E8%AF%95%E8%AE%B0%E5%BD%95.md

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,082评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,231评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,047评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,977评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,893评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,976评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,605评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,888评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,906评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,732评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,513评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,980评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,027评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,232评论 2 339

推荐阅读更多精彩内容

  • categories: Interviewdescription: 本文收集了一些经典的Java面试题 1、面向对...
    我是阿喵酱阅读 87,769评论 0 86
  • 今天上午有幸参加了厦门路小学积分制管理启动大会,会议中初老师精彩分享了《积分制管理理念与实操》 积分制的精髓和本质...
    尚源希妈妈阅读 188评论 0 0
  • 小时候,发现自己有种预知未发生事件的天赋。某天,对易经感兴趣,翻阅之下,匆匆合上,发誓年过60后才会再研究。 某次...
    吴若源1阅读 150评论 0 0
  • 今天师傅给6个师兄师姐升了段。我还要努力,Oss! 今日内容,完善理论学习,完善关键动作。 1.Trangle(三...
    姚问道阅读 627评论 0 0
  • Our story began in January 15th.為了找一個適合寫我和你之間的故事的軟件我找了好久,...
    jccccc阅读 205评论 0 0