- 讲真。。不想招人就不要浪费彼此时间吧;
- 请不要做出做不到的承诺;
- 面试官面试的内容总得像看过我的博客和github吧;
- HR打电话前能不能提前发个邮件;
- 面试的内容内否不包括Spring等ChangeLog;
- 程序员的能力在于抽象问题并提供一个可能的解决方案,而不是工具或者代码的手抄员;
Sort
基本的冒泡(O(n^2)):
public static void bubbleSort(int[] arrays, int begin, int end)
{
assert arrays != null;
for (int i = begin; i < end; i++)
{
for (int j = begin; j < end; j++)
{
if (arrays[i] > arrays[j])
{
swap(arrays, i, j);
}
}
}
}
private static void swap(int[] arrays, int a, int b)
{
int t = arrays[a];
arrays[a] = arrays[b];
arrays[b] = t;
}
Java NIO
什么是NIO
new IO 或者none block IO
什么是通道(Channel)
一个对可以实现IO操作的抽象,任何类实现了channel,则表明可以往通道存放一些byte,然后不需要再去操心如何去实现。
几种通道的介绍
- ByteChannel(声明了这个Channel可以处理的是byte)
- ReadableByteChannel(声明了这是个只读的Channel)
- WriteableByteChannel(名字如其意义)
- SeekableByteChannel
- etc
视图
事实上channel也不是直接操作byte[],而是操作其中的包装对象xxxBuffer。当然多数情况下我们连byteBuffer都懒得操纵,我们对ByteBuffer也做了装扮(decorate),使之变成了ByteBuffer的一个View,我们称xxxx是xxx的视图(view),实质上是表明,底层一样,但是对外的语义变换了。
视图带来了好处就是能够以我们熟悉的语义来操纵对象,而避免脑中还要顺便转换成相应的byte[]结构。
结论
NIO带来了新的对IO操作的抽象,但是也仅仅是模型变换,除此之外,更多的非模型上而是工程上实际问题带来了改进,比如非阻塞式的访问(其实Stream模型也可以做到非阻塞式访问,只不过要根据这个模型来重新实现),还有Network到Network的转发可以不经过用户态而直接在内核态的进行转发避免上下文切换带来的CPU和内存带宽的消耗,等其他可能我还没了解到的特性
Java中的锁
java.util.concurrent.locks.ReentrantLock
提供了比synchronized提供更灵活的锁,可以设置为公平锁,非公平锁,能够带超时时间获取公平锁等等。
synchronized
Java默认提供,由JVM提供。但是因为JVM的黑盒子特性,锁特性会在运行中发生变化。
具体可以翻阅一下这篇文章
Java的优雅退出
简单而言就是JVM提供了一个钩子,能在JVM接受到关闭的信号量时候start一个线程,然后做一些清理工作,避免产生脏数据
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run()
{
scheduledExecutorService.shutdown();
}
});
字符串左移N位
第一种,简洁算法
根据矩阵运算中的可得
package com.liangyumingblog;
public class RollUpString
{
private String string;
public RollUpString(String s)
{
this.string = s;
}
public String rollup(int n)
{
StringBuilder s1 = new StringBuilder(string.substring(0, n));
StringBuilder s2 = new StringBuilder(string.substring(n + 1));
return s1.reverse().append(s2.reverse().toString()).reverse().toString();
}
}
Java官方HashMap实现
基本实现是Array+Linked实现的,
如果发现某个支链太长会将其变成红黑树。(才发现红黑树这个事情是1.8才加进入的。。我们以前上算法可都说过这个基本优化吧。。)
哈希值:
(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)
Spring解析xml
ApplicationContext:
这是一个标准的Spring程序的入口,用来加载上下文其实现类是:AbstractApplicationContext:
这里实现了对Spring上下文的生命周期的管理
AbstractXmlApplicationContext
解析xml使之成为Spring的上下文
ClassPathXmlApplicationContext,FileSystemXmlApplicationContext
寻找到具体的xml所在的磁盘或者classpath所在的位置
几个基本单位
1 byte=8bit
1 int=4 byte
1 long =8 byte
1 short=2 byte
1 float=2 byte
1 double = 8 byte
= =其实我想吐槽的是。。我压根分不清他们翻译成中文之后的关系。。。神特么非要推广专有名词的中文化
分布式系统CAP原理
一致性(Consistency):分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(Availability):集群出现故障节点后,是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(Partition tolerance):实际中通信产生延时。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C点和A点之间做出选择。