[JAVA]面试的基本探讨1

一切都是数学函数。 Lambda 表达式的引入,主要采用了方法的重载机制+匿名类的方式

Runnable multiStatement = () -> {
            System.out.print("Hello");
            System.out.println(" World");
        };
        multiStatement.run();
复制代码

2.2.3 Stream

流是抽象的概念主要是对输入和输出操作的抽象。主要是数据源与程序的交互 设备可以是文件,网络,内存等。 流主要是包括字节流和字符流,方向包括输入流和输出流。

2.2.4 回调函数,函数式编程,面向对象之间区别

函数式语言:每次一个步骤方法会产生一个状态,这个状态会直接当参数传进下一步中。而不是使用全局变量。 而面向对象可以根据这个类/对象的全局和局部的状态传输

回调函数:就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

2.2.5 面向对象的三大特点,接口和抽象类区别?

  1. 三大特点::封装、继承、多态/抽象

2.2.6 集合类型主要有3种:set(集)、list(列表)和map(映射)。

2.2.7 ConcurrentHashMap

ConcurrentHashMap采用了分段的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。

2.2.8 volatile

volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量

2.2.9 java内存模型

[JAVA]面试的基本探讨1

2.2.10 ThreadLocal

线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。解决修改线程的功能

2.2.11 TCP 的通信机制

[JAVA]面试的基本探讨1

2.2.12 select & poll

都是IO多路复用的机制。 把用户态的数据复制到内核态

  • poll 解决select 的阻塞的方式,采用队列的机制,并且解决了select 对1G的大小
    [JAVA]面试的基本探讨1

2.2.13 Synchronized同步性与可见性

同步表示,要么一起成功,要么一起失败。 可见性表示:一个县城操作可以被其他的线程更新到。

2.2.14 Lock与synchronized 的区别

synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

2.2.15 锁的机制

[JAVA]面试的基本探讨1

2.2.16 CopyOnWriteArrayList

CopyOnWriteArrayList:CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的。

2.2.17 反射是否可以访问私有的方法

可以,但是要通过反射获取 获取Method和Field对象的时候一定要用getDeclaredField和getDeclaredMethod。反射的在编辑器中用的比较多。

2.2.18 32位系统的最大寻址空间

2的32次方大小的地址也就是4G。这就是为什么32位操作系统最大只有4个G的原因

2.2.19 判断二叉树是不是平衡二叉树(java)

如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

二叉树主要是用于搜索和排序。 B树就是根据二叉树繁衍而成的。

2.2.20 DNS解析过程 ,查看

[JAVA]面试的基本探讨1

2.2.21 进程间的通信方式

经常的通信方式,主要管道,信号量,消息队列,套接字,内存共享几种方式。

[JAVA]面试的基本探讨1

2.2.22 创建线程的三种方式

  1. 集成Thread
  2. 实现runable接口
  3. 调用callable接口 通过Callable和Future创建线程,Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值
    [JAVA]面试的基本探讨1

2.2.23 各种算法-分代(generational collecting) ,查看

分为:年轻代,老年代,持久代。

年轻代,分为三个区,一个 一个Eden区,2个Survivor区。 Eden存储大部分对象,如果Eden区满了,则分配到Survivier一个区。同理,如果Survier一个区满了,就放到另外一个Survier区。

老年代:存放从年轻代复制过的对象 持久代:用于存放静态文件。如java类和方法。

原文 

https://juejin.im/post/5d69e65ce51d4561bb33fb96

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » [JAVA]面试的基本探讨1

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址