HR:这么简单的面试题都不会

知了小姐姐2020-09-16894

嘿,小伙伴们,最近是不是找实习找工作找得焦头烂额?面试官的题怎么辣么难?这个解题思路我刚才怎么没想到?


别担心!知了小姐姐给你们整理了20道经典Java题!赶快拿出小本本,划重点!


01什么是快速失败的故障安全迭代器?


快速失败的Java迭代器可能会引发ConcurrentModifcationException在底层集合迭代过程中被修改。故障安全作为发生在实例中的一个副本迭代是不会抛出任何异常的。


快速失败的故障安全范例定义了当遭遇故障时系统是如何反应的。例如,用于失败的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。


02Java BlockingQueue是什么?


Java BlockingQueue是一个并发集合util包的一部分。BlockingQueue队列是一种支持操作,它等待元素变得可用时来检索,同样等待空间可用时来存储元素。


03Iterator和ListIterator的区别


●ListIterator有add()方法,可以向List中添加对象,而Iterator不能。


●ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。


●ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。


●都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。


04什么是CopyOnWriteArrayList?它与ArrayList有何不同?


CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。


CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁。


读和写之间的同步处理只是在写完后通过一个简单的'='将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用。绝对不会发生ConcurrentModificationException。


因此CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。


05迭代器和枚举之间的区别


小提示:如果面试官问这个问题,那么他的意图一定是让你区分Iterator不同于Enumeration的两个方面。


●Iterator允许移除从底层集合的元素。


●Iterator的方法名是标准化的。


06什么是标记接口?


标记接口是一个空的接口,没有任何方法,用于强制实现类中的某些功能。比较出名的标记接口有 Serializable 接口、Cloneable 接口。


07什么是三元运算符?


三元运算符是 if-then-else 语句的一个替换,示例如下:


result = testStatement ? value1 : value2;

(左右滑动查看完整代码)

08什么是垃圾回收?


垃圾回收(Garbage Collection,简称 GC)会查看堆内存,识别正在使用和未使用的对象,以及会自动删除未使用的对象,用来释放内存。


09什么是序列化和反序列化?


我们可以把一个 Java 对象转化成一个数据流,这被称为序列化。一旦对象被转化为数据流后,就可以将其保存到文件或者通过网络套接字发送。


如果一个对象实现了 Serializable 接口,就可以使用 java.io.ObjectOutputStream 将对象写入文件。


将数据流再转化为 Java 对象被称为反序列化。


10如何通过命令提示符运行 jar 文件?


可以通过 java 命令运行 jar 文件,但需要 jar 文件中有 main 方法。


11System 类有什么用?


System 类是 Java 的一个核心类,比较常用的就是 System.out.println()。


System 类是 final 的,因此我们不能通过继承来重写它的方法,System 类没有提供任何 public 的构造方法,因此无法实例化,它的所有方法都是 static 的。


12堆(heap)和栈(stack)有什么区别?


堆内存被应用程序的所有部分使用,而栈内存仅由执行线程使用。


当我们创建对象时,它始终存储在堆空间上;栈仅存储该对象的引用,栈内存还可以存储局部的基本类型数据变量。


栈的内存管理方式是 LIFO(后进先出)形式,而堆的内存管理方式更复杂。


13面向对象的特征


面向对象的三大特征:封装、继承、多态。


【封装】把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。


【继承】是对有着共同特性的多类事物,进行再抽象成一个类。这个类就是多类事物的父类。父类的意义在于抽取多类事物的共性。


【多态】允许不同类的对象对同一消息做出响应。方法的重载、类的覆盖正体现了多态。


14&和&&的区别


按位与, a&b 表示把a和b都转换成二进制数,再进行与的运算;


&和&&都是逻辑运算符号,&&又叫短路运算符


逻辑与,a&& b ,a&b 都表示当且仅当两个操作数均为 true时,其结果才为 true,否则为false。


逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true,整个表达式的值才是true。但是,&&之所以称为短路运算,是因为如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。


15Java中的IO流分为几种?


Java中的IO流分为两种:一种是字节流,另一种是字符流。


IO流分别由四个抽象类来表示(两输入两输出):InputStream,OutputStream,Reader,Writer。


16守护线程是什么?用什么方法实现守护线程?


守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在Java中垃圾回收线程就是特殊的守护线程。


17notify()和 notifyAll()有什么区别?


notify是唤醒一个处于该对象wait的线程,而notifyAll是唤醒所有处于该对象wait的线程。


但是唤醒不等于就能执行了,需要得到锁对象才能有权利继续执行,而锁只有一把,所以多个线程被唤醒时需要争取该锁。


18谈谈自定义注解的场景及实现


有这么一个业务场景,用Redis控制接口调用频率,有使用过自定义注解。


通过 AOP(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含自定义关键字注解,就通过Redis进行校验拦截请求。


19说说你熟悉的设计模式有哪些?


创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式(5种)


结构型模式:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式。(7种)


行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。(11种)

小提示:最好平时积累一下,单例模式(7种实现方式),工厂模式,模板方法设计模式,策略模式,装饰者模式、代理模式这几种怎么写吧~


20如何实现对象克隆?


实现 Cloneable 接口,重写 clone() 方法。


Object 的 clone() 方法是浅拷贝,即如果类中属性有自定义引用类型,只拷贝引用,不拷贝引用指向的对象。


对象的属性的Class 也实现 Cloneable 接口,在克隆对象时也手动克隆属性,完成深拷贝


结合序列化(JDK java.io.Serializable 接口、JSON格式、XML格式等),完成深拷贝


 长按识别二维码添加QQ群 

【2020知了堂“校招内推”就业特训营】

获取更多Java面试题




  • 培训费用

  • 上课方式

  • 开班时间

  • 就业情况