一切都是数学函数。 Lambda 表达式的引入,主要采用了方法的重载机制+匿名类的方式
Runnable multiStatement = () -> { System.out.print("Hello"); System.out.println(" World"); }; multiStatement.run(); 复制代码
流是抽象的概念主要是对输入和输出操作的抽象。主要是数据源与程序的交互 设备可以是文件,网络,内存等。 流主要是包括字节流和字符流,方向包括输入流和输出流。
函数式语言:每次一个步骤方法会产生一个状态,这个状态会直接当参数传进下一步中。而不是使用全局变量。 而面向对象可以根据这个类/对象的全局和局部的状态传输
回调函数:就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
ConcurrentHashMap采用了分段锁的设计,只有在同一个分段内才存在竞态关系,不同的分段锁之间没有锁竞争。相比于对整个Map加锁的设计,分段锁大大的提高了高并发环境下的处理能力。
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量
线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。解决修改线程的功能
都是IO多路复用的机制。 把用户态的数据复制到内核态
同步表示,要么一起成功,要么一起失败。 可见性表示:一个县城操作可以被其他的线程更新到。
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
CopyOnWriteArrayList:CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的。
可以,但是要通过反射获取 获取Method和Field对象的时候一定要用getDeclaredField和getDeclaredMethod。反射的在编辑器中用的比较多。
2的32次方大小的地址也就是4G。这就是为什么32位操作系统最大只有4个G的原因
如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
二叉树主要是用于搜索和排序。 B树就是根据二叉树繁衍而成的。
2.2.20 DNS解析过程 ,查看
经常的通信方式,主要管道,信号量,消息队列,套接字,内存共享几种方式。
2.2.23 各种算法-分代(generational collecting) ,查看
分为:年轻代,老年代,持久代。
年轻代,分为三个区,一个 一个Eden区,2个Survivor区。 Eden存储大部分对象,如果Eden区满了,则分配到Survivier一个区。同理,如果Survier一个区满了,就放到另外一个Survier区。
老年代:存放从年轻代复制过的对象 持久代:用于存放静态文件。如java类和方法。