大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林。

图片说明

众所周知,现场面试(包括视频面试)多数时候是没有白板,也就是说,对于你的知识点、项目经验、过往经历和个人介绍等等,都是靠一张嘴。所以考虑到这个情况,根据上次迷你版Java面试汇总,结合自己的错误理解,怕屁林在此推出无公害不会零添加的纯文字免流程图版Java面试系列--《飞越面试官》,让大家知道这事根本不可能。其他语言可选择出门向右或留下旁听。

图片说明

曾经有面试官问过我,什么是面向对象编程,我寻思我编程的时候我对象没坐我对面,怎么会这么问的?

图片说明

我说面向对象吧,需要说下什么是对象,对象的话好比是一个人,你,我,它之类的,不同的人是不同的对象,对象有姓名年龄身高体重这些属性,还有吃饭睡觉打机等等的行为,那么这类人在面向对象编程中,统称为类,人等于类,什么样的人,就相对于有什么样的类,所以面向对象编程,说的也是这个对象有什么属性和行为,编程就是一系列对象的属性和行为之间的交互。同时,面向对象编程还包括抽象继承多态封装,这些就不一一展开讲了。

图片说明

说下Java有哪些基本数据类型,这个就是十根手指头都能数得过,byte、short、int、long、float、double、有些用得少一下子说着会卡主、boolean、char。有些书上还void算是基本数据类型了,不过它什么都不代表。这些基本的数据类型对应有包装类,基本数据类型转包装类型就是装箱,包装类型转基本数据类型是拆箱。

图片说明

有什么内部类啊?静态内部类、成员内部类、局部内部类、匿名内部类。

那你知道重写有什么特别的么?就是修饰符要大于父类,抛出异常小于等于父类,返回值范围也要小于等于分类,按我理解,就是业务修饰符可以扩大,但风险就是异常要降低,开源节流返回的范围值要更小。

图片说明

    说下Java的内存模型!我不知道什么是Java的内存模型,是JVM吗?不是!卒。

    Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。而JMM就作用于工作内存和主存之间数据同步过程。他规定了如何做数据同步以及什么时候做数据同步。

图片说明

       String、StringBuffer和StringBuilder之间的区别?它们底层都是对char数组进行操作的。String是用final修饰的不可变字符串,所以每次加的时候都会生成新的String,JDK8之前String是放在方法区的变量池,JDK8及之后被放到了堆中的字符串常量池,所以不用new的话都会去常量池查找一下,存在的话就不生成新的了。StringBuffer和StringBuilder都是继承的AbstractStringBuilder,它们的内部方法可以对char数组组成的字符串可以进行各种操作,包括append等,不会像String那样生成新的对象,只有一个对象。其中StringBuffer的每一个方法都加了Synchroinzed修饰,所以他是线程安全的。在大量的字符串操作中,性能表现为StringBuilder,StringBuffer次之,String最后。

图片说明

    ArrayList和LinkedList的区别?ArrayList的底层是数组,初始化的时候会生成一个定长的数组,超过指定长度后会自动扩容,随机下标查询的时候最快,复杂度O1,但删除就要移动后面的数组向前,而LinkedList的底层是链表,随机下标查询肯定要慢些,因为要一个个移动,但是删除就很快,找到之后就直接通过指针移动,因为储存指针,也更占内存。

    为什么用Map的情况下,在一百个数里查找的时间和在一百万个数据里查找的时间是一样的。应该只是想说Hash算法吧,就是利用hash函数来做,并且解决冲突。可以说说list和set的查找吗, 感觉这个问题好奇怪,更觉得没有可比性,不回答。

    说说有哪些Queue,现在还记得有ArrayBlockingQueue, LinkedBlockingQueue,PriorityQueue这些还有的不容易记住。

    创建线程的方式有哪些?三种,第一个是继承Thread,第二个是实现Runable,第三个是实现Callable,这个可以和Future配合返回线程结果。

    try-catch有什么认识?用来捕抓异常的,当程序发生异常的时候可以被catch掉,然后在catch方法体里面可以做一些异常处理。同时还有一个finally,是在主体return之前执行的,一般用于关闭资源等操作。

    用过哪些package?lang、util、io、net、sql。。。

图片说明

    多线程用过吧?那你说下synchronized的原理?synchronized底层原理是借助JVM来实现的,当一个对象被锁的时候,会调用底层方法进行monit enter,这个实现对象头会标上线程标识,还有第几次加锁,这样可以让锁变得可重入,当锁释放的时候,会调用monit exit,也是一个悲观锁。它修饰在普通方法那里就是对对象加锁,修饰在静态方法就是对类加锁。后面它的优化加了偏向锁,自旋锁/适应性自旋锁,轻量级锁,锁粗化,锁消除。

图片说明

    ThreadLocal使用过吗?使用过的,例如平时单机服务器上验证完登录用户后,把用户信息存放在ThreadLocal中,需要用的时候可以直接get出来。ThreadLocal的作用就是为当前运行线程准备一个专属数据,其他线程访问不到,只有自己可以,也不会存在什么并发问题,但是用完记得要remove掉,因为key为弱引用,value不是,可能value不被GC会造成内存泄露或堆栈溢出。内存泄露?像栈底元素一直被引用着但又一直不用,map中key被改了hashcode,value就找不回了等等。

图片说明

    读者可以会觉得还有很多Java的内容没说到,JVM/JUC这些会有另外章节,后续大概思路会和前面的迷你版第一版Java面试知识点汇总类似。本章节如有补充,狠求留言。

第一版Java面试知识点汇总下载:https://pan.baidu.com/s/1MxKXIZtoBd57pTwTIDyrgA 提取码: 3arb。

相关阅读:

重磅!两万字Java面试知识点汇总发布!